蚊子意外断开 [英] MOsquitto unexpected disconnection

查看:123
本文介绍了蚊子意外断开的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用python mosquitto(paho)库.我遇到了Unexpected disconnection.的问题,我发现它不断掉线并与服务器建立连接. .我找不到问题.有时它显示[Error 104]连接被对等方重置.我将经纪人托管在亚马逊网络服务上. 我的错误是---

I am using python mosquitto(paho) library. I got the problem of Unexpected disconnection. I found constantly dropping and connection with the server. . I am unable to find the problem. some times it shows [Error 104] connection reset by peer. I hosted my broker on amazon web services... my error is ---

已连接到xx.xx.xx.xx:1883

Connected to xx.xx.xx.xx:1883

意外断开连接.

已连接到xx.xx.xx.xx:1883

Connected to xx.xx.xx.xx:1883

意外断开连接.

已连接到xx.xx.xx.xx:1883

Connected to xx.xx.xx.xx:1883

我正在传递QOS = 2,保留= true,干净会话= false,没有用户名和密码,lwt =无,端口= 1883,ip =服务器托管在aws上,客户端id =发布者

I am passing QOS=2, retain = true, clean session =false, no username and password, lwt =none , port= 1883, ip = server hosted on aws, client id = publisher

我的代码包括---

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.")

从日志文件共享一些日志....

sharing some logs from log file....

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

推荐答案

您使用相同的client_id具有多个连接. client_id必须是唯一的,代理一次仅允许与一个client_id进行一次连接,并且在形成新连接时将最旧的一个从代理中踢出.如果您具有重新连接逻辑,则旧客户端将尝试重新连接,这将使新客户端开始运行,这将以反馈的形式结束,而没有客户端设法保持与代理的连接.

You have multiple connections using the same client_id. client_id's have to be unique, the broker will only allow one connection with a client_id at a time and will kick the oldest one off the broker when a new connection is formed. If you have reconnection logic in place then the old client will try and reconnect which will kick the new client off, this ends up in a feed back look with no client managing to stay connected to the broker.

您似乎已将日志中的client_id硬编码为"publisher",因此需要将其更改为唯一值,通常我会将a设置为类似于"pub_"的前缀,然后添加一个随机数,时间戳或其他标识符(例如,广告编号/名称)

It looks like you have hard coded your client_id to "publisher" from the logs, this needs to be changed to be a unique value, normally I would set a to a prefix like "pub_" then add on a random number, a timestamp or some other identifier (e.g. thead number/name)

这篇关于蚊子意外断开的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆