葛聰樂, 車 進(jìn), 田 斌, 王晨宇, 任春枝
(寧夏大學(xué) 物理與電子電氣工程學(xué)院,寧夏 銀川 750021)
隨著物聯(lián)網(wǎng)技術(shù)在生活中的普及應(yīng)用,以智慧農(nóng)業(yè)、精準(zhǔn)農(nóng)業(yè)為標(biāo)準(zhǔn)的農(nóng)業(yè)物聯(lián)網(wǎng)已經(jīng)成為現(xiàn)代農(nóng)業(yè)發(fā)展的一個(gè)重要趨勢(shì)[1,2]。在傳統(tǒng)的土壤數(shù)據(jù)采集中存在采集面積較小、采集數(shù)據(jù)量較低及數(shù)據(jù)誤差等問題,通過利用物聯(lián)網(wǎng)技術(shù),以實(shí)現(xiàn)土壤數(shù)據(jù)采集的智慧化和精準(zhǔn)化。
本文設(shè)計(jì)了一種分布式部署ZigBee傳感器節(jié)點(diǎn),通過OpenWrt網(wǎng)關(guān)轉(zhuǎn)發(fā)數(shù)據(jù)至服務(wù)器的系統(tǒng)方案。
系統(tǒng)的總體結(jié)構(gòu)包括了ZigBee模塊、MT7688網(wǎng)關(guān)及服務(wù)器三部分。ZigBee模塊由協(xié)調(diào)器和終端節(jié)點(diǎn)組成,各個(gè)節(jié)點(diǎn)將采集的土壤數(shù)據(jù)通過ZigBee 網(wǎng)絡(luò)協(xié)議發(fā)至ZigBee協(xié)調(diào)器。網(wǎng)關(guān)部分負(fù)責(zé)數(shù)據(jù)轉(zhuǎn)發(fā),與協(xié)調(diào)器使用Mod-bus通信協(xié)議,并把采集的數(shù)據(jù)寫入備用的SQLite3數(shù)據(jù)庫,同時(shí)網(wǎng)關(guān)向MQTT(MQ telemetry transport) Broker發(fā)布數(shù)據(jù)消息話題。
遠(yuǎn)程Linux PC機(jī)服務(wù)器中的MQTT Broker可以管理一個(gè)或多個(gè)網(wǎng)關(guān)發(fā)布的消息話題,在后臺(tái)應(yīng)用程序中訂閱發(fā)布的消息話題,并把數(shù)據(jù)存入MySQL。
網(wǎng)關(guān)以聯(lián)發(fā)科公司的MT7688為主控制器,該控制器集成了主頻最高580 MHz的MIPS 24KEc CPU處理器,配置有標(biāo)準(zhǔn)IEEE 802.11n Wi—Fi無線電,3個(gè)UART串口、及GPIO等接口。MT7688提供物聯(lián)網(wǎng)網(wǎng)關(guān)和物聯(lián)網(wǎng)設(shè)備兩種模式,本系統(tǒng)使用物聯(lián)網(wǎng)網(wǎng)關(guān)模式。
由系統(tǒng)架構(gòu)圖可知,MT7688系統(tǒng)配有一個(gè)802.11n WiFi接口和一個(gè)RJ45接口,系統(tǒng)可工作于有線和無線兩種模式。
ZigBee是一種無線傳感網(wǎng)絡(luò)新技術(shù),其協(xié)議是由ZigBee聯(lián)盟制定的一種基于IEEE802.15.4技術(shù)的無線傳輸標(biāo)準(zhǔn),ZigBee技術(shù)具有低功耗、低成本、近距離等特點(diǎn)[3,4]。目前ZigBee結(jié)合傳感器的系統(tǒng)設(shè)計(jì)技術(shù)已經(jīng)成熟,并且自組網(wǎng)功能較強(qiáng),在無線傳感網(wǎng)絡(luò)系統(tǒng)中被廣泛地采用。
ZigBee網(wǎng)絡(luò)有星型、樹型、Mesh(網(wǎng)狀拓?fù)?三種拓?fù)浣Y(jié)構(gòu),按照拓?fù)浣Y(jié)構(gòu)可將ZigBee模塊分為協(xié)調(diào)器、路由器及節(jié)點(diǎn)三類。與另外兩種拓?fù)浣Y(jié)構(gòu)相比采用星型拓?fù)浣Y(jié)構(gòu)具有結(jié)構(gòu)簡(jiǎn)單、傳輸速度快等特點(diǎn),在此結(jié)構(gòu)中路由器和終端節(jié)點(diǎn)都被作為終端設(shè)備使用。
基于串口通信具有傳輸數(shù)據(jù)量大、誤碼識(shí)別率高等優(yōu)點(diǎn)[5,6]。協(xié)調(diào)器與網(wǎng)關(guān)之間的通信采用Modbus RTU,以網(wǎng)關(guān)作為主站、協(xié)調(diào)器作為從站,主站向從站發(fā)送如表1的心跳包數(shù)據(jù),從站接收到心跳包數(shù)據(jù)后響應(yīng)如表2數(shù)據(jù)。
表1 心跳包數(shù)據(jù)
表2 響應(yīng)數(shù)據(jù)
在上述表格中H代表該值的十六進(jìn)制數(shù)據(jù)高8位,L代表該值的十六進(jìn)制數(shù)據(jù)低8位。
MQTT是一種基于發(fā)布/訂閱的消息協(xié)議,專為受限設(shè)備和高延遲、不可靠或低帶寬的網(wǎng)絡(luò)而設(shè)計(jì),TCP/IP端口1883與IANA保留在一起專用于MQTT[7,8]。
3.2.1 MQTT消息模型
在MQTT中存在MQTT Broker、客戶端兩個(gè)角色,其中客戶端包括了訂閱者和發(fā)布者兩部分,客戶端通過發(fā)送請(qǐng)求報(bào)文與MQTT Broker確認(rèn)并建立連接,MQTT Broker負(fù)責(zé)處理訂閱者和發(fā)布者的請(qǐng)求。
考慮需要傳輸溫度、電導(dǎo)率及濕度3種數(shù)據(jù),基于以上數(shù)據(jù)類型分別設(shè)計(jì)了3種數(shù)據(jù)消息話題,分別對(duì)應(yīng)1/temperature、1/conductivity、1/humidity。發(fā)布者、訂閱者與MQTT Broker消息模型如圖1。
圖1 MQTT Broker消息模型
3.2.2 MQTT Broker和客戶端部署
MQTT Broker部署在遠(yuǎn)程PC機(jī)中,實(shí)現(xiàn)MQTT Broker的軟件種類繁多,本次采用經(jīng)過EPL/EDL許可的開源消息代理Eclipse Mosquitto,Mosquitto是基于MQTT協(xié)議3.1和3.1.1的輕量級(jí)消息代理軟件。在Linux系統(tǒng)中下載Mosquitto代碼后,修改代碼目中config.mk文件可以配置支持SSL/TLS、橋接模式等功能。
MQTT客戶端包括了網(wǎng)關(guān)部分的發(fā)布者及PC機(jī)中后臺(tái)服務(wù)的訂閱者,為了與Mosquitto相互兼容,客戶端采用了開源Eclipse Paho項(xiàng)目。Paho支持多語言庫,而且專為嵌入式設(shè)備提供了 MQTT 嵌入式C/C++ 客戶端庫,因此,在嵌入式網(wǎng)關(guān)中移植基于Paho的嵌入式客戶端庫實(shí)現(xiàn)數(shù)據(jù)消息話題發(fā)布,在PC機(jī)中使用標(biāo)準(zhǔn)MQTT C 庫實(shí)現(xiàn)消息話題訂閱。
OpenWrt是一個(gè)開源的Linux衍生版,支持Intel X86、MIPS及ARM等架構(gòu),具有強(qiáng)大的網(wǎng)絡(luò)功能以及豐富的模塊和用戶自定義庫[9,10]。
4.1.1 交叉編譯鏈創(chuàng)建
Buildroot是一種簡(jiǎn)易的交叉編譯工具,不僅可以編譯ARM架構(gòu)同時(shí)支持編譯MIPS架構(gòu)。獲取Buildroot源碼后,進(jìn)入源碼包路徑中通過make menuconfig命令選擇交叉編譯配置。在Target options中選擇Target Architecture (MIPS (little endian)),其中,MIPS (little endian)為MIPS小端模式,在toolchain中選擇需要配置的選項(xiàng),經(jīng)過編譯之后在服務(wù)器用戶目錄下的bashrc文件中添加交叉編譯路徑,即可在全局環(huán)境中使用交叉編譯命令編譯程序。
4.1.2 SQlite3數(shù)據(jù)庫添加及使用
OpenWrt內(nèi)核中帶有SQlite3數(shù)據(jù)庫選項(xiàng),需在內(nèi)核中配置libsqlite3和sqlite3-cli,經(jīng)過編譯之后生成相關(guān)的鏈接庫文件,編譯程序時(shí)需依賴生成的鏈接庫文件并指明庫文件和所引用頭文件的路徑[11,12]。在OpenWrt系統(tǒng)中使用SQlite3數(shù)據(jù)庫可以生成以.db結(jié)尾的數(shù)據(jù)庫文件,使用如下的SQlite命令可以轉(zhuǎn)換為MySQL文件:
sqlite3 xxx.db < xxx.sql
xxx.db 指待轉(zhuǎn)換的SQlite文件,xxx.sql為生成的MySQL文件。
為了最大效率利用硬件處理器,網(wǎng)關(guān)程序采用并行多線程設(shè)計(jì),與串行結(jié)構(gòu)相比并行結(jié)構(gòu)運(yùn)行速度更快、處理周期更短。網(wǎng)關(guān)程序分為線程1、線程2和主進(jìn)程三部分。
4.2.1 主進(jìn)程設(shè)計(jì)
主進(jìn)程負(fù)責(zé)網(wǎng)關(guān)策略調(diào)度。首先打開串口,初始化波特率、奇偶校驗(yàn)位、阻塞超時(shí)時(shí)間等串口參數(shù),然后設(shè)置MQTT客戶端地址、信號(hào)質(zhì)量、MQTT Broker IP地址和端口號(hào)等參數(shù),參數(shù)設(shè)置成功后,向MQTT服務(wù)器發(fā)送請(qǐng)求報(bào)文并與之建立連接。之后創(chuàng)建2個(gè)子線程,開始任務(wù)調(diào)度處理。最后等待子線程結(jié)束,子線程結(jié)束后為防止內(nèi)存泄漏需將子線程銷毀。
4.2.2 線程1設(shè)計(jì)
線程1負(fù)責(zé)向協(xié)調(diào)器定時(shí)發(fā)送Modbus心跳包數(shù)據(jù)。在OpenWrt系統(tǒng)中用POSIX Timer函數(shù)和signal信號(hào)函數(shù)相結(jié)合實(shí)現(xiàn)定時(shí)發(fā)送數(shù)據(jù)包,實(shí)現(xiàn)步驟如下:
1)使用timer_create()創(chuàng)建定時(shí)器,該函數(shù)創(chuàng)建的定時(shí)器屬于進(jìn)程本身,此函數(shù)的參數(shù)成員之一為struct sigevent *evp,改變evp的成員變量可執(zhí)行不同的動(dòng)作。
2)在定時(shí)器創(chuàng)建完之后,使用timer_settime()函數(shù)設(shè)置定時(shí)周期。
3)定時(shí)器到時(shí)之后signal()函數(shù)收到對(duì)應(yīng)信號(hào)并執(zhí)行相關(guān)的功能函數(shù),在該函數(shù)中計(jì)算CRC校驗(yàn)碼、封包、發(fā)送心跳包。
4.2.3 線程2設(shè)計(jì)
在線程2中由網(wǎng)關(guān)接收協(xié)調(diào)器的響應(yīng)數(shù)據(jù)包,當(dāng)讀取串口數(shù)據(jù)未超時(shí)解析響應(yīng)數(shù)據(jù)包,將解析的數(shù)據(jù)通過校驗(yàn)計(jì)算與數(shù)據(jù)包里的校驗(yàn)碼相對(duì)比,校驗(yàn)正確則把數(shù)據(jù)寫入SQlite3數(shù)據(jù)庫,并向MQTT Broker發(fā)布數(shù)據(jù)消息話題。
在遠(yuǎn)程服務(wù)器PC機(jī)中配置了MQTT Broker和MySQL,服務(wù)器程序中使用MQTT C 庫提供的API函數(shù)建立MQTT客戶端、連接MQTT Broker、訂閱網(wǎng)關(guān)發(fā)布的數(shù)據(jù)消息,當(dāng)消息到達(dá)時(shí)向數(shù)據(jù)庫寫入數(shù)據(jù)。
對(duì)于數(shù)據(jù)庫的設(shè)計(jì)流程,整體基于MySQL的結(jié)構(gòu),設(shè)計(jì)步驟如下:
# mysql—uroot—p123456;連接數(shù)據(jù)庫,—u指定用戶,—p為用戶密碼。
#mysql>create database Embedded;創(chuàng)建名為Embedded數(shù)據(jù)庫。
# mysql>use Embedded;使用該數(shù)據(jù)庫。
# mysql>create table Sensor(
數(shù)據(jù)編號(hào) int(4) not null,
溫度 double not null,
電導(dǎo)率 double not null,
濕度 double not null);創(chuàng)建名為Sensor表,并向其中添加了4種數(shù)據(jù)字段。
在應(yīng)用程序中需初始化MySQL數(shù)據(jù)庫結(jié)構(gòu)、連接已建立的數(shù)據(jù)庫、插入指定的數(shù)據(jù)。
在遠(yuǎn)程服務(wù)器PC機(jī)中打開3個(gè)命令窗口分別輸入以下命令可查看訂閱數(shù)據(jù)消息,其命令如下:
#mosquitto_sub—t 1/temperature—i localhost—p 1883
#mosquitto_sub—t 1/conductivity—i localhost—p 1883
# mosquitto_sub—t 1/humidity—i localhost—p 1883
-t指定訂閱的數(shù)據(jù)消息話題,-i指定連接的MQTT Broker IP地址,localhost為本地MQTT Broker地址,1883為MQTT特定的消息服務(wù)器端口。
在服務(wù)器中通過MySQL命令查看應(yīng)用程序向數(shù)據(jù)庫寫入的數(shù)據(jù),MySQL中數(shù)據(jù)如圖2。
圖2 MySQL數(shù)據(jù)
本文提出了一種基于OpenWrt與ZigBee的遠(yuǎn)程分布式物聯(lián)網(wǎng)數(shù)據(jù)監(jiān)控系統(tǒng),對(duì)于數(shù)據(jù)的存儲(chǔ)設(shè)計(jì)了2種不同位置的數(shù)據(jù)庫,在數(shù)據(jù)傳輸過程中為了保證數(shù)據(jù)傳輸?shù)目煽啃院蜏?zhǔn)確性使用了MQTT和Modbus通信協(xié)議。該系統(tǒng)整體結(jié)構(gòu)完善,適宜于在遠(yuǎn)程分布式環(huán)境中部署,具有一定的實(shí)際應(yīng)用價(jià)值。