【问题标题】:Sending Commands with MQTT - is there a pattern?使用 MQTT 发送命令 - 有模式吗?
【发布时间】:2023-03-21 07:09:01
【问题描述】:

我是 MQTT 的新手:但我有一些基本的 Python 程序可以运行,其中传感器读数可以发布到特定主题:然后其他客户端可以订阅以在事件驱动的基础上获取温度。

但是在发送命令时;我有点坚持最好的做法。

例如:取一个连接到 mqtt 的“倒数计时器”。

这个计时器有两种状态:“停止”和“开始”。 它将自己初始化为“停止”状态并等待“启动”命令;然后会倒计时;将当前倒计时发布到某个主题。 当倒计时归零时;它将再次将其状态切换为“停止”,并等待另一个“开始”命令。

如果它收到“停止”命令(通过 mqtt);它也应该进入“停止”状态。

所以也许我可以创建类似的主题:

countdown_timer/command
countdown_timer/state
countdown_timer/value

倒计时设备可以订阅“命令”并通过发布到“状态”来做出反应。 (“停止”还是“开始”?)

但是一旦处理了“命令”主题值,客户端是否应该以某种方式“使用”它?

或者最好有类似的东西:

countdown_timer/send_command
countdown_timer/command_result

在控制器发送命令的地方,订阅设备将执行命令并将“ok”或“error”放在“command_result”主题上?​​

【问题讨论】:

    标签: mqtt


    【解决方案1】:

    通常,您描述的两种方法都是有效的 MQTT 模式。您选择最适合您的应用程序的内容。以下是一些 cmets:

    • 对于您的倒计时,我会接受您的第一个建议。但对于其他应用,其他方法可能更有意义。
    • 如果您写信给countdown/statecountdown/value,您可能希望将这些发布消息保留。这将确保新订阅的客户端将立即收到最新的值。
    • 如果您的倒数计时器进程一直在运行,那么您不需要为countdown_timer/command 保留标志 --- 但有时当服务器进程失败时,重新启动并重新连接以继续执行最后一个命令是有意义的.
    • send_commandcommand_result 模式在 MQTT 中很常见,当一个客户端与一个服务器对话并为每个问题接收一个答案时。这似乎不太适合当前的示例:对于每个命令,您没有一个特定的答案要响应。
    • 这是客户端-服务器应用程序的另一种模式:服务器订阅一个频道server/command,每个客户端订阅一个单独的频道:client/1client/2client/3 等。当客户端发送命令时到服务器,它包括它的客户端 ID --- 并且服务器在相应的通道上响应。
    • 此模式的修改是使用独立通道进行命令查询:service/1service/2 等。第一个客户端发布到 service/1 并订阅到 client/1。第二个客户端发布到service/2 并订阅到client/2。服务端订阅service/#,从接收到的消息的主题名中提取客户端id,并响应对应的客户端通道。
    • 您会看到:MQTT 有许多有效的模式 --- 一方面,这种灵活性是一个优势。另一方面,它让您有责任做出明智的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-29
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多