2016-04-05 7 views
2

3秒ごとにサンプルメッセージを発行するRaspberry Piの簡単なスクリプトがあります。私は、コールバックon_connect、on_publish、on_disconnectを宣言しました。このクライアントは正常に接続されますが、on_connectは呼び出されず、publishされ、on_publishが呼び出され、disconnectsおよびon_disconnectが呼び出されます。Paho Python MQTTクライアントは正常に接続されますが、on_connectコールバックは呼び出されません。

は、これが私のスクリプト

import paho.mqtt.client as mqtt 
import time 

def on_connect(mqttc, userdata, rc): 
    print("Connected with result code "+str(rc)) 
    if rc!=0 : 
     mqttc.reconnect() 

def on_publish(mqttc, userdata, mid): 
    print "Published" 

def on_disconnect(mqttc, userdata, rc): 
    if rc != 0: 
     print("Unexpected disconnection. Reconnecting...") 
     mqttc.reconnect() 
    else : 
     print "Disconnected successfully" 

# Setup MQTT 
# broker='test.mosquitto.org' 
broker = 'iot.eclipse.org' 
broker_port=1883 

# Create a client instance 
mqttc=mqtt.Client(client_id="MyClient") 
mqttc.on_connect = on_connect 
mqttc.on_publish = on_publish 
mqttc.on_disconnect = on_disconnect 

while 1: 

    mqttc.connect(broker, broker_port, 60) 
    # print "Connected." # I don't want this message. 
          # Why isn't the on_connect callback invoked? 

    try: 
     topic = "this/is/a/test/topic" 
     payload = "test_message" 
     print "Publishing " + payload + " to topic: " + topic + " ..." 
     mqttc.publish(topic, payload, 0) 

    except Exception as e: 
     print "exception" 
     log_file=open("log.txt","w") 
     log_file.write(str(time.time())+" "+e.__str__()) 
     log_file.close() 

    mqttc.disconnect() 
    print "" 
    time.sleep(3) 

で、このマイナーな「バグ」は私が達成したいものを主にあるメッセージの公開を、影響はありませんが、なぜそれが起こるんし、どのように私はそれを解決することができますか?

答えて

3

これが機能していない理由は、あなたがloop*()関数のいずれかを呼び出していないことです。これらはネットワークトラフィックを処理します。あなたが1つを使用しない場合、あなたの送信メッセージが送信される保証はなく、入ってくるメッセージは絶対に処理されません。

loop_forever()は、ネットワークループを処理ブロッキング呼び出しです - おそらくない何をしたいです。

loop_start()

は、ネットワークループを処理するためのスレッドを開始し、そうすぐに返します。

私はこれを行うだろう:@Kiranが言うよう

mqttc.connect(broker, broker_port, 60) # Don't forget to handle errors 
mqttc.loop_start() 

while 1: 
    try: 
     topic = "this/is/a/test/topic" 
     payload = "test_message" 
     print "Publishing " + payload + " to topic: " + topic + " ..." 
     mqttc.publish(topic, payload, 0) 

    except Exception as e: 
     print "exception" 
     log_file=open("log.txt","w") 
     log_file.write(str(time.time())+" "+e.__str__()) 
     log_file.close() 

    print "" 
    time.sleep(3) 

あなたはまだあなたのon_connectコールバックを修正する必要があります。

毎回切断する必要はなく、実際に切断したときにメッセージが送信されるという保証はありません。メッセージがいつ送信されるかを知るには、on_publishコールバックを使用する必要があります。

あなたは、簡単な接続・パブリッシュ・切断を行いたい場合は、多分paho.mqtt.publishヘルパーモジュールを使用します。

import paho.mqtt.publish as publish 

while 1: 
    try: 
     topic = "this/is/a/test/topic" 
     payload = "test_message" 
     print "Publishing " + payload + " to topic: " + topic + " ..." 
     publish.single(topic, payload, 0, host=broker, port=broker_port) 

    except Exception as e: 
     print "exception" 
     log_file=open("log.txt","w") 
     log_file.write(str(time.time())+" "+e.__str__()) 
     log_file.close() 

    print "" 
    time.sleep(3) 
1

on_connect()メソッドの宣言にフラグ1)パラメータがありません。だから、それは呼び出されていません。 Flagsパラメータには、ブローカから送信された応答が含まれています。それは

def on_connect(mqttc, userdata, flags, rc): 

である必要がありますまた、あなたはループで接続していると切断していますか?接続ドロップ(example)の自動再接続を処理するloop_start()loop_stop()の方法を試してみてください。

+0

私は現在、(例では1ではない)を使用していますブローカの最大値を扱うことができます接続されているクライアントの数。データを定期的に送信するクライアントが増えているため、connect-send-disconnectの背後にあるロジックは、より多くのものをブローカに接続できるようにすることです。 – evgi9

+0

@ evgi9そのために、グローバルヘルパー関数([1](https://pypi.python.org/pypi/paho-mqtt/1.1#single)も使用できます) – Kiran

関連する問題