《電子技術(shù)應(yīng)用》
您所在的位置:首頁 > 嵌入式技術(shù) > 設(shè)計應(yīng)用 > 基于FreeRTOS和MQTT的海洋監(jiān)測網(wǎng)絡(luò)框架
基于FreeRTOS和MQTT的海洋監(jiān)測網(wǎng)絡(luò)框架
2018年電子技術(shù)應(yīng)用第1期
朱明輝1,,2,趙信廣1,,2,,尤星懿1
1.山東科技大學 電氣與自動化工程學院,,山東 青島266590;2.山東省科學院 海洋儀器儀表研究所,,山東 青島266100
摘要: 設(shè)計基于實時操作系統(tǒng)的海洋監(jiān)測網(wǎng)絡(luò)框架,,用于實時監(jiān)測海洋信息,保護海洋環(huán)境,。采用STM32單片機應(yīng)用實時操作系統(tǒng)FreeRTOS實現(xiàn),,通過各種傳感器在海下采集數(shù)據(jù),,并使用MQTT協(xié)議(消息隊列遙測傳輸)進行數(shù)據(jù)傳輸,實時監(jiān)測海洋環(huán)境,。通過在FreeRTOS操作系統(tǒng)上進行任務(wù)設(shè)計,,并對海流計、水深計采集的數(shù)據(jù)進行傳輸,,最終實現(xiàn)海洋環(huán)境實時監(jiān)測,。
關(guān)鍵詞: 單片機 FreeRTOS 傳感器 MQTT
中圖分類號: TN929.5;TP274
文獻標識碼: A
DOI:10.16157/j.issn.0258-7998.172451
中文引用格式: 朱明輝,,趙信廣,,尤星懿. 基于FreeRTOS和MQTT的海洋監(jiān)測網(wǎng)絡(luò)框架[J].電子技術(shù)應(yīng)用,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.

Marine monitoring network framework based on FreeRTOS and MQTT
Zhu Minghui1,2,,Zhao Xinguang1,,2,You Xingyi1
1.School of Electrical Engineering and Automation,,Shandong University of Science and Technology,,Qingdao 266590,China,; 2.Institute of Oceanographic Instrumentation,,Shandong Academy of Sciences,Qingdao 266100,,China
Abstract: The framework of marine monitoring network based on real-time operating system is designed to monitor marine information in real-time and protect the marine environment. The design uses STM32 microcontroller application Free Real-Time Operating System(FreeRTOS),,through a variety of sensors to collect data in the sea. And the FreeRTOS applies the MQTT to transmit data,to achieve real-time monitoring of the marine environment. Through the task design on FreeRTOS, the data collected by current meter and bathymeter are transmitted. Finally, the marine environment is monitored in real time.
Key words : microcontrollers;FreeRTOS,;sensor,;MQTT

0 引言

    隨著海洋的不斷開發(fā)、探索,,以及生活垃圾等污染物的排放,,海洋環(huán)境遭到嚴重破壞,因此保護海洋環(huán)境刻不容緩,。為了加強海洋環(huán)境的保護,,提高對海洋環(huán)境的合理開發(fā)利用,人們迫切地需要提高海洋監(jiān)測技術(shù),,實現(xiàn)對海洋信息實時監(jiān)測,,更好地實現(xiàn)災(zāi)害預(yù)警,、資源利用、環(huán)境保護以及各種軍事活動,。海洋監(jiān)測基于傳感器網(wǎng)絡(luò)實現(xiàn),,通過多個傳感器構(gòu)成傳感器網(wǎng)絡(luò)采集數(shù)據(jù)并上傳到控制中心實現(xiàn)。傳統(tǒng)的單片機進行傳感器數(shù)據(jù)的采集與傳輸,,只能進行單任務(wù),在較復(fù)雜的數(shù)據(jù)采集傳輸中就顯得力不從心,。而實時操作系統(tǒng)可以設(shè)置多個任務(wù),,每個任務(wù)執(zhí)行的周期是可靠的,可以優(yōu)先快速地執(zhí)行對實時性要求高的事件,,并且程序的設(shè)計相對簡單,,功能的拓展也比較容易。在數(shù)據(jù)傳輸上,,消息隊列遙測傳輸(Message Queuing Telemetry Transport,,MQTT)協(xié)議設(shè)計之初充分考慮了網(wǎng)絡(luò)的不確定性,協(xié)議代碼量少,,報文精簡,,可以適應(yīng)不理想的網(wǎng)絡(luò)條件,提供實時可靠的消息服務(wù),。因此對于海洋監(jiān)測網(wǎng)絡(luò)來說,,在實時操作系統(tǒng)上利用傳感器網(wǎng)絡(luò)采集數(shù)據(jù)并通過MQTT協(xié)議進行交互成為一種可靠的選擇。

1 FreeRTOS簡介

    FreeRTOS操作系統(tǒng)內(nèi)核占用空間小,,實時性高,,源碼公開、可移植,,可以在資源有限的微控制器中運行,。FreeRTOS在任務(wù)調(diào)度上支持搶占式、合作式和時間片式,,任務(wù)數(shù)量沒有限制,,不同任務(wù)可以設(shè)置不同的優(yōu)先級,優(yōu)先級隨數(shù)值的增大而提高,,同一優(yōu)先級也可以設(shè)置不同任務(wù)[1],。與其他嵌入式操作系統(tǒng)相比,F(xiàn)reeRTOS比較簡單,,上手容易,,商業(yè)上免費,而且社會占有量高,。

2 MQTT協(xié)議

2.1 MQTT簡介

    MQTT是一款發(fā)布/訂閱(publish/subscribe)模式的消息傳輸協(xié)議,。該協(xié)議構(gòu)建于TCP/IP協(xié)議上,,并且具有簡單、規(guī)范,、開銷低,、易于實現(xiàn)的特點。這些特點使得它對于一些要求低功耗,、低帶寬等受限的環(huán)境來說是很好的選擇,,因此MQTT協(xié)議被廣泛應(yīng)用在物-物通信以及物聯(lián)網(wǎng)中。

2.2 MQTT特點

    (1)MQTT可以實現(xiàn)消息一對多分發(fā),;

    (2)對負載內(nèi)容屏蔽,;

    (3)傳輸消息提供3種服務(wù)質(zhì)量,用戶可根據(jù)實際應(yīng)用權(quán)衡效率與服務(wù)質(zhì)量,;

    (4)協(xié)議報文的精簡,,減少對網(wǎng)絡(luò)質(zhì)量的依賴;

    (5)客戶端異常中斷的通知機制,。

2.3 MQTT結(jié)構(gòu)

    MQTT協(xié)議中有發(fā)布者,、代理服務(wù)器、訂閱者3種身份,??蛻舳撕痛矸?wù)器首先需要通過交互連接請求報文來建立連接,之后客戶端向代理服務(wù)器發(fā)布消息,,而訂閱者可以向消息代理服務(wù)器訂閱消息,。在此協(xié)議模型中代理服務(wù)器相當于一個轉(zhuǎn)發(fā)者,轉(zhuǎn)發(fā)的消息通過主題來區(qū)分,。協(xié)議模型如圖1所示,。MQTT協(xié)議通過這種消息模式,可以實現(xiàn)多對多的通信,,靈活性高,,并且發(fā)送設(shè)備和接收設(shè)備不直接相連,實現(xiàn)了發(fā)布者與訂閱者解耦[1],。

qrs3-t1.gif

2.4 MQTT數(shù)據(jù)包

    MQTT數(shù)據(jù)包整體上可以分為固定頭,、可變頭、有效載荷,,其中固定頭在所有報文中都存在,,而可變頭和有效載荷是否存在則取決于報文類型。

    (1)固定頭(Fixed header)

    固定頭在MQTT所有報文中都存在,,大小為2~5 B,,第一字節(jié)用來表示報文類型和標志字段,第二字節(jié)開始是剩余長度字段。固定頭格式如表1,。

qrs3-b1.gif

    表1中,,Message Type用4個位表示14種消息類型;QoS level代表服務(wù)質(zhì)量: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上的應(yīng)用

3.1 硬件結(jié)構(gòu)

3.1.1 應(yīng)用條件

    首先在STM32上移植FreeRTOS,其次要支持TCP/IP協(xié)議,。對于嵌入式系統(tǒng)來說,,實現(xiàn)TCP/IP協(xié)議分為軟件方法和硬件方法,軟件上可以通過移植uIP,、LwIP等協(xié)議棧實現(xiàn),;硬件上可以選擇STM32互聯(lián)型產(chǎn)品,或者STM32連接以太網(wǎng)收發(fā)芯片,、WiFi模塊等來實現(xiàn),。

3.1.2 硬件電路設(shè)計

    本文采用STM32連接W5500芯片的方案,與其他方法相比更加快捷,、簡便,。W5500芯片集成了TCP/IP協(xié)議棧,提供了SPI外設(shè)接口,,方便了與MCU相連,,使用全新的SPI協(xié)議,,速率能達到80 MHz。利用W5500提供的官方驅(qū)動庫函數(shù)與SPI接口的驅(qū)動函數(shù),,進行必要的初始化參數(shù)配置,,就可以實現(xiàn)以太網(wǎng)通信。W5500的兩種工作模式中,,選用了可以與其他設(shè)備共享SPI接口的可變數(shù)據(jù)長度模式(VDM),,由SCSn控制數(shù)據(jù)段長度,可以選擇1 B~N B的任意數(shù)據(jù)段長度,。硬件電路連接如圖2所示,。

qrs3-t2.gif

    W5500通過SPI接口連接MCU,其中PC5用于初始化以太網(wǎng)芯片,,如果連接斷開可以通過PC5及時控制W5500,,PA4~PA5用于SPI通信,PB0控制W5500的中斷生效,。W5500的差分信號傳輸TXP/TXN和差分信號接收RXP/RXN,,分別與網(wǎng)絡(luò)接口RJ45中的網(wǎng)絡(luò)變壓器相連,并且連接活動狀態(tài)和網(wǎng)絡(luò)連接指示燈,。選擇HR911105A作為網(wǎng)絡(luò)接口,,它本身自帶網(wǎng)絡(luò)變壓器,可以增強信號,,保證了通信距離,,同時使W5500與外部隔離,提高了抗干擾能力,。整個電路設(shè)計簡單,,同時也保證了數(shù)據(jù)傳輸速度和可靠性。

3.2 報文時序

    以傳輸服務(wù)質(zhì)量QoS2為例,,MQTT的報文時序如圖3所示,。

qrs3-t3.gif

    (1)訂閱者客戶端向代理服務(wù)器發(fā)送CONNECT報文請求連接,代理服務(wù)器返回CONNACK確認連接,,訂閱者客戶端與代理服務(wù)器建立了網(wǎng)絡(luò)連接,;

    (2)訂閱者客戶端向代理服務(wù)器發(fā)布SUBSCRIBE報文訂閱主題,代理服務(wù)器返回SUBACK確認訂閱,;

    (3)發(fā)布者客戶端向代理服務(wù)器發(fā)送CONNECT報文請求連接,,代理服務(wù)器返回CONNACK確認連接,發(fā)布者客戶端與代理服務(wù)器建立了網(wǎng)絡(luò)連接,;之后發(fā)布者通過PUBLISH發(fā)布消息,。如果傳輸消息的服務(wù)質(zhì)量為QoS2,代理服務(wù)器和發(fā)布者之間會通過三步報文PUBREC、PUBREL,、PUBCOMP來確定PUBLISH消息精確收到,;

    (4)訂閱者客戶端通過發(fā)送PINGREQ報文進行心跳連接表示自己還連接著,代理服務(wù)器回復(fù)PINGRESP報文響應(yīng)心跳,,確認客戶端還在連接,;

    (5)代理服務(wù)器把從發(fā)布者客戶端接收到的特定主題的信息,轉(zhuǎn)發(fā)給訂閱此主題的客戶端,;

    (6)訂閱者客戶端向代理服務(wù)器發(fā)布取消訂閱主題報文UNSUBSCRIBE,,代理服務(wù)器發(fā)布UNSUBACK報文,確認收到了對方的取消訂閱報文,;

    (7)客戶端發(fā)送給代理服務(wù)器的最后一個控制報文,,表示客戶端正常斷開連接[1]

3.3 任務(wù)設(shè)計以及優(yōu)先級

    FreeRTOS的每個任務(wù)都可以分配一個0~(configMAX_PRIORITIES-1)的優(yōu)先級,,0的優(yōu)先級最低,。FreeRTOS搶占式任務(wù)調(diào)度器總是保證處于就緒態(tài)或者運行態(tài)的最高優(yōu)先級的任務(wù)運行,而時間片輪轉(zhuǎn)調(diào)度器則是保證處于相同優(yōu)先級的任務(wù)輪轉(zhuǎn)運行時間片的長度,,當時間片用完或者調(diào)用阻塞式API函數(shù)時,,任務(wù)切換。時間片的長度可以自己設(shè)置,,時間片太短任務(wù)會頻繁地切換,降低了CPU的效率,;而時間片太長又會造成實時響應(yīng)變差,,一般選擇100 ms[1]。FreeRTOS上的MQTT應(yīng)用包含的任務(wù)以及優(yōu)先級設(shè)計如圖4所示,。

qrs3-t4.gif

3.4 應(yīng)用

    在海下通過海流計和水深計收集數(shù)據(jù),,并經(jīng)過水密網(wǎng)線傳輸?shù)礁松系姆?wù)器,代理服務(wù)器選擇mosquitto軟件,。首先通過W5500的Socket編程實現(xiàn)系統(tǒng)的網(wǎng)絡(luò)通信功能,,在此基礎(chǔ)上進行MQTT的任務(wù)設(shè)計。在任務(wù)編寫過程中為了簡潔將W5500數(shù)據(jù)發(fā)送和接收封裝到MQTT函數(shù)Mqtt_SendPkt,、Mqtt_RecvPkt中,。

    (1)Receive_task:優(yōu)先級設(shè)為9。調(diào)用Mqtt_InitContext函數(shù),,初始化MqttContext即MQTT運行上下文,,并將設(shè)置MqttContext中的回調(diào)函數(shù)及關(guān)聯(lián)參數(shù);調(diào)用Mqtt_RecvPkt函數(shù)接收服務(wù)器消息,,函數(shù)內(nèi)封裝了W5500的接收函數(shù),,當接收到數(shù)據(jù)會進入中斷,調(diào)用函數(shù)讀取。在Mqtt_RecvPkt函數(shù)中對接收到的數(shù)據(jù)進行解析,,低于2 B的數(shù)據(jù)標記錯誤,。調(diào)用Mqtt_Dispatch函數(shù)對收到的數(shù)據(jù)的第一個字節(jié)高4位控制報文類型進行解析,根據(jù)報文類型回調(diào)響應(yīng)函數(shù)或者設(shè)置標志位,。例如收到的是PUBREC控制報文,,則調(diào)用響應(yīng)函數(shù)發(fā)布PUBREL報文。任務(wù)流程如圖5所示,。

qrs3-t5.gif

    (2)Heart_task:優(yōu)先級設(shè)為8,。在網(wǎng)絡(luò)連接的情況下通過Mqtt_PackPingReqPkt封裝數(shù)據(jù)包,PINGREQ報文固定頭部第一字節(jié)高4位設(shè)為12,,即報文類型為心跳請求,,低4位為0,剩余長度字節(jié)為0,,即沒有可變報頭和有效載荷,,通過Mqtt_SendPkt發(fā)送后掛起任務(wù),等待響應(yīng),。當接收任務(wù)收到了消息并解析為PINGRESP報文,,標記收到心跳響應(yīng);若超過檢測次數(shù)還沒有收到心跳響應(yīng),,則調(diào)用getSn_SR函數(shù),,獲取Socket連接狀態(tài);如果連接失敗,,標記設(shè)備錯誤,,否則標記協(xié)議錯誤,之后掛起任務(wù)2 min15 s,。在CONNECT報文的可變報頭中設(shè)置心跳時間Keep Alive,,單位是s,這里設(shè)置為180,。任務(wù)流程如圖6所示,。

qrs3-t6.gif

    (3)Fault_task:優(yōu)先級為7。根據(jù)標志位,,如果協(xié)議出錯,,則發(fā)送DISCONNECT報文,然后發(fā)送CONNECT報文進行重新連接,;如果設(shè)備出錯,,則發(fā)送DISCONNECT報文,斷開網(wǎng)絡(luò)連接,,進行W5500芯片的初始化,,最后進行MQTT重新連接,。

    (4)Sensor_task:優(yōu)先級為6。檢測海流計和水深計的存在,,并讀取海流計或水深計的數(shù)據(jù),。

    (5)Send_task:優(yōu)先級為5。在網(wǎng)絡(luò)連接的情況下,,調(diào)用Mqtt_PackPublishPkt封裝數(shù)據(jù),,設(shè)置報文格式為PUBLISH,服務(wù)質(zhì)量為至少分發(fā)一次,,retain設(shè)置為1,。在水深計中報文設(shè)置如表2,設(shè)置固定報頭剩余長度為13,、可變報頭主題名為depth,、有效載荷為4 B的水深計數(shù)據(jù);在海流計中設(shè)置固定報頭剩余長度為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,。調(diào)用Mqtt_SendPkt發(fā)送數(shù)據(jù)。最后掛起任務(wù)2 min,。數(shù)據(jù)封裝和發(fā)送在臨界段內(nèi)執(zhí)行,,防止被中斷打斷。

qrs3-b2.gif

    (6)Key_task:優(yōu)先級為4,。掃描按鍵,,不同按鍵分別代表訂閱消息,、取消訂閱和發(fā)布消息。

    (7)Net _task:優(yōu)先級設(shè)為3,。首先初始化W5500以太網(wǎng)芯片,,進行網(wǎng)絡(luò)連接,然后Mqtt_PackConnectPkt封裝連接包,。固定頭中報文類型設(shè)為CONNECT,,在可變頭中設(shè)置協(xié)議名為MQTT,協(xié)議級別的值為4,,即3.1.1版本,。本文不支持遺囑,故連接標志字節(jié)設(shè)為0xC6,,設(shè)置Keep_alive為180 s,,根據(jù)連接標志字節(jié)的設(shè)置,在有效載荷中按順序設(shè)置客戶端標識符,、用戶名,、密碼。由Mqtt_SendPkt發(fā)送連接包,,如果接收任務(wù)收到了服務(wù)器發(fā)來的CONNACK,,蜂鳴器短鳴5次,提示成功,;如果超時還沒連接成功,,蜂鳴器長叫,提示失敗,,并標記為硬件錯誤,,然后初始化W5500,重新進行網(wǎng)絡(luò)連接,。任務(wù)流程如圖7所示,。

qrs3-t7.gif

    (8)Date_task:優(yōu)先級設(shè)為2。根據(jù)按鍵任務(wù)設(shè)置的不同標志位執(zhí)行不同的命令函數(shù),,上傳數(shù)據(jù)函數(shù),、發(fā)布消息函數(shù)、訂閱消息函數(shù)以及取消訂閱函數(shù),。其中海流計中訂閱消息函數(shù)在有效載荷中設(shè)置主題名為depth,,獲取水深計數(shù)據(jù);水深計中訂閱消息函數(shù)在有效載荷中設(shè)置主題名為current,,獲取海流計數(shù)據(jù),,設(shè)置服務(wù)質(zhì)量QoS為1。

4 結(jié)論

    本文應(yīng)用了海流計和水深計收集數(shù)據(jù),,在此基礎(chǔ)上可以加入更多傳感器收集數(shù)據(jù),,形成海洋監(jiān)測網(wǎng)絡(luò),,實現(xiàn)物物相連。通過對服務(wù)器獲取的信息進行分析就能獲取當前海洋的信息數(shù)據(jù),,實現(xiàn)了對海洋的實時監(jiān)測,。

參考文獻

[1] 劉濱.嵌入式操作系統(tǒng)FreeRTOS的原理與實現(xiàn)[J].單片機與嵌入式系統(tǒng),2005(7):8-11.

[2] 馬躍,,孫翱,,賈軍營.MQTT協(xié)議在移動互聯(lián)網(wǎng)即時通信中的應(yīng)用[J].計算機系統(tǒng)應(yīng)用,2016(3):170-176.

[3] 姚丹,,謝雪松.基于MQTT協(xié)議的物聯(lián)網(wǎng)通信系統(tǒng)的研究與實現(xiàn)[J].信息通信,,2016(3):33-35.

[4] 王慧明.FreeRTOS在coldfire上的實現(xiàn)和應(yīng)用[J].微計算機信息,2016(7):74-76.


作者信息:

朱明輝1,,2,,趙信廣1,2,,尤星懿1

1.山東科技大學 電氣與自動化工程學院,,山東 青島266590;2.山東省科學院 海洋儀器儀表研究所,,山東 青島266100

此內(nèi)容為AET網(wǎng)站原創(chuàng),,未經(jīng)授權(quán)禁止轉(zhuǎn)載。