2017-01-05 51 views
1

AWSでホストされているmosquittoブローカーを使用しています。私のクライアントはブローカーに接続しましたが、しばらくしてから切断されました。それは何度も起こります。MQTT:モスキートの切断

私は=真、クリーンセッション= AWS上でホストされている偽の、ユーザ名とパスワードなし、LWT =なし、ポート= 1883、IP =サーバーを維持し、= 2 QOSを渡し、クライアントID = timeStampに(常に一意)

ています

は、ここでそれがキープアライブpingパケットを処理できるようにするには、MQTTクライアントのネットワークループを開始する必要があり、私のcode--

import time 
import paho.mqtt.client as mqtt 

class MqttCommunication(object): 

    def __init__(self): 

     self.current_module = "Mqtt Communication class" 
     self.clientID = clientId 
     self.name = thread_name 

     self.DEBUG = True 
     self.MQTT_HOST = "" 
     self.MQTT_PORT = 1883 
     self.MQTT_USERNAME = "" 
     self.MQTT_PASSWORD = "" 
     self.MQTT_CLIENT_ID = self.clientID 
     self.MQTT_TOPIC = "" 
     self.MQTT_QOS = 0 
     self.MQTT_RETAIN = None 
     self.MQTT_CLEAN_SESSION = None 
     self.MQTT_LWT = "" 

     self.client = mqtt.Client(self.MQTT_CLIENT_ID,clean_session=self.MQTT_CLEAN_SESSION) 
     self.on_connect = None 
     self.on_disconnect = None 
     self.on_message = None 
     self.on_subscribe = None 
     self.on_unsubscribe = None 
     self.on_publish = None 
     self.client.on_connect = self.mqtt_on_connect 
     #self.client.on_message = self.mqtt_on_message 
     self.client.on_disconnect = self.mqtt_on_disconnect 
     self.client.on_subscribe = self.mqtt_on_subscribe 
     self.client.on_unsubscribe = self.mqtt_on_unsubscribe 
     self.client.on_publish = self.mqtt_on_publish 



    def connectHost(self,mqtt_host,mqtt_port,mqtt_username,mqtt_password): 
     self.MQTT_USERNAME = mqtt_username 
     self.MQTT_PASSWORD = mqtt_password 
     self.MQTT_HOST = mqtt_host 
     self.MQTT_PORT = mqtt_port 

     try: 
      self.client.username_pw_set(self.MQTT_USERNAME, self.MQTT_PASSWORD) 
      self.client.connect(self.MQTT_HOST,self.MQTT_PORT,60) 
      print self.MQTT_HOST 
      self.client.loop_start() 

     except Exception, e: 
      print "Error connecting to %s:%d: %s" % (mqtt_host, mqtt_port, str(e)) 

     return True 

    def disconnectHost(self): 
     self.client.disconnect() 
     return True 

    def mqttSettings(self,qos,mqtt_retain,mqtt_clean_session,mqtt_lwt): 
     self.MQTT_QOS = qos 
     self.MQTT_RETAIN = mqtt_retain 
     self.MQTT_CLEAN_SESSION = mqtt_clean_session 
     self.MQTT_LWT = mqtt_lwt 
     return True 

    def subscribeTopic(self,topic): 
     self.MQTT_TOPIC = topic 
     self.client.subscribe(self.MQTT_TOPIC, qos=self.MQTT_QOS) 
     return True 

    def unsubscribeTopic(self,topic): 
     self.client.unsubscribe(self.MQTT_TOPIC) 
     return True 

    def setClientId(self,clientID): 
     self.MQTT_CLIENT_ID= clientID 
     return True 

    def getClientId(self): 
     return self.MQTT_CLIENT_ID 

    def publishData(self,topic,message,qos): 
     self.client.publish(topic,message,qos) 
     return True 


    # The callback for when the client receives a CONNACK response from the server. 
    def mqtt_on_connect(self,client, userdata, flags, rc): 
     if rc == 0: 
      print "Connected to %s:%s" % (self.MQTT_HOST, self.MQTT_PORT) 
      time.sleep(3) 

     elif rc == 1: 
      print "Connection refused - unacceptable protocol version" 
     elif rc == 2: 
      print "Connection refused - identifier rejected" 
     elif rc == 3: 
      print "Connection refused - server unavailable" 
     elif rc == 4: 
      print "Connection refused - bad user name or password" 
     elif rc == 5: 
      print "Connection refused - not authorised" 
     else: 
      print "Connection failed - result code %d" % (rc) 



    # The callback for when a PUBLISH message is received from the server. 
    def mqtt_on_message(self , client, userdata, msg): 
     #print msg 
     print(msg.topic+" : "+str(msg.payload)) 

    def mqtt_on_disconnect(self, client, userdata, rc): 
     if rc != 0: 
      print("Unexpected disconnection.") 
     else: 
      print('hello from disconnect') 

    def mqtt_on_publish(self, client, userdata, mid): 
     """ 
     What to do when a message is published 
     """ 
     #print "publish" 


    def mqtt_on_subscribe(self,client, userdata, mid, granted_qos): 
     """ 
     What to do in the event of subscribing to a topic" 
     """ 
     #logging.debug("Subscribe with mid " + str(mid) + " received.") 


    def mqtt_on_unsubscribe(self, client, userdata, mid): 
     """ 
     What to do in the event of unsubscribing from a topic 
     """ 
     #logging.debug("Unsubscribe with mid " + str(mid) + " received.") 

共有するいくつかのログ---

1483617475: New connection from xx.xx.xx.xx on port 1883. 
1483617475: New client connected from xx.xx.xx.xx as mqttjs_bd875699 (c1, k10$ 
1483617718: Saving in-memory database to /var/lib/mosquitto/mosquitto.db. 
1483618131: Client 2017-01-05 17:27:18.963994 has exceeded timeout, disconnecti$ 
1483618131: Socket error on client 2017-01-05 17:27:18.963994, disconnecting. 
1483618810: Socket error on client mqttjs_bd875699, disconnecting. 
1483618854: New connection from xx.xx.xx.xx on port 1883. 
1483618854: New client connected from xx.xx.xx.xx as mqttjs_7aa97fd9 (c1, k10$ 
1483618865: Socket error on client mqttjs_7aa97fd9, disconnecting. 
1483618866: New connection from xx.xx.xx.xx on port 1883. 
1483618866: New client connected from xx.xx.xx.xx as mqttjs_25e2f297 (c1, k10$ 
1483618886: New connection from xx.xx.xx.xx on port 1883. 
1483618886: New client connected from xx.xx.xx.xx as 2017-01-05 17:51:23.51980$ 
1483619018: Socket error on client mqttjs_25e2f297, disconnecting. 
1483619019: New connection from xx.xx.xx.xx on port 1883. 
1483619019: New client connected from xx.xx.xx.xx as mqttjs_1c8ec6dd (c1, k10$ 
1483619023: Socket error on client mqttjs_1c8ec6dd, disconnecting. 
1483619024: New connection from xx.xx.xx.xx on port 1883. 
+0

これらのログのみのpythonコードから1つの切断を示し、他はすべてNodeJSプロセス – hardillb

答えて

2

です。

あなたは次の行を追加して、バックグラウンドでのループを開始します。

... 
def connectHost(self,mqtt_host,mqtt_port,mqtt_username,mqtt_password): 
    self.MQTT_USERNAME = mqtt_username 
    self.MQTT_PASSWORD = mqtt_password 
    self.MQTT_HOST = mqtt_host 
    self.MQTT_PORT = mqtt_port 

    try: 
     self.client.username_pw_set(self.MQTT_USERNAME, self.MQTT_PASSWORD) 
     print self.client.connect(self.MQTT_HOST,self.MQTT_PORT,60) 
     self.client.loop_start() # This line 
     print self.MQTT_HOST 

    except Exception, e: 
     print "Error connecting to %s:%d: %s" % (mqtt_host, mqtt_port, str(e)) 

    return True 

は次のとループを停止することができます:

def disconnectHost(self): 
    self.client.disconnect() 
    self.client.loop_stop() # This line 
    return True 
+0

ように見えるものからです申し訳ありませんが、コードを追加することは忘れてしまいます。私はloop_start()で試していますが、同じ問題が再び発生しています。ログが何を伝えているのか、なぜ切断されているのかを教えてください。 –

+0

クライアントがキープアライブ期間内にパケットを送信しなかったため切断されています。ネットワークループが実行されていないためです。 – hardillb

0

あなたはあなたの全体のコードを示していません。 特に、loop_foreverまたは にコードをブロックする方法を示していません。私はmosquitto -vの出力に乗る、と付け加えた場合 (私のclientIdがPAHOです):

1483629832: New connection from 192.9.200.14 on port 1883. 
1483629832: New client connected from 192.9.200.14 as PAHO (c0, k60). 
1483629832: Sending CONNACK to PAHO (0, 0) 
1483629895: Received PINGREQ from PAHO 
1483629895: Sending PINGRESP to PAHO 
+0

ブロックする必要はありません.client.start_loop()はループを実行するために別のスレッドを開始します – hardillb

関連する問題