MQTT订阅者知道谁是发布者

MQTT订阅者知道谁是发布者,mqtt,Mqtt,从我在MQTT协议中读到的内容来看,它似乎不支持在已发布的消息上告诉发布者是谁。但MQTT订阅者是否可能知道消息来自哪个发布者 一个“msg.publisher”的解决方案可能吗 #!/usr/bin/env python import mosquitto def on_message(mosq, obj, msg): print "Publisher: %s, Topic: %s, "Msg: %s" % (msg.publisher, msg.topic, msg.payload)

从我在MQTT协议中读到的内容来看,它似乎不支持在已发布的消息上告诉发布者是谁。但MQTT订阅者是否可能知道消息来自哪个发布者

一个“msg.publisher”的解决方案可能吗

#!/usr/bin/env python
import mosquitto

def on_message(mosq, obj, msg):
    print "Publisher: %s, Topic: %s, "Msg: %s" % (msg.publisher, msg.topic, msg.payload)

cli = mosquitto.Mosquitto()
cli.on_message = on_message

cli.connect("127.0.0.1", 1883, 60)

cli.subscribe("dns/all", 0)
cli.subscribe("nagios/#", 0)

while cli.loop() == 0:
    pass

没错,MQTT规范在发布数据包中没有字段来指定某个消息来自哪个发布者

我可以想到两种可能的“变通”实现:

1) 在消息的有效负载中添加发布者信息。应用程序级解析将允许您从消息负载中检索发布者ID

2) 在主题中添加发布者信息。你可以编造一个聪明的主题层次结构和一个专门针对出版商的级别

例如:数据/
然后,您的订阅者可以订阅data/+并解析最后一级以检索发布者ID。

Pierre Luc的回答完全正确,但我要补充的是,发布者未公开的原因是MQTT不是一个点对点消息传递协议,它是基于主题的。理想情况下,您的应用程序逻辑应该基于主题,而不是单个发布者和订阅者是谁。是的,我也在考虑将发布者唯一标识符或ClientId嵌入主题中。这有助于确定是谁通过这种方式发送消息-mosquitcho.py不再维护,您应该改用paho python。