我是MQTT的新手:但我有一些基本的Python程序可以将传感器读数发布到特定主题:然后其他客户可以订阅以事件为基础获取温度。
但是当涉及到发送命令时;我有点坚持做到这一点。
例如:将一个'倒计时器'连接到mqtt。
此计时器有两个状态'已停止'和'已启动'。 它会将自己初始化为“已停止”状态并等待“启动”命令;然后倒数将当前倒计时发布到主题。 当倒计时到零时;它会再次将状态切换为“已停止”,并等待另一个“启动”命令。
如果收到“停止”命令(超过mqtt);它也应该进入“停止”状态。
所以也许我可以创建类似的主题:
countdown_timer/command
countdown_timer/state
countdown_timer/value
倒计时设备可以订阅'命令'并通过发布到'状态'来做出反应。 ('停止'或'开始'?)
但是,如果客户端在处理完它''命令'主题值后会以某种方式'消耗'吗?
或者更喜欢这样的东西:
countdown_timer/send_command
countdown_timer/command_result
如果控制器发送命令,订阅设备会执行命令并在'command_result'主题上加上'ok'或'error'?
答案 0 :(得分:4)
通常,您描述的两种方法都是有效的MQTT模式。您可以选择最适合您的应用程序。以下是一些评论:
countdown/state
和countdown/value
,您可能希望将这些发布消息保留。这将确保新订阅的客户端将立即收到最新值。countdown_timer/command
的保留标志---但有时在服务器进程失败,重新启动并重新连接时才有意义继续用最后一个命令。send_command
和command_result
模式对于MQTT是常见的。这似乎不适合当前的例子:你没有一个特定的答案来回应每个命令。server/command
,每个客户端订阅一个单独的频道:client/1
,client/2
,client/3
当客户端向服务器发送命令时,它包含其客户端ID ---服务器在相应的通道上响应。service/1
,service/2
等。第一个客户发布到service/1
并订阅client/1
。第二个客户发布到service/2
并订阅client/2
。服务器订阅service/#
,从收到的消息的主题名称中提取客户端ID,并响应相应的客户端通道。