文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.172451
中文引用格式: 朱明輝,趙信廣,尤星懿. 基于FreeRTOS和MQTT的海洋監(jiān)測網絡框架[J].電子技術應用,2018,44(1):41-44.
英文引用格式: Zhu Minghui,Zhao Xinguang,You Xingyi. Marine monitoring network framework based on FreeRTOS and MQTT[J]. Application of Electronic Technique,2018,44(1):41-44.
0 引言
隨著海洋的不斷開發(fā)、探索,以及生活垃圾等污染物的排放,海洋環(huán)境遭到嚴重破壞,因此保護海洋環(huán)境刻不容緩。為了加強海洋環(huán)境的保護,提高對海洋環(huán)境的合理開發(fā)利用,人們迫切地需要提高海洋監(jiān)測技術,實現(xiàn)對海洋信息實時監(jiān)測,更好地實現(xiàn)災害預警、資源利用、環(huán)境保護以及各種軍事活動。海洋監(jiān)測基于傳感器網絡實現(xiàn),通過多個傳感器構成傳感器網絡采集數(shù)據(jù)并上傳到控制中心實現(xiàn)。傳統(tǒng)的單片機進行傳感器數(shù)據(jù)的采集與傳輸,只能進行單任務,在較復雜的數(shù)據(jù)采集傳輸中就顯得力不從心。而實時操作系統(tǒng)可以設置多個任務,每個任務執(zhí)行的周期是可靠的,可以優(yōu)先快速地執(zhí)行對實時性要求高的事件,并且程序的設計相對簡單,功能的拓展也比較容易。在數(shù)據(jù)傳輸上,消息隊列遙測傳輸(Message Queuing Telemetry Transport,MQTT)協(xié)議設計之初充分考慮了網絡的不確定性,協(xié)議代碼量少,報文精簡,可以適應不理想的網絡條件,提供實時可靠的消息服務。因此對于海洋監(jiān)測網絡來說,在實時操作系統(tǒng)上利用傳感器網絡采集數(shù)據(jù)并通過MQTT協(xié)議進行交互成為一種可靠的選擇。
1 FreeRTOS簡介
FreeRTOS操作系統(tǒng)內核占用空間小,實時性高,源碼公開、可移植,可以在資源有限的微控制器中運行。FreeRTOS在任務調度上支持搶占式、合作式和時間片式,任務數(shù)量沒有限制,不同任務可以設置不同的優(yōu)先級,優(yōu)先級隨數(shù)值的增大而提高,同一優(yōu)先級也可以設置不同任務[1]。與其他嵌入式操作系統(tǒng)相比,F(xiàn)reeRTOS比較簡單,上手容易,商業(yè)上免費,而且社會占有量高。
2 MQTT協(xié)議
2.1 MQTT簡介
MQTT是一款發(fā)布/訂閱(publish/subscribe)模式的消息傳輸協(xié)議。該協(xié)議構建于TCP/IP協(xié)議上,并且具有簡單、規(guī)范、開銷低、易于實現(xiàn)的特點。這些特點使得它對于一些要求低功耗、低帶寬等受限的環(huán)境來說是很好的選擇,因此MQTT協(xié)議被廣泛應用在物-物通信以及物聯(lián)網中。
2.2 MQTT特點
(1)MQTT可以實現(xiàn)消息一對多分發(fā);
(2)對負載內容屏蔽;
(3)傳輸消息提供3種服務質量,用戶可根據(jù)實際應用權衡效率與服務質量;
(4)協(xié)議報文的精簡,減少對網絡質量的依賴;
(5)客戶端異常中斷的通知機制。
2.3 MQTT結構
MQTT協(xié)議中有發(fā)布者、代理服務器、訂閱者3種身份??蛻舳撕痛矸掌魇紫刃枰ㄟ^交互連接請求報文來建立連接,之后客戶端向代理服務器發(fā)布消息,而訂閱者可以向消息代理服務器訂閱消息。在此協(xié)議模型中代理服務器相當于一個轉發(fā)者,轉發(fā)的消息通過主題來區(qū)分。協(xié)議模型如圖1所示。MQTT協(xié)議通過這種消息模式,可以實現(xiàn)多對多的通信,靈活性高,并且發(fā)送設備和接收設備不直接相連,實現(xiàn)了發(fā)布者與訂閱者解耦[1]。
2.4 MQTT數(shù)據(jù)包
MQTT數(shù)據(jù)包整體上可以分為固定頭、可變頭、有效載荷,其中固定頭在所有報文中都存在,而可變頭和有效載荷是否存在則取決于報文類型。
(1)固定頭(Fixed header)
固定頭在MQTT所有報文中都存在,大小為2~5 B,第一字節(jié)用來表示報文類型和標志字段,第二字節(jié)開始是剩余長度字段。固定頭格式如表1。
表1中,Message Type用4個位表示14種消息類型;QoS level代表服務質量:QoS0、QoS1、QoS2,等級越高對系統(tǒng)的要求越高,而效率越低;Remaining Length表示剩余長度,最大4 B。
(2)可變頭(Variable header)
固定報頭之后是可變頭,不同報文的可變頭是不同的。可變報頭的報文標識符字段并不是所有報文都存在,在客戶端發(fā)送的報文中,如果帶報文標識符,則報文標識符必須是當前未使用的。
(3)有效載荷(Payload)
有效載荷是緊跟可變頭的MQTT數(shù)據(jù)包的最后一部分,存在于CONNECT、SUBSCRIBE、SUBACK、UNSUBSCRIBE、PUBLISH 5種報文消息中,其中PUBLISH中是要傳輸?shù)臄?shù)據(jù),可根據(jù)需要選擇是否帶有效載荷。
3 MQTT在FreeRTOS上的應用
3.1 硬件結構
3.1.1 應用條件
首先在STM32上移植FreeRTOS,其次要支持TCP/IP協(xié)議。對于嵌入式系統(tǒng)來說,實現(xiàn)TCP/IP協(xié)議分為軟件方法和硬件方法,軟件上可以通過移植uIP、LwIP等協(xié)議棧實現(xiàn);硬件上可以選擇STM32互聯(lián)型產品,或者STM32連接以太網收發(fā)芯片、WiFi模塊等來實現(xiàn)。
3.1.2 硬件電路設計
本文采用STM32連接W5500芯片的方案,與其他方法相比更加快捷、簡便。W5500芯片集成了TCP/IP協(xié)議棧,提供了SPI外設接口,方便了與MCU相連,使用全新的SPI協(xié)議,速率能達到80 MHz。利用W5500提供的官方驅動庫函數(shù)與SPI接口的驅動函數(shù),進行必要的初始化參數(shù)配置,就可以實現(xiàn)以太網通信。W5500的兩種工作模式中,選用了可以與其他設備共享SPI接口的可變數(shù)據(jù)長度模式(VDM),由SCSn控制數(shù)據(jù)段長度,可以選擇1 B~N B的任意數(shù)據(jù)段長度。硬件電路連接如圖2所示。
W5500通過SPI接口連接MCU,其中PC5用于初始化以太網芯片,如果連接斷開可以通過PC5及時控制W5500,PA4~PA5用于SPI通信,PB0控制W5500的中斷生效。W5500的差分信號傳輸TXP/TXN和差分信號接收RXP/RXN,分別與網絡接口RJ45中的網絡變壓器相連,并且連接活動狀態(tài)和網絡連接指示燈。選擇HR911105A作為網絡接口,它本身自帶網絡變壓器,可以增強信號,保證了通信距離,同時使W5500與外部隔離,提高了抗干擾能力。整個電路設計簡單,同時也保證了數(shù)據(jù)傳輸速度和可靠性。
3.2 報文時序
以傳輸服務質量QoS2為例,MQTT的報文時序如圖3所示。
(1)訂閱者客戶端向代理服務器發(fā)送CONNECT報文請求連接,代理服務器返回CONNACK確認連接,訂閱者客戶端與代理服務器建立了網絡連接;
(2)訂閱者客戶端向代理服務器發(fā)布SUBSCRIBE報文訂閱主題,代理服務器返回SUBACK確認訂閱;
(3)發(fā)布者客戶端向代理服務器發(fā)送CONNECT報文請求連接,代理服務器返回CONNACK確認連接,發(fā)布者客戶端與代理服務器建立了網絡連接;之后發(fā)布者通過PUBLISH發(fā)布消息。如果傳輸消息的服務質量為QoS2,代理服務器和發(fā)布者之間會通過三步報文PUBREC、PUBREL、PUBCOMP來確定PUBLISH消息精確收到;
(4)訂閱者客戶端通過發(fā)送PINGREQ報文進行心跳連接表示自己還連接著,代理服務器回復PINGRESP報文響應心跳,確認客戶端還在連接;
(5)代理服務器把從發(fā)布者客戶端接收到的特定主題的信息,轉發(fā)給訂閱此主題的客戶端;
(6)訂閱者客戶端向代理服務器發(fā)布取消訂閱主題報文UNSUBSCRIBE,代理服務器發(fā)布UNSUBACK報文,確認收到了對方的取消訂閱報文;
(7)客戶端發(fā)送給代理服務器的最后一個控制報文,表示客戶端正常斷開連接[1]。
3.3 任務設計以及優(yōu)先級
FreeRTOS的每個任務都可以分配一個0~(configMAX_PRIORITIES-1)的優(yōu)先級,0的優(yōu)先級最低。FreeRTOS搶占式任務調度器總是保證處于就緒態(tài)或者運行態(tài)的最高優(yōu)先級的任務運行,而時間片輪轉調度器則是保證處于相同優(yōu)先級的任務輪轉運行時間片的長度,當時間片用完或者調用阻塞式API函數(shù)時,任務切換。時間片的長度可以自己設置,時間片太短任務會頻繁地切換,降低了CPU的效率;而時間片太長又會造成實時響應變差,一般選擇100 ms[1]。FreeRTOS上的MQTT應用包含的任務以及優(yōu)先級設計如圖4所示。
3.4 應用
在海下通過海流計和水深計收集數(shù)據(jù),并經過水密網線傳輸?shù)礁松系姆掌鳎矸掌鬟x擇mosquitto軟件。首先通過W5500的Socket編程實現(xiàn)系統(tǒng)的網絡通信功能,在此基礎上進行MQTT的任務設計。在任務編寫過程中為了簡潔將W5500數(shù)據(jù)發(fā)送和接收封裝到MQTT函數(shù)Mqtt_SendPkt、Mqtt_RecvPkt中。
(1)Receive_task:優(yōu)先級設為9。調用Mqtt_InitContext函數(shù),初始化MqttContext即MQTT運行上下文,并將設置MqttContext中的回調函數(shù)及關聯(lián)參數(shù);調用Mqtt_RecvPkt函數(shù)接收服務器消息,函數(shù)內封裝了W5500的接收函數(shù),當接收到數(shù)據(jù)會進入中斷,調用函數(shù)讀取。在Mqtt_RecvPkt函數(shù)中對接收到的數(shù)據(jù)進行解析,低于2 B的數(shù)據(jù)標記錯誤。調用Mqtt_Dispatch函數(shù)對收到的數(shù)據(jù)的第一個字節(jié)高4位控制報文類型進行解析,根據(jù)報文類型回調響應函數(shù)或者設置標志位。例如收到的是PUBREC控制報文,則調用響應函數(shù)發(fā)布PUBREL報文。任務流程如圖5所示。
(2)Heart_task:優(yōu)先級設為8。在網絡連接的情況下通過Mqtt_PackPingReqPkt封裝數(shù)據(jù)包,PINGREQ報文固定頭部第一字節(jié)高4位設為12,即報文類型為心跳請求,低4位為0,剩余長度字節(jié)為0,即沒有可變報頭和有效載荷,通過Mqtt_SendPkt發(fā)送后掛起任務,等待響應。當接收任務收到了消息并解析為PINGRESP報文,標記收到心跳響應;若超過檢測次數(shù)還沒有收到心跳響應,則調用getSn_SR函數(shù),獲取Socket連接狀態(tài);如果連接失敗,標記設備錯誤,否則標記協(xié)議錯誤,之后掛起任務2 min15 s。在CONNECT報文的可變報頭中設置心跳時間Keep Alive,單位是s,這里設置為180。任務流程如圖6所示。
(3)Fault_task:優(yōu)先級為7。根據(jù)標志位,如果協(xié)議出錯,則發(fā)送DISCONNECT報文,然后發(fā)送CONNECT報文進行重新連接;如果設備出錯,則發(fā)送DISCONNECT報文,斷開網絡連接,進行W5500芯片的初始化,最后進行MQTT重新連接。
(4)Sensor_task:優(yōu)先級為6。檢測海流計和水深計的存在,并讀取海流計或水深計的數(shù)據(jù)。
(5)Send_task:優(yōu)先級為5。在網絡連接的情況下,調用Mqtt_PackPublishPkt封裝數(shù)據(jù),設置報文格式為PUBLISH,服務質量為至少分發(fā)一次,retain設置為1。在水深計中報文設置如表2,設置固定報頭剩余長度為13、可變報頭主題名為depth、有效載荷為4 B的水深計數(shù)據(jù);在海流計中設置固定報頭剩余長度為59、可變報頭主題名為current、有效載荷是海流計的數(shù)據(jù),其中第5~8個字節(jié)為溫度,第29~32字節(jié)是方位,第33~36字節(jié)是流速,第45~48字節(jié)是電壓。例如:海流計數(shù)據(jù)pval,9.381,-0.311,-0.993,-0.221,0.340,0.439,197.586,
164.580,-0.423,0.117,12.132。調用Mqtt_SendPkt發(fā)送數(shù)據(jù)。最后掛起任務2 min。數(shù)據(jù)封裝和發(fā)送在臨界段內執(zhí)行,防止被中斷打斷。
(6)Key_task:優(yōu)先級為4。掃描按鍵,不同按鍵分別代表訂閱消息、取消訂閱和發(fā)布消息。
(7)Net _task:優(yōu)先級設為3。首先初始化W5500以太網芯片,進行網絡連接,然后Mqtt_PackConnectPkt封裝連接包。固定頭中報文類型設為CONNECT,在可變頭中設置協(xié)議名為MQTT,協(xié)議級別的值為4,即3.1.1版本。本文不支持遺囑,故連接標志字節(jié)設為0xC6,設置Keep_alive為180 s,根據(jù)連接標志字節(jié)的設置,在有效載荷中按順序設置客戶端標識符、用戶名、密碼。由Mqtt_SendPkt發(fā)送連接包,如果接收任務收到了服務器發(fā)來的CONNACK,蜂鳴器短鳴5次,提示成功;如果超時還沒連接成功,蜂鳴器長叫,提示失敗,并標記為硬件錯誤,然后初始化W5500,重新進行網絡連接。任務流程如圖7所示。
(8)Date_task:優(yōu)先級設為2。根據(jù)按鍵任務設置的不同標志位執(zhí)行不同的命令函數(shù),上傳數(shù)據(jù)函數(shù)、發(fā)布消息函數(shù)、訂閱消息函數(shù)以及取消訂閱函數(shù)。其中海流計中訂閱消息函數(shù)在有效載荷中設置主題名為depth,獲取水深計數(shù)據(jù);水深計中訂閱消息函數(shù)在有效載荷中設置主題名為current,獲取海流計數(shù)據(jù),設置服務質量QoS為1。
4 結論
本文應用了海流計和水深計收集數(shù)據(jù),在此基礎上可以加入更多傳感器收集數(shù)據(jù),形成海洋監(jiān)測網絡,實現(xiàn)物物相連。通過對服務器獲取的信息進行分析就能獲取當前海洋的信息數(shù)據(jù),實現(xiàn)了對海洋的實時監(jiān)測。
參考文獻
[1] 劉濱.嵌入式操作系統(tǒng)FreeRTOS的原理與實現(xiàn)[J].單片機與嵌入式系統(tǒng),2005(7):8-11.
[2] 馬躍,孫翱,賈軍營.MQTT協(xié)議在移動互聯(lián)網即時通信中的應用[J].計算機系統(tǒng)應用,2016(3):170-176.
[3] 姚丹,謝雪松.基于MQTT協(xié)議的物聯(lián)網通信系統(tǒng)的研究與實現(xiàn)[J].信息通信,2016(3):33-35.
[4] 王慧明.FreeRTOS在coldfire上的實現(xiàn)和應用[J].微計算機信息,2016(7):74-76.
作者信息:
朱明輝1,2,趙信廣1,2,尤星懿1
1.山東科技大學 電氣與自動化工程學院,山東 青島266590;2.山東省科學院 海洋儀器儀表研究所,山東 青島266100