【问题标题】:mqtt not publishing data onto the broker when qos set to 2当 qos 设置为 2 时,mqtt 未将数据发布到代理
【发布时间】:2018-07-07 22:18:18
【问题描述】:

client.publish("topic", payload,qos=2) 不向代理发布数据,而 qos=0 和 1 也一样。我没有定义持久性,它设置为默认值。

import paho.mqtt.publish as publish

import paho.mqtt.client as mqtt

from random import *

import time
MQTT_IP='192.168.0.23'
MQTT_PORT=1883
global client
import datetime
def on_connect(client, userdata, flags, rc,qos):

    if rc==0:
        print("MQTT CONNECTION ESTABLISHED")
    print(str(client)+'\n'+str(userdata))
        
def on_message(client, userdata, msg):
    print("Message arrived from "+str(client))
    print(msg.topic+" "+str(msg.payload))

def MQTT_CONNECTION():
    global client
    global MQTT_CLIENT_CONNECTED
    try:
        print("IN mqtt connection")
        client = mqtt.Client()
        client.connect(MQTT_IP,MQTT_PORT)
        client.on_connect = on_connect
        client.on_message = on_message
        MQTT_CLIENT_CONNECTED=True

    except Exception as error:
        print("ERROR IN MQTT CONNECTION",error)
        MQTT_CLIENT_CONNECTED=False
def publish():
    global client
    client.publish("1/MB/EM/3/21/IB",2,qos=2,retain=True)    

if __name__=="__main__":
    MQTT_CONNECTION()
    publish()

我已经删除了所有其他功能,以便大家更好地理解。

【问题讨论】:

  • 您需要显示更多代码,以便我们在上下文中看到它,
  • @hardillb 我已经更新了代码供您参考

标签: persistence mqtt qos


【解决方案1】:

您需要启动 MQTT 客户端网络循环。这是为了处理 QOS 2 消息传递的多步骤握手。

python Paho 客户端有 3 种方式来运行 loop

  1. 您可以通过调用client.loop_start() 在后台线程上启动循环
  2. 您可以在当前线程上启动循环,然后使用client.loop_forever() 永久阻塞
  3. 您可以通过定期调用client.loop() 来运行循环在您自己的循环中执行的任务

你选择哪一个取决于你的代码还在做什么,但我怀疑在后台线程上启动循环可能是最好的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多