2017-04-04 2 views
2

私はIBM BlueMix上で動作するPythonで書かれたフラスコ・サーバーを持っています。私はこのサーバーにMQTTチャネルを聞いて、メッセージを受け取ったときにメッセージを公開したいと思っています。次のコードがありますが、on_connectとon_messageは決して呼び出されません。MQTTサブスクリプションのあるPython Flaskサーバー

app = Flask(__name__) 
def on_connect(client): 
    client.publish(topic2, "CONNECTED") 


def on_message(client, userdata, msg): 
    client.publish(topic2, "MESSAGE") 


@app.route('/') 
def hello_world(): 
    return 'Hello World! I am running on port ' + str(port) 

if __name__ == '__main__': 
    client = mqtt.Client() 
    client.username_pw_set(username, password) 
    client.on_connect = on_connect 
    client.on_message = on_message 
    client.connect('broker.example.com') 
    client.subscribe(topic) 
    client.publish(topic2, "STARTING SERVER") 

    app.run(host='0.0.0.0', port=port) 

私はclient.loopとclient.loop_foreverを試しましたが、動作しません。

EDIT:client.publish(topic2、 "STARTING SERVER")が動作していると、自分の資格情報が削除されます。あなたは

例えばconnect()機能で接続したいブローカーの詳細を渡す必要が

答えて

2

... 
client.on_message = on_message 
client.connect('broker.example.com') 
client.subscribe(topic) 
... 

EDIT:ネットワークループも開始する必要があります。これがフラスコのアプリだとすれば、バックグラウンドでループを開始したいので、loop_start関数を使用してください。

... 
client.connect('broker.example.com') 
client.loop_start() 
... 

、彼らが実行される前に確立されているために、接続を待つ必要があるとして、あなたはまた、on_connectコールバックにsubscribepublish呼び出しを移動する必要があります。

EDIT2:完全に動作するコードを追加:

from flask import Flask 
import paho.mqtt.client as mqtt 

app = Flask(__name__) 

topic = 'foo' 
topic2 = 'bar' 
port = 5000 

def on_connect(client, userdata, rc): 
    client.subscribe(topic) 
    client.publish(topic2, "STARTING SERVER") 
    client.publish(topic2, "CONNECTED") 


def on_message(client, userdata, msg): 
    client.publish(topic2, "MESSAGE") 


@app.route('/') 
def hello_world(): 
    return 'Hello World! I am running on port ' + str(port) 

if __name__ == '__main__': 
    client = mqtt.Client() 
    #client.username_pw_set(username, password) 
    client.on_connect = on_connect 
    client.on_message = on_message 
    client.connect('localhost') 
    client.loop_start() 

    app.run(host='0.0.0.0', port=port) 
+0

私はちょうど私のURLを隠し、これをしました。 client.publish(topic2、 "STARTING SERVER")は正常に動作していますが、on_connectとon_messageは呼び出されません。 – Yourivdzee

+0

答えを – hardillb

+0

loop_start()を試しましたが、on_messageメソッドが呼び出されていません – Yourivdzee

関連する問題