使用MQTT发送命令 - 是否有模式?

时间:2016-03-06 00:04:01

标签: mqtt

我是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'?

1 个答案:

答案 0 :(得分:4)

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

  • 对于你的倒数计时器,我会提出你的第一个建议。但对于其他应用程序,其他方法可能更有意义。
  • 如果您写信至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有许多有效的模式 - 一方面,这种灵活性是一个优势。另一方面,它明智地选择了你的责任。