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