MQTT發布/訂閱消息機製在Arduino傳感節點的實現
科技發展
作者:張波 楊國華
【摘要】本文介紹一種全新的物聯網通信協議——基於發布/訂閱範式的消息隊列遙測傳輸協議的原理、組成和實現。研究在計算和通信能力受限的基於單片機的物聯網節點上,實現基於MQTT的數據傳遞。
【關鍵詞】消息隊列遙測傳輸協議;發布/訂閱傳遞機製;基於主題
在設計和部署物聯網應用係統時,選擇高效、低資源占用的消息傳遞協議是係統架構設計關鍵一步。設計人員看到太多的通信協議,它們存在一些差別,而傳感節點提供僅能夠提供非常有限的計算能力、低可靠的通信鏈路和有限的電池電量,消息服務器通常部署在雲端。本文討論一種適應物聯網通信需要的輕量級可靠消息傳遞協議——MQTT,並介紹以8位單片機為傳感節點的係統實現。
1.MQTT簡介
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸,以下簡稱MQTT)是IBM和Eurotech開發的一個發布/訂閱模式通信協議。MQTT建立在TCPIP上,為計算能力有限,且工作在低帶寬、不可靠的網絡的遠程傳感器和控製設備通訊而設計的協議,是物聯網的重要通信協議之一。
MQTT可以在支持TCPIP的不同類型設備上實現,例如:計算機、移動設備(智能手機、平板、PDA)、計算機能力有限的傳感節點等;可以不用OS或者在不同OS環境下實現,包括:Windows、Linux、Android等;MQTT組織提供不同語言的開發包,目前已有C、JAVA、Python等;MQTT可以在帶寬受限的不可靠通信網絡實現數據在數據生產者和使用者間有效傳輸。
本文研究MQTT在Arduino單片機開發板上的實現,描述MQTT實現傳感數據網絡傳輸的原理、組成和方法。MQTT建立在Arduino上。消息生產者與接收者之間保持低耦合性。
2.發布/訂閱消息傳遞機製
發布/訂閱(Publish/subscribe或pub/sub)是一種消息範式,在這種機製下,多個發布應用(消息生產者)和多個訂閱應用(消息消費者)通過建立在代理服務中的特定主題作為中介互相通信。生產者與消費者間不需要通過TCP建立直接的通信連接,發布的消息進入一個先入先出的隊列;訂閱者對一個或多個類別表達興趣,於是隻接收感興趣的消息,而不需要知道什麼樣的發布者發布的消息。這種發布者和訂閱者的解耦解耦可以允許更好的可擴放性和更為動態的網絡拓撲。
在發布/訂閱模型中,訂閱者通常接收所有發布的消息的一個子集。選擇接受和處理的消息的過程被稱作過濾。有兩種常用的過濾形式:基於主題(例如:MQTT)和基於內容。在基於主題的係統中,發布者發布消息到一個中間的消息代理,命名一個主題或通道上。然後,訂閱者向該消息代理注冊訂閱,由消息代理來進行過濾。訂閱者將收到其訂閱的主題上的所有消息,並且所有訂閱同一主題的訂閱者將接收到同樣的消息。發布者負責定義訂閱者所訂閱的消息類別。消息代理通常執行存儲轉發的功能將消息從發布者發送到訂閱者。
與點對點模型不同,使用發布/訂閱模型發布到一個主題的消息,能夠由多個訂閱者所接收。有時候,也稱這項技術為廣播(broad-casting)消息。每個訂閱者都會接收到每條消息的一個副本。總地來說,發布/訂閱消息傳送模型基本上是一個基於推送(push)的模型,其中消息自動地向消費者廣播,它們無須請求或輪詢主題來獲得新消息。在發布/訂閱消息傳送模型內部,有多種不同類型的訂閱者。非持久訂閱者是臨時訂閱類型,它們隻是在主動偵聽主題時才接收消息。而另一方麵,持久訂閱者將接收到發布的每條消息的一個副本,即便在發布消息,它們處於"離線"狀態時也是如此。
3.基於Arduino UNO的MQTT實現
3.1 支持TCPIP的Arduino開發板:Arduino UNO單片機板+TCPIP以太網接口板
Arduino是一個開源電子平台,板載AVR、ARM等單片機,使用Arduino編程語言編程,類似於C編程語言。可加載庫文件所提供的類和函數提供對外圍器件和通信接口的支持,庫文件用C++編寫。借助這個平台,物聯網技術開發者可以快速驗證和在實驗室部署連接傳感器和執行器的應用。Arduino代碼主要由二部分組成:setup和loop,前者在程序啟動後運行一次,後者在餘下的時間循環運行,直至被複位。