当 qos 设置为 2 时,mqtt 不会将数据发布到代理上
mqtt not publishing data onto the broker when qos set to 2
client.publish("topic", payload,qos=2) 没有将数据发布到代理上,而同样适用于 qos=0 并且 1.I 没有定义持久性,它已设置为默认值。
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()
我已经删除了所有其他功能,以便大家更好地理解。
您需要启动 MQTT 客户端网络循环。这是为了处理 QOS 2 消息传递的多步握手。
python Paho 客户端有 3 种方式 运行 loop。
- 您可以通过调用
client.loop_start()
在后台线程上启动循环
- 您可以在当前线程上启动循环,然后它将永远阻塞
client.loop_forever()
- 您可以通过定期调用
client.loop()
来 运行 循环在您自己的循环中执行的任务
您选择哪一个取决于您的代码还做什么,但我怀疑在后台线程上启动循环可能是最好的。
client.publish("topic", payload,qos=2) 没有将数据发布到代理上,而同样适用于 qos=0 并且 1.I 没有定义持久性,它已设置为默认值。
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()
我已经删除了所有其他功能,以便大家更好地理解。
您需要启动 MQTT 客户端网络循环。这是为了处理 QOS 2 消息传递的多步握手。
python Paho 客户端有 3 种方式 运行 loop。
- 您可以通过调用
client.loop_start()
在后台线程上启动循环
- 您可以在当前线程上启动循环,然后它将永远阻塞
client.loop_forever()
- 您可以通过定期调用
client.loop()
来 运行 循环在您自己的循环中执行的任务
您选择哪一个取决于您的代码还做什么,但我怀疑在后台线程上启动循环可能是最好的。