2016-03-06 56 views
3

我是MQTT的新手:但是我有一些基本的Python程序,可以将传感器读数发布到特定主题:其他客户可以订阅以事件驱动为基础获取温度。使用MQTT发送命令 - 是否有模式?

但是,当涉及到发送命令;我有点卡住最好做到这一点。

举个例子:把一个'倒数计时器'连接到mqtt。

这个定时器两个状态'停止'和'开始'。 它将自己初始化为'已停止'状态并等待'开始'命令;然后倒数;发布当前倒计时的话题。 倒数到零时;它会将状态再次切换为“停止”,并等待另一个“开始”命令。

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

所以也许我可以创建主题是这样的:

countdown_timer/command 
countdown_timer/state 
countdown_timer/value 

倒计时装置可以订阅“命令”,并通过发布到“国家”反应。 ('已停止'或'已启动')?

但是,客户端在处理完它之后应该“消耗”'命令'主题值吗?

还是会更好地碰到这样的:

countdown_timer/send_command 
countdown_timer/command_result 

在控制器会发出一个命令,在签约设备将运出命令,并把“OK”或“错误”的' command_result'主题?

回答

4

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

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