我是 MQTT 的新手:但是我有一些基本的 Python 程序可以在其中将传感器读数发布到特定主题:然后其他客户端可以订阅以在事件驱动的基础上获取温度。
但是当涉及到发送命令时;我有点坚持最好地做到这一点。
例如:将“倒数计时器”连接到 mqtt。
这个计时器有“停止”和“开始”两种状态。它将自身初始化为“停止”状态并等待“开始”命令;然后会倒计时;将当前倒计时发布到主题。当倒计时到零时;它将再次将其状态切换为“停止”,并等待另一个“启动”命令。
如果它收到“停止”命令(通过 mqtt);它也应该进入“停止”状态。
所以也许我可以创建类似的主题:
countdown_timer/command
countdown_timer/state
countdown_timer/value
Run Code Online (Sandbox Code Playgroud)
倒计时设备可以订阅“命令”并通过发布到“状态”来做出反应。(“停止”还是“开始”?)
但是,客户端是否应该在处理完“命令”主题值后以某种方式“使用”它?
或者最好有类似的东西:
countdown_timer/send_command
countdown_timer/command_result
Run Code Online (Sandbox Code Playgroud)
控制器将在何处发送命令,订阅设备将执行该命令并在“command_result”主题上放置“ok”或“error”?
通常,您描述的两种方法都是有效的 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,并响应对应的客户端通道。