我有两个单独的文件用于发布和订阅来测试 mqtt 协议(protocol)。我维护一个配置文件来存储常见参数,例如client_id、经纪商名称和主题。
config.py
broker = "iot.eclipse.org"
# Random alphanumeric string
uid = "id-sfgjrs45ys4jQPlk"
appliances = {
"room1": [
"appliance1",
"appliance2",
"appliance3",
"appliance4",
"appliance5"
],
"room2": [
"appliance1",
"appliance2",
"appliance3"
]
}
订阅者.py
import time
import paho.mqtt.client as mqtt
import config
broker = config.broker
client_id = config.uid
topics = list()
for room, appliances in config.appliances.items():
for appliance in appliances:
topics.append(room + "/" + appliance)
def on_message(client, userdata, message):
print("Topic: " + message.topic)
print("Message: " + message.payload.decode('utf-8'))
client = mqtt.Client(client_id=client_id)
client.on_message = on_message
print("Connecting to broker... " + broker)
client.connect(broker)
print("Subscribing ")
for topic in topics:
client.subscribe(topic)
print("Listening")
client.loop_forever()
publisher.py
import time
import paho.mqtt.client as mqtt
import config
broker = config.broker
client_id = config.uid
topic = "room1/appliance1"
message = "off"
client = mqtt.Client(client_id=client_id)
print("Connecting to broker... " + broker)
client.connect(broker)
print("Publishing ")
client.publish(
topic=topic,
payload=message
)
time.sleep(1)
client.disconnect()
如果 subscriber.py 和 publisher.py 保存在同一个文件中,它们似乎工作正常,例如:
client.loop_start()
client.publish(
topic=topic,
payload=message
)
time.sleep(10)
client.loop_stop()
以下是两者执行时的日志:
publisher.py 日志
(在订阅者.py 运行时运行)
Connecting to broker... iot.eclipse.org
Publishing
Sending PUBLISH (d0, q0, r0, m1), 'b'room1/appliance1'', ... (3 bytes)
Sending DISCONNECT
记录 subsciber.py
Connecting to broker... iot.eclipse.org
Sending CONNECT (u0, p0, wr0, wq0, wf0, c1, k60) client_id=b'id-sfgjrs45ys4jQPlk'
Subscribing
Sending SUBSCRIBE (d0, m1) [(b'room1/appliance1', 0)]
Sending SUBSCRIBE (d0, m2) [(b'room1/appliance2', 0)]
Sending SUBSCRIBE (d0, m3) [(b'room1/appliance3', 0)]
Sending SUBSCRIBE (d0, m4) [(b'room1/appliance4', 0)]
Sending SUBSCRIBE (d0, m5) [(b'room1/appliance5', 0)]
Sending SUBSCRIBE (d0, m6) [(b'room2/appliance1', 0)]
Sending SUBSCRIBE (d0, m7) [(b'room2/appliance2', 0)]
Sending SUBSCRIBE (d0, m8) [(b'room2/appliance3', 0)]
Listening
Received CONNACK (0, 0)
Received SUBACK
Received SUBACK
Received SUBACK
Received SUBACK
Received SUBACK
Received SUBACK
Received SUBACK
Received SUBACK
Sending PINGREQ
Received PINGRESP
Sending PINGREQ
Received PINGRESP
Sending CONNECT (u0, p0, wr0, wq0, wf0, c1, k60) client_id=b'id-sfgjrs45ys4jQPlk'
Received CONNACK (0, 0)
我无法弄清楚我做错了什么,以至于订阅者无法收到我的消息。
最佳答案
这是因为您尝试从具有相同客户端 ID uid
的两个单独代码进行连接。
根据规范here
Each Client connecting to the Server has a unique ClientId.
尝试使用不同的客户端 ID,代码应该可以正常工作
关于python - paho-mqtt 发布-订阅无法在 Python 中的单独文件中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56283525/