2016-12-28 8 views
0

私はpython mosquitto(paho)ライブラリを使用しています。私はUnexpected disconnection.の問題を抱えていました。 。私は問題を見つけることができません。 [Error 104]接続がピアによってリセットされることがあることがあります。 1883予期しない接続解除

予期せぬ切断を:私はXX.XX.XX.XXする

コネクテッド--- 私の誤差がある... Amazon Webサービス上で私のブローカーを開催しました。

XX.XX.XX.XXするコネクテッド

:1883

予期せぬ切断を。

XX.XX.XX.XX接続:1883

を私はQOS = 2を渡しています、保持=真、クリーンセッション=偽、いいえユーザー名とパスワード、LWT =なし、ポート= 1883、IP = AWS上でホストされているサーバー、クライアントID =

私のコードが含まれて出版社---

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) 
      print self.client.connect(self.MQTT_HOST,self.MQTT_PORT,60) 
      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() 
     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.") 

ログファイルからいくつかのログを共有する....

1483168399: Client publisher already connected, closing old connection. 
1483168399: Client publisher disconnected. 
1483168399: New client connected from xx.xx.xx.xx as publisher (c0, k60). 
1483168401: New connection from xx.xx.xx.xx on port 1883. 
1483168401: Client publisher already connected, closing old connection. 
1483168401: Client publisher disconnected. 
1483168401: New client connected from xx.xx.xx.xx as publisher (c0, k60). 
1483168404: New connection from xx.xx.xx.xx on port 1883. 
1483168404: Client publisher already connected, closing old connection. 
1483168404: Client publisher disconnected. 
1483168404: New client connected from xx.xx.xx.xx as publisher (c0, k60). 
1483168405: New connection from xx.xx.xx.xx on port 1883. 
1483168405: Client publisher already connected, closing old connection. 
1483168405: Client publisher disconnected. 
1483168405: New client connected from xx.xx.xx.xx as publisher (c0, k60). 
1483168408: New connection from xx.xx.xx.xx on port 1883. 
1483168408: Client publisher already connected, closing old connection. 
1483168408: Client publisher disconnected. 
1483168408: New client connected from xx.xx.xx.xx as publisher (c0, k60). 
1483168410: New connection from 27 
+1

このコードを使用して質問を更新すると、ライブラリをどのように使用しているかを知ることができます。また、すべてのクライアントが同じマシンまたはネットワーク – hardillb

+1

クライアントが接続されたら、クライアントとモスキートブローカー間のネットワークトラフィックを処理する必要があります。これにより、タイムアウトによって接続が切断されることがなくなります。だからパホを使用している場合は、 'self.client.connect(...)'関数を呼び出した後に 'self.client.loop_start()'を追加する必要があります。 – Hicaro

+0

@Hicaro私はそれを含めましたが、私は再び同じ問題に直面しています。 –

答えて

0

複数の接続が同じclient_idを使用しています。 client_idを一意にする必要がある場合、ブローカは一度に1つのclient_idで1つの接続のみを許可し、新しい接続が形成されるとブローカから最も古いものを解放します。再接続ロジックがあれば、古いクライアントは新しいクライアントを起動させようとする再接続を試行し、再接続します。これは、クライアントがブローカへの接続を維持することを管理していないフィードバックの外観に終わります。

ログから「パブリッシャー」にclient_idをハードコードしているようですが、これは一意の値に変更する必要があります。通常、「pub_」のようなプレフィックスに設定してから乱数を追加します、タイムスタンプまたはその他の識別子(例:コード番号/名前)

+0

私もそれを試みました。今私はmosquittoログテーブルからこのエラーを取得しています。 1483418758:クライアントmqttjs_e0cbe1aのソケットエラー。切断中です。 1483418793:クライアント2017-01-03 09:54:40.930093がタイムアウトを超えました。disconnecti $ 1483418793:クライアント2017-01-03 09:54:40.930093のソケットエラー、切断中です。 1483418822:ポート1883のxx.xx.xx.xxからの新しい接続。 –

+0

これは別の問題です。ネットワークループにとどまっていない可能性が高いためです。更新されたコードとログ出力で新しい質問をする – hardillb

関連する問題