python - paho-mqtt 发布-订阅无法在 Python 中的单独文件中工作

标签 python python-3.x mqtt publish-subscribe paho

我有两个单独的文件用于发布和订阅来测试 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.pypublisher.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/

相关文章:

python-3.x - 为什么 QtWidgets.QApplication 需要 sys.argv?

python - 我们如何强制为魔术方法(特殊方法)调用 getattribute() ?

amazon-web-services - Solace mqtt 连接失败日志

python - 即使我的 MQTT 客户端未连接,我如何继续我的程序运行?

python - 如何使用正则表达式和 Pandas 创建月份和年份列

Python - 将一个对象的属性复制到另一个对象的正确方法是什么?

python-3.x - 如何使用Python告诉客户端服务器中不存在文件

android - React Native 上的 MQTT?

Python Win32Com & Excel.Application 无法保存在调度程序上

python - text.usetex : True in matplotlib 有什么好处