陳 玥 王海峰 賈建鑫 康 凱*
1(東南大學(xué)計(jì)算機(jī)科學(xué)與工程學(xué)院 江蘇 南京 211189)2(中國(guó)科學(xué)院上海微系統(tǒng)與信息技術(shù)研究所 上海 200050)3(中國(guó)科學(xué)院上海高等研究院 上海 201210)
當(dāng)前,隨著我國(guó)城市化建設(shè)的快速推進(jìn),水資源短缺與水環(huán)境污染已成為城市化建設(shè)面臨的關(guān)鍵問題。水資源短缺與水環(huán)境污染不僅會(huì)阻礙經(jīng)濟(jì)建設(shè),更會(huì)對(duì)國(guó)民健康帶來危害。因此,針對(duì)水資源進(jìn)行有效的監(jiān)測(cè)與管理顯得至關(guān)重要。
另一方面,隨著國(guó)內(nèi)外物聯(lián)網(wǎng)技術(shù)[1-5]的快速發(fā)展,物聯(lián)網(wǎng)技術(shù)被廣泛應(yīng)用于水資源監(jiān)測(cè)領(lǐng)域[6-9],其在很大程度上促進(jìn)了水資源監(jiān)測(cè)技術(shù)的發(fā)展。物聯(lián)網(wǎng)作為一種新興的技術(shù)領(lǐng)域,受到國(guó)家的高度重視。國(guó)家工信部發(fā)布了《物聯(lián)網(wǎng)“十二五”發(fā)展規(guī)劃》,將智能環(huán)保作為一項(xiàng)重點(diǎn)示范工程。智能環(huán)保旨在利用物聯(lián)網(wǎng)相關(guān)技術(shù)實(shí)現(xiàn)污染源監(jiān)控、水質(zhì)監(jiān)測(cè)、空氣監(jiān)測(cè)、生態(tài)監(jiān)測(cè)并建立智能環(huán)保信息采集網(wǎng)絡(luò)與信息平臺(tái)。水質(zhì)監(jiān)測(cè)和水污染監(jiān)控?zé)o疑是智能環(huán)保的一個(gè)重要組成部分。因此,研究基于物聯(lián)網(wǎng)技術(shù)的水資源監(jiān)測(cè)平臺(tái)勢(shì)在必行。鑒于此,本文基于物聯(lián)網(wǎng)平臺(tái)相關(guān)理論技術(shù),設(shè)計(jì)并實(shí)現(xiàn)了一種基于海量異構(gòu)傳感器的物聯(lián)網(wǎng)水質(zhì)監(jiān)測(cè)系統(tǒng),根據(jù)圖1所示的云-管-端體系,將該系統(tǒng)分為4層,包括感知層、網(wǎng)絡(luò)層、平臺(tái)層、應(yīng)用層。其中感知層主要由各種傳感器節(jié)點(diǎn)構(gòu)成,其主要負(fù)責(zé)對(duì)物理世界進(jìn)行信息收集與信號(hào)處理;網(wǎng)絡(luò)層主要由各類傳輸網(wǎng)絡(luò)構(gòu)成,負(fù)責(zé)終端接入與數(shù)據(jù)傳輸;平臺(tái)層主要由數(shù)據(jù)庫(kù)服務(wù)器和業(yè)務(wù)服務(wù)器構(gòu)成,負(fù)責(zé)設(shè)備通信管理,數(shù)據(jù)存儲(chǔ),業(yè)務(wù)處理規(guī)劃等,應(yīng)用層由各類可視化控件構(gòu)成,負(fù)責(zé)數(shù)據(jù)呈現(xiàn)及客戶交互。
圖1 基于云-管-端體系的物聯(lián)網(wǎng)平臺(tái)層次劃分
本文的主要貢獻(xiàn)如下:
(1) 基于云-管-端模型提出了物聯(lián)網(wǎng)水質(zhì)監(jiān)測(cè)系統(tǒng)的總體架構(gòu),將物聯(lián)網(wǎng)水質(zhì)監(jiān)測(cè)系統(tǒng)分為感知層、網(wǎng)絡(luò)層、平臺(tái)層、應(yīng)用層四部分。在感知層,分別采用2G、NB-IoT[10-12]、LoRa[13-15]等多種不同網(wǎng)絡(luò)制式的傳感器設(shè)備進(jìn)行水質(zhì)數(shù)據(jù)的采集;在網(wǎng)絡(luò)層,分別通過2G傳輸網(wǎng)絡(luò)、NB-IoT傳輸網(wǎng)絡(luò)、LoRa傳輸網(wǎng)絡(luò)對(duì)水質(zhì)遙測(cè)數(shù)據(jù)及傳感器設(shè)備數(shù)據(jù)進(jìn)行傳輸;在平臺(tái)層,通過數(shù)據(jù)庫(kù)服務(wù)器、云服務(wù)器、NB-IoT服務(wù)器、以及LoRa服務(wù)器對(duì)網(wǎng)絡(luò)層上報(bào)的相關(guān)數(shù)據(jù)進(jìn)行存儲(chǔ)與處理;在應(yīng)用層,通過圖表、地圖、視頻等可編程顯示部件來向用戶提供可視化的水質(zhì)監(jiān)測(cè)信息,并可根據(jù)平臺(tái)層定義的規(guī)則引擎觸發(fā)警報(bào)實(shí)時(shí)地向用戶推送短信和郵件通知。
(2) 基于系統(tǒng)總體架構(gòu),進(jìn)一步對(duì)系統(tǒng)平臺(tái)層的關(guān)鍵技術(shù)進(jìn)行了詳細(xì)介紹。首先,平臺(tái)層的數(shù)據(jù)庫(kù)服務(wù)器通過TCP socket模塊以及多線程機(jī)制與2G傳感器進(jìn)行交互,包括將2G網(wǎng)絡(luò)傳輸來的水質(zhì)遙測(cè)數(shù)據(jù)信息與設(shè)備信息進(jìn)行存儲(chǔ)以及針對(duì)2G傳感器設(shè)備下發(fā)指令信息。與此同時(shí),數(shù)據(jù)庫(kù)服務(wù)器中的North API client通過調(diào)用北向接口North API與NB-IoT服務(wù)器及LoRa服務(wù)器進(jìn)行交互,包括從NB-IoT服務(wù)器及LoRa服務(wù)器中讀取NB-IoT傳感器設(shè)備及LoRa傳感器設(shè)備采集的遙測(cè)信息和設(shè)備信息,將讀取后的信息進(jìn)行解析與存儲(chǔ),以及針對(duì)NB-IoT傳感器設(shè)備及LoRa傳感器設(shè)備的指令下發(fā)。其次,對(duì)于數(shù)據(jù)庫(kù)服務(wù)器中存儲(chǔ)的設(shè)備信息與水質(zhì)遙測(cè)信息,在數(shù)據(jù)庫(kù)服務(wù)器中通過Node平臺(tái)以Javascript搭配MQTT的方式實(shí)現(xiàn)與云服務(wù)器中開源IoT平臺(tái)-Thingsboard[16-17]的交互,Thingsboard平臺(tái)中定義的規(guī)則引擎會(huì)對(duì)數(shù)據(jù)庫(kù)服務(wù)器發(fā)布的設(shè)備遙測(cè)數(shù)據(jù)信息進(jìn)行過濾,對(duì)于異常的遙測(cè)數(shù)據(jù)其會(huì)觸發(fā)警報(bào)并通過SMTP和RESTful向用戶發(fā)送警報(bào)郵件和警報(bào)短信。最后,在Thingsboard平臺(tái)中,除其自帶的圖表可顯示部件外,對(duì)其地圖部件進(jìn)行了修改,消除了鑒權(quán)失敗的錯(cuò)誤并且增強(qiáng)了污染范圍的渲染效果,此外,還通過可編程部件Widget加入了視頻顯示控件,其可向用戶提供實(shí)時(shí)的水質(zhì)外景監(jiān)測(cè)。
(3) 通過實(shí)驗(yàn)案例來對(duì)水質(zhì)監(jiān)測(cè)系統(tǒng)進(jìn)行功能測(cè)試,通過收集實(shí)時(shí)的水質(zhì)監(jiān)測(cè)數(shù)據(jù)來觸發(fā)警報(bào)并向用戶推送警報(bào)短信與警報(bào)郵件。相關(guān)實(shí)驗(yàn)結(jié)果表明,該系統(tǒng)可快速有效地向用戶提供水質(zhì)監(jiān)測(cè)與報(bào)警信息。
基于圖2所示的系統(tǒng)總體架構(gòu),在感知層,分別采用2G傳感器節(jié)點(diǎn)與2G匯聚節(jié)點(diǎn)、NB-IoT傳感器節(jié)點(diǎn)與NB-IoT匯聚節(jié)點(diǎn),以及LoRa傳感器節(jié)點(diǎn)與LoRa匯聚節(jié)點(diǎn)對(duì)需要監(jiān)測(cè)的水質(zhì)數(shù)據(jù)進(jìn)行采集,包括水的溶解氧濃度(DO)、氫離子濃度指數(shù)(PH)、水溫(TEMP)、氧化還原電位(ORP)、電導(dǎo)率(EC)、化學(xué)需氧量(COD)、生化需氧量(BOD)、懸浮物(SS)、水質(zhì)色度(WC)等。
圖2 基于海量異構(gòu)傳感器的物聯(lián)網(wǎng)水質(zhì)監(jiān)測(cè)系統(tǒng)總體架構(gòu)
在網(wǎng)絡(luò)層,通過2G傳輸網(wǎng)絡(luò)、NB-IoT傳輸網(wǎng)絡(luò)以及LoRa傳輸網(wǎng)絡(luò)對(duì)感知層采集的水質(zhì)監(jiān)測(cè)數(shù)據(jù)進(jìn)行傳輸。
在平臺(tái)層,數(shù)據(jù)庫(kù)服務(wù)器、NB-IoT服務(wù)器、LoRa服務(wù)器以及云服務(wù)器對(duì)網(wǎng)絡(luò)層傳輸來的遙測(cè)數(shù)據(jù)進(jìn)行存儲(chǔ)與處理。具體而言,系統(tǒng)整體運(yùn)行于云服務(wù)器之上,主體部分是運(yùn)行于服務(wù)器中的開源IoT平臺(tái)——Thingsboard,該平臺(tái)基于Java語(yǔ)言構(gòu)建并可提供完整的Web功能,其利用獨(dú)立的外置數(shù)據(jù)庫(kù)Cassandra將數(shù)據(jù)源與Web平臺(tái)隔離,以便為后續(xù)大數(shù)據(jù)處理預(yù)留空間。如前文所述,感知層的傳感器通信模組包括LoRa、NB-IoT、以及2G等多種網(wǎng)絡(luò)制式,因此本系統(tǒng)分別使用不同的方式對(duì)上述網(wǎng)絡(luò)制式傳送的遙測(cè)數(shù)據(jù)與設(shè)備數(shù)據(jù)進(jìn)行處理。為實(shí)現(xiàn)數(shù)據(jù)采集,數(shù)據(jù)庫(kù)服務(wù)器中運(yùn)行了三個(gè)程序模塊來實(shí)現(xiàn)數(shù)據(jù)源與云服務(wù)器中Cassandra數(shù)據(jù)庫(kù)的交互,包括數(shù)據(jù)獲取、解析、儲(chǔ)存和設(shè)備上報(bào)周期指令的下發(fā)。其中第一個(gè)程序模塊如圖2中數(shù)據(jù)庫(kù)服務(wù)器左側(cè)的雙向箭頭所示,對(duì)于2G網(wǎng)絡(luò)傳送的數(shù)據(jù),系統(tǒng)通過TCP socket以及多線程機(jī)制對(duì)2G設(shè)備發(fā)送的數(shù)據(jù)進(jìn)行實(shí)時(shí)接收并存儲(chǔ)至MySQL數(shù)據(jù)庫(kù)。對(duì)于使用NB-IoT與LoRa傳送的數(shù)據(jù)而言,數(shù)據(jù)庫(kù)服務(wù)器通過第二個(gè)程序模塊調(diào)用North API對(duì)NB-IoT服務(wù)器與LoRa服務(wù)器中緩存的數(shù)據(jù)進(jìn)行讀取并存儲(chǔ)至MySQL數(shù)據(jù)庫(kù)。之后,數(shù)據(jù)庫(kù)服務(wù)器將MySQL中的數(shù)據(jù)通過基于JavaScript編寫的第3個(gè)程序模塊獲取并使用MQTT的方式發(fā)送至Thingsboard平臺(tái)的外置Cassandra數(shù)據(jù)庫(kù)。Thingsboard平臺(tái)支持HTTP、CoAP和MQTT等多種協(xié)議,其中MQTT是被廣泛應(yīng)用的輕量級(jí)M2M/IoT消息協(xié)議,其采用訂閱/發(fā)布的模式。Thingsboard平臺(tái)的規(guī)則引擎會(huì)對(duì)數(shù)據(jù)庫(kù)服務(wù)器發(fā)送來的數(shù)據(jù)進(jìn)行監(jiān)測(cè),當(dāng)規(guī)則引擎發(fā)現(xiàn)異常數(shù)據(jù)時(shí)會(huì)向用戶推送報(bào)警短信和郵件。
在應(yīng)用層,系統(tǒng)基于平臺(tái)層實(shí)現(xiàn)了在Thingsboard平臺(tái)內(nèi)的規(guī)則引擎中利用SMTP和RESTful API分別向互聯(lián)網(wǎng)中的第三方電子郵件轉(zhuǎn)發(fā)商與短信轉(zhuǎn)發(fā)商推送信息,提供電子郵件和短信通知服務(wù)。此外,Thingsboard平臺(tái)內(nèi)置一個(gè)Web servlet用于提供Web服務(wù),其默認(rèn)運(yùn)行在本地8080端口,Web頁(yè)面由多個(gè)可編程部件(Widget)構(gòu)成,Thingsboard平臺(tái)預(yù)先提供一些物聯(lián)網(wǎng)應(yīng)用常用的顯示部件,如地圖、數(shù)據(jù)圖表等??删幊滩考稍赪eb頁(yè)面內(nèi)修改HTML、CSS和JavaScript部分代碼并動(dòng)態(tài)編譯運(yùn)行于Thingsboard平臺(tái)中。除了使用已有部件構(gòu)建Web頁(yè)面,本系統(tǒng)還針對(duì)騰訊地圖的更新操作進(jìn)行了修改,以消除鑒權(quán)失敗的錯(cuò)誤并通過地圖渲染進(jìn)一步增強(qiáng)顯示污染區(qū)域的具體范圍。此外,還新建了視頻直播部件,使得用戶可在傳感器終端站點(diǎn)頁(yè)面中獲得云平臺(tái)提供的攝像頭直播畫面。
本節(jié)對(duì)物聯(lián)網(wǎng)水質(zhì)監(jiān)測(cè)系統(tǒng)平臺(tái)層的主要功能及關(guān)鍵技術(shù)進(jìn)行介紹,以2G與NB-IoT為例(平臺(tái)層針對(duì)LoRa的操作與NB類似)展開。
該模塊部署于數(shù)據(jù)庫(kù)服務(wù)器中,其所包含的代碼文件關(guān)系圖如圖3所示,主函數(shù)所在的Java源文件在運(yùn)行期間會(huì)調(diào)用其他5個(gè)代碼文件。其中Global Parameter.java主要用于定義2G TCP socket功能模塊相關(guān)全局變量。ServerThread.java文件包含與TCP socket相關(guān)聯(lián)的線程類的公有操作及私有變量的定義。MyDataSource.java描述了與存儲(chǔ)2G相關(guān)設(shè)備信息以及遙測(cè)數(shù)據(jù)信息的數(shù)據(jù)庫(kù)連接類的私有變量和公有操作的定義。V1Msg.java用于描述2G TCP Socket模塊用到的數(shù)據(jù)結(jié)構(gòu)類的定義。下文將以主函數(shù)為主線來對(duì)該模塊的關(guān)鍵功能進(jìn)行介紹。
圖3 2G TCP socket模塊的文件調(diào)用關(guān)系圖
2G TCP socket模塊main函數(shù)的主要邏輯功能如圖4所示,其包含六部分功能。第一部分功能用于設(shè)置線程計(jì)數(shù)器的初始值,主要用于對(duì)線程池中的線程進(jìn)行計(jì)數(shù)。第二部分功能用于建立一個(gè)數(shù)據(jù)庫(kù)連接池對(duì)象,與數(shù)據(jù)庫(kù)連接池相關(guān)的類為MyDataSource,其相關(guān)定義在MyDataSource.java源文件中,該連接池包含了與2G設(shè)備信息及遙測(cè)數(shù)據(jù)信息相關(guān)的數(shù)據(jù)庫(kù)連接對(duì)象,如圖5中雙向箭頭所示。第三部分功能主要用于建立TCP Socket相關(guān)的TCP server線程池對(duì)象,全局變量GlobalParameter.maxThreadNumber規(guī)定了該線程池所包含的最大線程數(shù),該值的定義位于全局變量文件GlobalParameter.java中。第四部分功能用于建立一個(gè)保護(hù)線程對(duì)象,保護(hù)線程類定義在ServerThread.java中,保護(hù)線程主要用于對(duì)線程池中的TCP server線程進(jìn)行監(jiān)視以防止某一個(gè)TCP server線程執(zhí)行時(shí)間過長(zhǎng)所造成的資源占用。第五部分功能用于建立一個(gè)TCP server socket對(duì)象并監(jiān)聽指定的端口號(hào)。第六部分功能用于建立一個(gè)TCP server線程對(duì)象并為其賦予TCP socket連接、指定的TCP server線程索引號(hào)、以及指定的數(shù)據(jù)庫(kù)資源池ds。
圖4 2G TCP socket模塊main函數(shù)的主要邏輯功能
圖5 2G TCP Socket模塊多線程與多數(shù)據(jù)庫(kù)連接的對(duì)應(yīng)關(guān)系
根據(jù)圖5可以看出TCP server線程資源池中的線程調(diào)用數(shù)據(jù)庫(kù)資源池中的任意一個(gè)數(shù)據(jù)庫(kù)連接與MySQL數(shù)據(jù)庫(kù)進(jìn)行交互,具體而言,一個(gè)TCP server線程在任一時(shí)刻對(duì)應(yīng)一個(gè)TCP socket連接與一個(gè)數(shù)據(jù)庫(kù)連接。對(duì)于右向箭頭,其表示TCP server線程通過TCP socket連接以及數(shù)據(jù)庫(kù)連接將2G網(wǎng)絡(luò)傳送來的設(shè)備數(shù)據(jù)與遙測(cè)數(shù)據(jù)寫入數(shù)據(jù)庫(kù)服務(wù)器中用于存儲(chǔ)2G設(shè)備信息和遙測(cè)信息的MySQL數(shù)據(jù)庫(kù);對(duì)于左向箭頭,其表示數(shù)據(jù)庫(kù)服務(wù)器根據(jù)指定規(guī)則下發(fā)指令到2G設(shè)備來更新其上報(bào)數(shù)據(jù)的周期,目的是為節(jié)省設(shè)備的能耗。如前文所述,由于TCP server線程池中的線程數(shù)量有限,當(dāng)上報(bào)數(shù)據(jù)的設(shè)備逐漸增多時(shí),若沒有保護(hù)線程對(duì)當(dāng)前的執(zhí)行線程進(jìn)行有效監(jiān)視與釋放,那么線程池中的可用線程將會(huì)逐漸減少,最終可能導(dǎo)致無可用的線程來進(jìn)行調(diào)度。因此,在本系統(tǒng)中,我們?cè)O(shè)定當(dāng)線程的執(zhí)行時(shí)間超過預(yù)設(shè)的最大執(zhí)行時(shí)間timingvalue時(shí)就對(duì)該線程釋放,也即當(dāng)線程資源池將線程提交時(shí)開始計(jì)時(shí),當(dāng)線程達(dá)到最大執(zhí)行時(shí)間timing value時(shí)對(duì)該線程進(jìn)行釋放,與保護(hù)線程相同,TCP server線程類的相關(guān)定義也在代碼文件ServerThread.java中。
本模塊所包含的源代碼文件關(guān)系如圖6所示,主函數(shù)所在的DataCollectionFromServer.java文件在運(yùn)行期間會(huì)調(diào)用其他3個(gè)代碼文件。其中DeviceInfoFrom Json.java文件主要包含了DeviceInfoFromJson類的定義,該類主要用于描述NB-IoT傳感器設(shè)備節(jié)點(diǎn)的主要屬性信息。DataFromJson.java文件包含了DataFrom Json類的定義,該類主要用于描述NB-IoT傳感器設(shè)備節(jié)點(diǎn)所采集的水質(zhì)數(shù)據(jù)信息。ConnectionWithDB.java文件主要定義了與NB-IoT數(shù)據(jù)庫(kù)操作相關(guān)的函數(shù),包括建立與數(shù)據(jù)庫(kù)之間的連接getConnection()、關(guān)閉與數(shù)據(jù)庫(kù)之間的連接closeConnection()、設(shè)備信息的添加與存儲(chǔ)add2Devicelist()、針對(duì)NB-IoT傳感器設(shè)備的數(shù)據(jù)上報(bào)周期指令查詢checkCommandList()、遙測(cè)數(shù)據(jù)信息的存儲(chǔ)insert2datatable()等。
圖6 與NB-IoT服務(wù)器交互模塊的文件調(diào)用關(guān)系圖
以圖7為主線來對(duì)該模塊的關(guān)鍵功能進(jìn)行介紹。首先,mian函數(shù)的第一部分功能是對(duì)運(yùn)行于數(shù)據(jù)庫(kù)服務(wù)器中的North API client進(jìn)行認(rèn)證與鑒權(quán),執(zhí)行成功后,North API client會(huì)獲得一個(gè)鑒權(quán)密鑰accessToken。之后,main函數(shù)執(zhí)行第二與第三部分功能,North API client基于accessToken并通過調(diào)用庫(kù)函數(shù)queryDevices()在NB-IoT服務(wù)器端查詢所有NB-IoT的設(shè)備信息,通過getTotalCount()函數(shù)獲得設(shè)備的數(shù)量。對(duì)于新添加的設(shè)備,North API client將該設(shè)備信息加入數(shù)據(jù)庫(kù)服務(wù)器的DeviceInfo表中,對(duì)于已在表中存在的設(shè)備,North API client對(duì)該設(shè)備的相關(guān)屬性進(jìn)行更新。如圖8所示,DeviceInfo首先被打包成JSON格式由NB-IoT服務(wù)器傳輸至數(shù)據(jù)庫(kù)服務(wù)器端,在數(shù)據(jù)庫(kù)服務(wù)器端North API client將JSON格式的數(shù)據(jù)進(jìn)行解析并將解析后的設(shè)備信息插入/更新至設(shè)備信息表中。在設(shè)備信息寫入數(shù)據(jù)庫(kù)的同時(shí),mian函數(shù)執(zhí)行第四部分功能,即對(duì)于每一臺(tái)設(shè)備而言,North API client檢查ComandList表以確認(rèn)是否有針對(duì)該設(shè)備下發(fā)的指令信息,該指令信息用于設(shè)備上報(bào)周期的更新,其目的是減少設(shè)備上報(bào)數(shù)據(jù)時(shí)所產(chǎn)生的能耗。
圖7 main函數(shù)的主要邏輯功能
圖8 數(shù)據(jù)庫(kù)服務(wù)器與NB-IoT服務(wù)器的交互
基于上述過程,main函數(shù)執(zhí)行第五部分功能,North API client基于accessToken并通過調(diào)用庫(kù)函數(shù)queryDataHistory在NB-IoT服務(wù)器端查詢所有NB-IoT設(shè)備采集的遙測(cè)數(shù)據(jù)信息。與設(shè)備信息DeviceInfo相同,遙測(cè)數(shù)據(jù)信息DataInfo首先被打包成JSON格式由NB-IoT服務(wù)器傳輸至數(shù)據(jù)庫(kù)服務(wù)器端,之后North API client將JSON格式的數(shù)據(jù)進(jìn)行解析并將解析后的信息根據(jù)采集的時(shí)間順序插入遙測(cè)數(shù)據(jù)信息表中。最后,main函數(shù)執(zhí)行第六部分功能對(duì)鑒權(quán)密鑰進(jìn)行刷新。
在2.2節(jié)已詳細(xì)說明了數(shù)據(jù)庫(kù)服務(wù)器如何對(duì)傳感器上報(bào)的水質(zhì)監(jiān)測(cè)數(shù)據(jù)及設(shè)備數(shù)據(jù)進(jìn)行獲取與存儲(chǔ)。為了有效地對(duì)數(shù)據(jù)庫(kù)服務(wù)器中存儲(chǔ)的數(shù)據(jù)進(jìn)行處理,平臺(tái)層的業(yè)務(wù)服務(wù)器(即云服務(wù)器)需對(duì)數(shù)據(jù)庫(kù)服務(wù)器中存儲(chǔ)的數(shù)據(jù)進(jìn)行獲取。本節(jié)將介紹數(shù)據(jù)庫(kù)服務(wù)器與業(yè)務(wù)服務(wù)器之間交互模塊的關(guān)鍵技術(shù)并進(jìn)一步對(duì)業(yè)務(wù)服務(wù)器的關(guān)鍵功能進(jìn)行介紹。
如圖9所示,在數(shù)據(jù)庫(kù)服務(wù)器中我們采用Java script搭配MQTT的方式對(duì)其存儲(chǔ)的設(shè)備數(shù)據(jù)信息及設(shè)備遙測(cè)數(shù)據(jù)信息進(jìn)行發(fā)布,其中數(shù)據(jù)庫(kù)服務(wù)器作為數(shù)據(jù)的發(fā)布者而云服務(wù)器作為數(shù)據(jù)的訂閱者。具體而言,圖9中的MQTT(消息隊(duì)列遙測(cè)傳輸)是ISO標(biāo)準(zhǔn)下基于發(fā)布/訂閱范式的消息協(xié)議。它工作于TCP/IP協(xié)議族之上,而Node是一個(gè)可讓JavaScript程序模塊運(yùn)行于服務(wù)端的開發(fā)平臺(tái)。
圖9 數(shù)據(jù)庫(kù)服務(wù)器針對(duì)云服務(wù)器的數(shù)據(jù)發(fā)布
在云服務(wù)器中,Thingsboard平臺(tái)會(huì)根據(jù)定義的規(guī)則引擎(Rule Engine)對(duì)數(shù)據(jù)庫(kù)服務(wù)器發(fā)布的遙測(cè)數(shù)據(jù)信息進(jìn)行過濾并對(duì)異常的遙測(cè)數(shù)據(jù)進(jìn)行報(bào)警。其中規(guī)則引擎是一個(gè)易于使用的框架,主要用于構(gòu)建基于事件的工作流,其由3個(gè)主要組成部分:
(1) 消息——任何傳入的事件,它可以是來自設(shè)備的傳入數(shù)據(jù)、設(shè)備的生命周期事件、REST API事件、RPC請(qǐng)求等。
(2) 規(guī)則節(jié)點(diǎn)——針對(duì)傳入消息所執(zhí)行的功能,有多種不同類型的規(guī)則節(jié)點(diǎn)可對(duì)不同的傳入消息進(jìn)行過濾、轉(zhuǎn)換或執(zhí)行其他操作。
(3) 規(guī)則鏈——規(guī)則節(jié)點(diǎn)通過關(guān)系相互連接,因此來自規(guī)則鏈中的某一節(jié)點(diǎn)的輸入消息為其前驅(qū)節(jié)點(diǎn)的輸出消息,而該規(guī)則節(jié)點(diǎn)的輸出消息為其后繼規(guī)則節(jié)點(diǎn)的輸入消息。
由于水質(zhì)監(jiān)測(cè)系統(tǒng)監(jiān)測(cè)的水質(zhì)指標(biāo)較多,在這里以其中5項(xiàng)指標(biāo)為例進(jìn)行相關(guān)說明,包括水的溶解氧濃度(DO)、氫離子濃度指數(shù)(PH)、水溫(TEMP)、氧化還原電位(ORP)、電導(dǎo)率(EC)。我們首先定義了如圖10所示的規(guī)則鏈根實(shí)體,其中規(guī)則鏈根實(shí)體中的五個(gè)長(zhǎng)方形分別標(biāo)識(shí)針對(duì)5項(xiàng)水質(zhì)監(jiān)測(cè)指標(biāo)的規(guī)則鏈節(jié)點(diǎn)。
圖10 規(guī)則鏈根實(shí)體
以DO為例對(duì)其規(guī)則鏈的建立進(jìn)行說明。如圖11所示,可以看到對(duì)于數(shù)據(jù)庫(kù)服務(wù)器發(fā)布的水質(zhì)監(jiān)測(cè)信息, DO規(guī)則鏈?zhǔn)紫葘?duì)DO值進(jìn)行檢查并判斷該值是否觸發(fā)黃色警報(bào)或紅色警報(bào),若該值異常并足以觸發(fā)黃色警報(bào),則系統(tǒng)會(huì)向河長(zhǎng)、部門、公司發(fā)送警報(bào)郵件及警報(bào)短信;若該值異常足以觸發(fā)紅色警報(bào),則系統(tǒng)會(huì)向河長(zhǎng)、部門、公司、領(lǐng)導(dǎo)發(fā)送警報(bào)郵件。其中觸發(fā)黃色警報(bào)的具體動(dòng)作定義如圖12所示,紅色警報(bào)觸發(fā)動(dòng)作的定義與黃色警報(bào)相同。
圖11 DO規(guī)則鏈的建立
圖12 觸發(fā)黃色警報(bào)動(dòng)作的定義
本系統(tǒng)還對(duì)云服務(wù)器中Thingsboard平臺(tái)的地圖顯示部件進(jìn)行了修改,消除了鑒權(quán)失敗的錯(cuò)誤并且通過污染范圍的繪制及渲染增強(qiáng)了水質(zhì)污染區(qū)域的顯示。本節(jié)對(duì)該關(guān)鍵技術(shù)進(jìn)行簡(jiǎn)單介紹。
云服務(wù)器中的Thingsboard平臺(tái)可預(yù)先提供一些物聯(lián)網(wǎng)應(yīng)用常用的顯示部件,如地圖、數(shù)據(jù)圖表等。這些顯示部件可通過可編程部件Widgets進(jìn)行編輯與動(dòng)態(tài)編譯。具體而言,其可通過在Web頁(yè)面內(nèi)修改HTML、CSS、和JavaScript部分代碼并動(dòng)態(tài)編譯運(yùn)行于Thingsboard平臺(tái)中。
如2.3節(jié)所述,對(duì)于數(shù)據(jù)庫(kù)服務(wù)器發(fā)布來的最新遙測(cè)數(shù)據(jù),Thingsboard平臺(tái)可對(duì)數(shù)據(jù)進(jìn)行觸發(fā)報(bào)警短信與報(bào)警郵件的邏輯判斷。進(jìn)一步,為了更清晰地在地圖中定位異常數(shù)據(jù)發(fā)生的位置,我們需對(duì)Thingsboard平臺(tái)前端及后臺(tái)的部分代碼進(jìn)行更新。由于地圖顯示部件本身并不直接讀取Thingsboard平臺(tái)外置數(shù)據(jù)庫(kù)中的遙測(cè)數(shù)據(jù),因此需要通過調(diào)用Thingsboard后臺(tái)代碼中的結(jié)構(gòu)體dataSource進(jìn)行遙測(cè)數(shù)據(jù)的讀取并進(jìn)行正確的解析。具體而言,每個(gè)傳感器設(shè)備有其自身的屬性值,如經(jīng)度、緯度、測(cè)量值和閾值,而傳感器數(shù)量眾多,發(fā)送的數(shù)據(jù)量較大,因此需要在后臺(tái)代碼中根據(jù)內(nèi)置的key值對(duì)每個(gè)傳感器對(duì)應(yīng)的屬性值進(jìn)行區(qū)分,然后放入dataSource結(jié)體并發(fā)送至地圖顯示部件的API。
之后,前端代碼根據(jù)解析的數(shù)據(jù)判斷當(dāng)前讀入的遙測(cè)數(shù)據(jù)是否為異常數(shù)據(jù),對(duì)于異常數(shù)據(jù),前端代碼根據(jù)對(duì)應(yīng)數(shù)據(jù)采集設(shè)備的經(jīng)緯度值進(jìn)行定位并繪制出污染范圍。用戶顯示界面只需在Thingsboard平臺(tái)中的dashboard地圖數(shù)據(jù)源配置部分設(shè)置時(shí)間序列為最新的遙測(cè)值,進(jìn)行刷新,若測(cè)量值大于閾值,雙擊地理坐標(biāo)點(diǎn)則可根據(jù)污染范圍繪制如圖13所示的示意圖,再次雙擊則會(huì)更清楚地顯示繪制效果。
圖13 污染范圍繪制示意圖
本節(jié)加入的異常數(shù)據(jù)地圖渲染功能,搭配前文所述的報(bào)警短信與報(bào)警郵件功能,可對(duì)用戶提供更快速有效的水質(zhì)監(jiān)測(cè)決策支持。
本節(jié)通過具體的實(shí)驗(yàn)案例來對(duì)物聯(lián)網(wǎng)水質(zhì)監(jiān)測(cè)系統(tǒng)平臺(tái)層功能進(jìn)行測(cè)試。該實(shí)驗(yàn)選取的監(jiān)測(cè)區(qū)域位于上海市奉賢區(qū)的大治河,在河中部署了2G與NB-IoT兩種通信模組的傳感器節(jié)點(diǎn)與匯聚節(jié)點(diǎn)。兩種設(shè)備定時(shí)對(duì)水質(zhì)監(jiān)測(cè)數(shù)據(jù)進(jìn)行上報(bào),系統(tǒng)平臺(tái)層的數(shù)據(jù)庫(kù)服務(wù)器對(duì)上報(bào)的遙測(cè)數(shù)據(jù)進(jìn)行接收并存儲(chǔ),再將存儲(chǔ)的遙測(cè)數(shù)據(jù)發(fā)布至業(yè)務(wù)服務(wù)器做進(jìn)一步處理,業(yè)務(wù)服務(wù)器對(duì)發(fā)布的數(shù)據(jù)進(jìn)行處理并根據(jù)數(shù)據(jù)是否異常為應(yīng)用層用戶提供預(yù)警服務(wù)(包括發(fā)送報(bào)警短信與報(bào)警郵件),此外,應(yīng)用層可提供多種顯示控件供用戶進(jìn)行數(shù)據(jù)查詢與實(shí)時(shí)監(jiān)測(cè)。
功能測(cè)試實(shí)驗(yàn)步驟如下:
(1) 在數(shù)據(jù)庫(kù)服務(wù)器中的Node平臺(tái)中運(yùn)行test.java模塊,該模塊基于javascript搭配MQTT協(xié)議編寫,其主要功能是將數(shù)據(jù)庫(kù)服務(wù)器中存儲(chǔ)的傳感器遙測(cè)數(shù)據(jù)發(fā)送至云服務(wù)器。
(2) 如圖14所示,在數(shù)據(jù)庫(kù)服務(wù)器中打開命令窗口,對(duì)發(fā)送至云服務(wù)器的遙測(cè)數(shù)據(jù)進(jìn)行觀察。
圖14 云服務(wù)器接收的遙測(cè)數(shù)據(jù)中發(fā)現(xiàn)異常
(3) 如圖14高亮區(qū)域所示,由于發(fā)現(xiàn)異常數(shù)據(jù),因此用戶將收到報(bào)警短信與報(bào)警郵件,如圖15與圖16所示。
圖15 異常數(shù)據(jù)觸發(fā)的報(bào)警短信
圖16 異常數(shù)據(jù)觸發(fā)的報(bào)警郵件
可以看出,由于云服務(wù)器收到的異常數(shù)據(jù)DO的值超出了規(guī)則引擎所規(guī)定的合理范圍,因此觸發(fā)了報(bào)警短信與報(bào)警郵件。報(bào)警短信與報(bào)警郵件中包含了采集該異常數(shù)據(jù)的傳感器設(shè)備地址。此外,在報(bào)警郵件中還包含了騰訊地圖的鏈接,通過鏈接可以打開如圖17所示的用戶查詢監(jiān)測(cè)界面。
圖17 異常數(shù)據(jù)在數(shù)據(jù)庫(kù)服務(wù)器中的位置
(4) 圖17中,可以根據(jù)地圖找到相應(yīng)位置的設(shè)備數(shù)據(jù)信息與遙測(cè)數(shù)據(jù)信息,此外由于通過可編程部件加入了視頻顯示插件,因此可以通過視頻實(shí)時(shí)監(jiān)測(cè)此時(shí)河流周圍的具體環(huán)境信息。
(5) 根據(jù)報(bào)警短信與報(bào)警郵件顯示的異常數(shù)據(jù)信息,到數(shù)據(jù)庫(kù)服務(wù)器中定位該值所在的數(shù)據(jù)庫(kù)文件,如圖18所示,其位于數(shù)據(jù)庫(kù)表device5中,可以看出該設(shè)備編號(hào)與報(bào)警短信與報(bào)警郵件中的設(shè)備編號(hào)一致。
圖18 異常數(shù)據(jù)在用戶查詢與監(jiān)測(cè)界面的顯示
通過上述實(shí)驗(yàn)測(cè)試可以看出,平臺(tái)層可以成功地銜接網(wǎng)絡(luò)層與應(yīng)用層,其可將網(wǎng)絡(luò)層傳輸來的遙測(cè)數(shù)據(jù)通過數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行有效存儲(chǔ)并能通過云服務(wù)器對(duì)存儲(chǔ)的遙測(cè)數(shù)據(jù)進(jìn)行有效處理,為應(yīng)用層的用戶提供決策服務(wù)。此外,應(yīng)用層可通過地圖、圖表、視頻等可顯示部件來為用戶提供可視化的水質(zhì)監(jiān)測(cè)服務(wù)。
本文基于物聯(lián)網(wǎng)平臺(tái)的云-管-端體系設(shè)計(jì)并實(shí)現(xiàn)了一種基于海量異構(gòu)傳感器的物聯(lián)網(wǎng)水質(zhì)監(jiān)測(cè)系統(tǒng)。該系統(tǒng)基于2G傳感器節(jié)點(diǎn)、NB-IoT傳感器節(jié)點(diǎn)以及LoRa傳感器節(jié)點(diǎn)對(duì)水質(zhì)監(jiān)測(cè)數(shù)據(jù)進(jìn)行實(shí)時(shí)采集,并通過平臺(tái)層的數(shù)據(jù)庫(kù)服務(wù)器、NB-IoT服務(wù)器、LoRa服務(wù)器以及業(yè)務(wù)服務(wù)器之間的交互來實(shí)現(xiàn)水質(zhì)遙測(cè)數(shù)據(jù)的高效存儲(chǔ)與處理。通過平臺(tái)層的處理,該系統(tǒng)可以圖表、地圖、視頻的形式為應(yīng)用層的用戶提供水資源監(jiān)測(cè)數(shù)據(jù)的實(shí)時(shí)查詢與監(jiān)控并可通過報(bào)警短信與報(bào)警郵件的方式向用戶提供異常水質(zhì)監(jiān)測(cè)數(shù)據(jù)信息,以便迅速作出決策??傮w而言,本文主要完成了以下工作:
(1) 提出了一種系統(tǒng)的總體設(shè)計(jì)架構(gòu),基于云-管-端體系對(duì)系統(tǒng)架構(gòu)進(jìn)行層次劃分并總結(jié)了系統(tǒng)各個(gè)層的主要組成單元及功能。
(2) 詳細(xì)介紹了系統(tǒng)平臺(tái)層的主要功能及關(guān)鍵技術(shù),包括數(shù)據(jù)庫(kù)服務(wù)器通過TCP socket模塊對(duì)2G傳感器設(shè)備采集的遙測(cè)數(shù)據(jù)信息進(jìn)行接收與存儲(chǔ),數(shù)據(jù)庫(kù)服務(wù)器通過North API client模塊從NB-IoT服務(wù)器與LoRa服務(wù)器提取及存儲(chǔ)與NB-IoT傳感器和LoRa傳感器設(shè)備相關(guān)的遙測(cè)數(shù)據(jù)信息,以及數(shù)據(jù)庫(kù)服務(wù)器通過Node平臺(tái)以Javascript搭配MQTT的方式將其存儲(chǔ)的數(shù)據(jù)發(fā)布至云服務(wù)器供其進(jìn)行數(shù)據(jù)的處理與提供面向用戶的Web服務(wù)。
(3) 通過實(shí)驗(yàn)案例對(duì)水質(zhì)監(jiān)測(cè)系統(tǒng)進(jìn)行了功能測(cè)試并對(duì)測(cè)試結(jié)果進(jìn)行了分析,可以看出該系統(tǒng)可通過多種方式為用戶提供水質(zhì)數(shù)據(jù)的查詢與監(jiān)測(cè)并可及時(shí)發(fā)送水質(zhì)預(yù)警短信及郵件來為用戶快速?zèng)Q策提供支持。
本文提出的水質(zhì)監(jiān)測(cè)系統(tǒng)是一項(xiàng)較為復(fù)雜的系統(tǒng)工程,文中的相關(guān)內(nèi)容還需再做進(jìn)一步完善與補(bǔ)充。今后的研究工作應(yīng)包含以下相關(guān)內(nèi)容:
(1) 考慮到未來海量傳感器節(jié)點(diǎn)的部署,海量數(shù)據(jù)的傳輸、存儲(chǔ)、處理,以及更為豐富的Web應(yīng)用,應(yīng)通過相關(guān)技術(shù)進(jìn)一步增強(qiáng)系統(tǒng)的穩(wěn)定性、可擴(kuò)展性及開發(fā)便捷性。
(2) 考慮到未來傳感器節(jié)點(diǎn)采集的海量數(shù)據(jù),應(yīng)考慮采用服務(wù)器集群的方式對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)與處理。
(3) 考慮到系統(tǒng)的商用穩(wěn)定性及長(zhǎng)期維護(hù)的便捷性,應(yīng)采用備份服務(wù)器或服務(wù)器集群的方式實(shí)現(xiàn)服務(wù)器功能失效后的快速切換。