2016-03-06 32 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有許多有效的模式---一方面,這種靈活性是一個優勢。另一方面,它會讓你有責任明智地選擇。