【问题标题】:MQTT Client keeps on diconnectingMQTT 客户端不断断开连接
【发布时间】:2018-02-16 13:41:10
【问题描述】:

我有多个 python 文件。一个文件包含与 MQTT 相关的所有代码并具有一些功能,而另一个文件导入 MQTT 文件并在事件发生时调用函数。 MQTT 文件只发布一​​些 QoS 0 和一些 QoS 1 的消息,并连接到安装在本地机器上的 mosquitto 代理。 MQTT代码如下

import paho.mqtt.client as mqtt
from threading import current_thread
import datetime
import cv2 as cv2
import time

# Define Variables
MQTT_HOST = "127.0.0.1"
MQTT_PORT = 1883
MQTT_KEEPALIVE_INTERVAL = 60


def send_something():
    try:
        mqttc.publish("topic", "hello", 1, False)  # QoS =1 Retain = False
    except Exception as e:
        print(str(e))          
def send_something_else():
    mqttc.publish("anothertopic", CombinedByteArr, 0, False) 
            
            
def on_connect(mqttc, userdata, flags, rc):    
    print("[INFO]  : MQTT : Connection returned result: " + mqtt.connack_string(rc))
    if(rc == 0):
        print("[INFO]  : MQTT : Connection Successful")
    else:
        print(rc)

def on_disconnect(mqttc, userdata, rc):
    if rc != 0:
        print(" Unexpected disconnection")
    while(True):
        try:
            print("Trying to Reconnect")
            mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)
            break
        except:
            print("Error in Retrying to Connect with Broker")
            continue

# Initiate MQTT Client

ThreadID = str(current_thread().ident)
mqttc = mqtt.Client(client_id= ThreadID, clean_session=False)


mqttc.on_publish = on_publish
mqttc.on_connect = on_connect
mqttc.on_message = on_message
mqttc.on_disconnect = on_disconnect

while(True):
    try:
        mqttc.connect(MQTT_HOST, MQTT_PORT, MQTT_KEEPALIVE_INTERVAL)
        print("[INFO]  : MQTT : MQTT Connect Complete")
        break
    except:
        print("ERROR Occurred")


mqttc.loop_start()  # Start A Thread

我运行了多个 python 文件,这意味着运行了多个 MQTT 副本。在 mosquitto 日志中,它总是显示客户端继续断开连接然后重新连接。一段时间后,我在蚊子日志中不断得到这些:-

1518788230: New client connected from 127.0.0.1 as MQTT2225 (c0, k60).
1518788230: Sending CONNACK to MQTT2225 (0, 0)
1518788230: Socket error on client MQTT2225, disconnecting.

【问题讨论】:

  • 只是想知道import cv2 as cv2的意义何在
  • 客户端 ID 为 MQTTxxxx 的 MQTT 文件也一直给出相同的结果。我对循环还有另一种困惑。当我将此文件导入单独的 python 文件时,此文件是否在运行后退出。我是否必须调用 mqttc.loop_stop()。此文件旨在永久运行
  • @jlandercy 我有一些我在发布时使用的 opencv 函数,我已经从这段代码中删除了这些函数
  • 如果客户端 ID 始终相同,那么最后一个客户端(具有相同 ID)将始终断开连接。

标签: python mqtt mosquitto paho disconnection


【解决方案1】:

您需要将mqttc.loop_start() 更改为mqttc.loop_forever() 以阻止程序在启动后台线程后退出。

编辑:再考虑一下,问题不是循环,而是客户端 ID

假设您始终实例化您从主线程提供的代码中描述的对象的实例,那么线程 ID 将始终相同,这意味着代理将踢除最后一个实例之外的所有实例以进行连接。

而且由于您有逻辑在一个紧密的循环中重新连接,只要您有多个 MQTT 客户端,它们将始终保持相互启动

【讨论】:

  • 那么mqttc.loop_start()的用途/用途是什么?
  • 我试过了,但这会导致其他文件(主文件)暂停。主文件调用函数为 MQTT.send_something()
  • @RickTeachey 它是为您之后开始自己的事件循环时使用的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多