孟凡輝 肖 聲
(國電南瑞科技股份有限公司,江蘇 南京 210061)
NB-IoT 簡介:隨著互聯(lián)網(wǎng)和移動互聯(lián)網(wǎng)技術(shù)的發(fā)展,最幾年物聯(lián)網(wǎng)技術(shù)也有了飛速發(fā)展[1], 從最早期的短距離無線局域網(wǎng)(如Zigbee、Z-Wave、WiFi)和蜂窩網(wǎng)絡(luò)(廣域網(wǎng),2G/3G/4G…),慢慢形成了LPWAN(低功耗廣域網(wǎng)),典型的有NB-IoT、eMTC、LoRa、SigFox。
NB-IoT(Narrow Band Internet of Things,窄帶物聯(lián)網(wǎng))技術(shù)是一種主要應(yīng)用于低功耗廣覆蓋(LPWA)物聯(lián)網(wǎng)(IoT)市場的新興技術(shù)。NB-IoT 技術(shù)具有連接多、功耗少、覆蓋廣、成本低、速率低、架構(gòu)優(yōu)等特點。
NB-IoT 技術(shù)在國內(nèi)的快速發(fā)展, 針對NB-IoT 技術(shù)的特點,越來越多的城市開始使用NB-IoT 單燈,以實現(xiàn)對單燈設(shè)備的精細(xì)化監(jiān)控,為萬物互聯(lián)、有效節(jié)能提供有力基礎(chǔ)。
一種典型的NB-IoT 實時監(jiān)控系統(tǒng)如圖1 所示:本文主要闡述的是圖1 中接口服務(wù)器接收HTTP 推送和控制的方案(基于工廠模式的PocoC++ HTTP 服務(wù)、共享內(nèi)存維護(hù)模塊,其中應(yīng)用服務(wù)器與接口服務(wù)器的通信通過消息中間件來進(jìn)行通信),消息中間件和其他方面不在本文的討論范圍內(nèi)。
圖1
物聯(lián)網(wǎng)云平臺簡介: 物聯(lián)網(wǎng)云平臺提供海量設(shè)備和數(shù)據(jù)連接的能力和維護(hù),應(yīng)用服務(wù)器只需處理數(shù)據(jù)的內(nèi)容,而不需要維護(hù)海量設(shè)備的鏈接。物聯(lián)網(wǎng)云平臺具有免心跳、命令緩存、擁塞控制、遠(yuǎn)程升級、基站定位、無碼開發(fā)、RA 功能、數(shù)據(jù)業(yè)務(wù)安全保證等特點,能夠有效減少設(shè)備上報次數(shù),保證數(shù)據(jù)和業(yè)務(wù)的可靠。
物聯(lián)網(wǎng)云平臺目前安裝公司主要分為兩類,一類是互聯(lián)網(wǎng)企業(yè)物聯(lián)網(wǎng)平臺,另一類是運營商物聯(lián)網(wǎng)云平臺。
阿里、騰訊、Amazon、華為等互聯(lián)網(wǎng)企業(yè)主要提供的是物聯(lián)網(wǎng)通用云平臺,將物聯(lián)網(wǎng)能力、網(wǎng)絡(luò)能力和云服務(wù)結(jié)合起來,按需向用戶提供融合服務(wù),能夠強大的平臺層服務(wù),其收費模式主要以平臺功能收費和按接口收費,且只提供平臺層服務(wù)接口[2]。
隨著物聯(lián)網(wǎng)的發(fā)展,近幾年各大運營商(中國電信、中國移動、中國聯(lián)通)開始搭建物聯(lián)網(wǎng)云平臺,其與互聯(lián)網(wǎng)物聯(lián)網(wǎng)云平臺相比具有以下特點:
(1)能夠提供端到端服務(wù)(網(wǎng)絡(luò)入口)。
(2)計費方式和傳統(tǒng)的2G、3G、4G 卡類似,按照流量和連接數(shù)收費,用戶較為清晰和理解。
(3)運營商物聯(lián)網(wǎng)云平臺的平臺層能力雖然相對互聯(lián)網(wǎng)企業(yè)相對較弱。
本文通過訂閱物聯(lián)網(wǎng)云平臺變化數(shù)據(jù)推送的方式, 實現(xiàn)當(dāng)NB-IoT 單燈有數(shù)據(jù)變化上送或者周期性上送時,通過物聯(lián)網(wǎng)云平臺http 推送單燈數(shù)據(jù)到接口服務(wù)器和調(diào)用物聯(lián)網(wǎng)云平臺http控制接口,實現(xiàn)對單燈數(shù)據(jù)的實時監(jiān)測和控制。
基于工廠模式的Poco C++ HTTP 服務(wù): 工廠模式是一種設(shè)計模式,當(dāng)需要增加一個產(chǎn)品時,只需增加一個工廠類就可以,它通過隱藏對象如何被創(chuàng)建和組合在一起達(dá)到使整個系統(tǒng)獨立的目的,具有很好的擴展性。
由于NB-IoT 單燈設(shè)備通過不同物聯(lián)網(wǎng)云平臺將數(shù)據(jù)推送到接口服務(wù)器,其通信協(xié)議和數(shù)據(jù)組織方式有相關(guān)差異。為了滿足接口服務(wù)器的擴展性, 本接口服務(wù)器是基于工廠模式的Poco C++ HTTP Server 來實現(xiàn)。
Poco C++ 是一種開源跨平臺、全面的、完整的C++框架,易學(xué)易用,性能優(yōu)秀,能夠低內(nèi)存占用,具有很多特性[4]:
(1)HTTP 客戶端和服務(wù)端(支持SSL),C++ 服務(wù)器頁面編譯器。
(2)多線程框架(線程池,活動對象,工作隊列等)。
(3)支持SSL/TLS,基于OpenSSL。
(4)TCP 服務(wù)器框架(多線程)。
(5)網(wǎng)絡(luò)數(shù)據(jù)流類庫,支持Base64,HexBinary 編解碼,壓縮等等。
(6)共享內(nèi)存管理等。
基于工廠模式的Poco C++ HTTP Server 主要包含兩個產(chǎn)品類,一個是HTTP 請求處理產(chǎn)品類,一個是TCP 服務(wù)器連接產(chǎn)品類。其中TCP 服務(wù)器連接工廠類(TCP 服務(wù)器連接產(chǎn)品類子類),是根據(jù)HTTP 請求處理工廠類(HTTP 請求處理產(chǎn)品類子類)來進(jìn)行創(chuàng)建。由于不同物聯(lián)網(wǎng)平臺數(shù)據(jù)格式有差異,不同的物聯(lián)網(wǎng)云平臺請求則對應(yīng)不同的HTTP 請求處理工廠, 但是它們推送和調(diào)用都是基于HTTP 協(xié)議, 故TCP 服務(wù)器連接工廠類是相同的。所以當(dāng)有新的物聯(lián)網(wǎng)云平臺NB-IoT 設(shè)備時,只需新增一個的HTTP 請求處理工廠類和處理句柄即可, 滿足了不同物理網(wǎng)云平臺的擴展性。
基于工廠模式的Poco C++ HTTP Server 中的HTTPServer類是TCPServer 子類,TCPServer 類實現(xiàn)了一個功能齊全的基于線程池的TCPServer。HTTPServer 初始化的時候需創(chuàng)建一個ServerSocket,并使其監(jiān)聽,同時設(shè)置HTTPServerParams 參數(shù)來滿足不同服務(wù)器需求的配置, 并需提供HTTP 請求處理工廠類,該類用于創(chuàng)建對應(yīng)物聯(lián)網(wǎng)云平臺HTTPRequestHandler 對應(yīng)的工廠。
例如, 當(dāng)有聯(lián)通物聯(lián)網(wǎng)云平臺的HTTP 推送請求的時候,該HTTP 請求處理工廠類創(chuàng)建一個UnicomNBRequestHandle (是HTTPRequestHandler 的子類),通過handleRequest 函數(shù)實現(xiàn)對聯(lián)通物聯(lián)網(wǎng)云平臺NB-IoT 設(shè)備請求數(shù)據(jù)的處理。
TCPServer 多線程的實現(xiàn)是基于線程池的, 其中HTTPServer初始化的時候,將父類TCPServer 也同時進(jìn)行了初始化,并根據(jù)HTTP 請 求 處 理 工 廠 類 , 新 建 了 一 個HTTPServerConnectionFactory 的工廠類(與HTTP 請求處理工廠類對應(yīng)),設(shè)置線程池大小,并創(chuàng)建一個TCPServerDispatcher 對象,其中TCPServerDispather 將鏈接加入隊列,當(dāng)有新HTTP 請求時,根據(jù)線程池情況,幫助TCPServer 分配不同服務(wù)鏈接線程,根據(jù)HTTPServerConnectionFactory 的 工 廠 類 創(chuàng) 建 一 個HTTPServerConnection,并調(diào)用HTTP 請求處理函數(shù),即HTTP 請求處理工廠類的實現(xiàn)。HTTPServer 主要類之間的關(guān)聯(lián)圖,如圖2所示。當(dāng)需要增加其他物理網(wǎng)云平臺的時候, 新增類似UnicomNBRequestHandle 和UnicomNBRequesetHandleFactory 類即可,程序架構(gòu)不變,只需重載實現(xiàn)handleRequest 函數(shù),易于擴展。
圖2
對于實時控制信息, 本文是基于Poco C++ HTTP Client 來實現(xiàn)。HTTP Client 相對HTTPServer 來說結(jié)構(gòu)簡單,因為是一對一的,沒有很大的并發(fā)量,對于控制,只需組織相關(guān)發(fā)送內(nèi)容,通過HTTPClient 一個類即可發(fā)送。
綜上,基于Poco C++網(wǎng)絡(luò)庫提供的HTTPServer 通過工廠模式和線程池技術(shù),能夠有效對數(shù)據(jù)進(jìn)行并發(fā)處理和精確控制,并具有很好的擴展性。
一種基于物聯(lián)網(wǎng)云平臺的NB-IoT 單燈通信接口:本文在基于工廠模式的Poco C++ HTTP 服務(wù)的基礎(chǔ)上,為了實現(xiàn)對云平臺物聯(lián)網(wǎng)單燈的實時控制和并發(fā)數(shù)據(jù)處理,達(dá)到精確管控,提出了一種基于物聯(lián)網(wǎng)云平臺的NB-IoT 單燈通信接口。
一種基于物聯(lián)網(wǎng)云平臺的NB-IoT 單燈通信接口主要包含共享內(nèi)存模塊、HTTP 服務(wù)模塊、調(diào)用消息中間件模塊。
(1)共享內(nèi)存模塊:共享內(nèi)存模塊是接口機中一個獨立模塊,主要負(fù)責(zé)定時循環(huán)讀取數(shù)據(jù)庫中關(guān)于NB-IoT 的設(shè)備關(guān)鍵信息,主要結(jié)構(gòu)可以用下面結(jié)構(gòu)體(以聯(lián)通NB-IoT 單燈為例)表示,其中EXTEND_NB_DEV 主要是一類設(shè)備的一些關(guān)鍵信息,DEV_LAMP_SHM除了包含EXTEND_NB_DEV,包含了單燈的總數(shù)量和設(shè)備最新讀取時間, 單燈數(shù)量的讀取使得讀寫共享內(nèi)存程序,只需寫一定數(shù)量的單燈數(shù)據(jù),無需將最大單燈數(shù)量都進(jìn)行處理,提高處理速度。
共享內(nèi)存使用Poco 中SharedMemory 模塊將文件的全部內(nèi)容映射到一個共享內(nèi)存段中, 共享內(nèi)存的大小即是DEV_LAMP_SHM的大小。根據(jù)讀取數(shù)據(jù)庫的聯(lián)通單燈情況,即共享內(nèi)存的起始地址,將結(jié)構(gòu)體的信息寫入該共享內(nèi)存塊。為了保證數(shù)據(jù)一致性,在循環(huán)讀取數(shù)據(jù)庫寫入共享內(nèi)存的時候,需加入信號量的P、V 操作,保證數(shù)據(jù)的唯一性和一致性。
共享內(nèi)存模塊同時也提供一個根據(jù)名稱來訪問的內(nèi)存名稱的獨立接口,滿足其他服務(wù)的讀取訪問。
(2) HTTP 服務(wù)模塊: 針對基于工廠模式的Poco C++ HTTP服務(wù)的特性, 本文在其基礎(chǔ)上, 重寫了PocoC++ 網(wǎng)絡(luò)庫中TCPServer 類和HTTPServer 類, 增加循環(huán)讀取共享內(nèi)存NB-IoT單燈信息,接收物聯(lián)網(wǎng)云平臺的實時數(shù)據(jù)推送,并通過調(diào)用消息中間件的形式, 將NB-IoT 單燈數(shù)據(jù)解析后發(fā)送到應(yīng)用服務(wù)器。對于控制NB-IoT 單燈的下行消息, 本文在TCPServer 中增加循環(huán)監(jiān)測消息中間件是否發(fā)送控制消息,若收到,解析后,組成相對應(yīng)的格式通過調(diào)用HTTP Client 的接口, 按照物聯(lián)網(wǎng)云平臺的API 格式,通過物聯(lián)網(wǎng)云平臺控制具體相關(guān)設(shè)備。
為了能夠校驗設(shè)備正確性、數(shù)據(jù)解析處理實時性、以及可靠性,本文增加讀循環(huán)取設(shè)備共享內(nèi)存模塊,將單燈設(shè)備增加到一個實時內(nèi)存map 中去。在循環(huán)的函數(shù)中,判斷當(dāng)前刷新時間和共享內(nèi)存刷新時間,如果時間差(可自定義)較大,則重寫map,保證設(shè)備數(shù)據(jù)正確有效。
對于應(yīng)用服務(wù)器的控制命令,繼續(xù)重寫TCPServer,注冊一個消息中間件,循環(huán)監(jiān)測單燈控制命令,進(jìn)行控制命令解析,調(diào)用運營商云平臺對應(yīng)的HTTP API 進(jìn)行設(shè)備控制。
因為物理網(wǎng)云平臺的HTTPAPI 有差異,本文依據(jù)工廠模式,按照類似HTTPServer 的方式重寫HTTPClient 使其為一個接口類,具體實現(xiàn)由不同的子產(chǎn)品(子類)實現(xiàn),如以下代碼所示(華為OC 云平臺的HTTP API 實現(xiàn)方式,截取片段):
其中UnicomNBHttpsClient 繼承HTTPClient 類,nbinvoke 是其實現(xiàn)接口,當(dāng)對不同物聯(lián)網(wǎng)云平臺進(jìn)行控制時,選擇對應(yīng)的物聯(lián)網(wǎng)云平臺控制類進(jìn)行實例化,進(jìn)行控制內(nèi)容處理。
處理上報數(shù)據(jù)時增加判斷在共享內(nèi)存中沒有錄入,如果沒有則放棄處理。對于有效數(shù)據(jù), 通過消息中間件寫入到后臺實時庫,實現(xiàn)監(jiān)控系統(tǒng)的實時監(jiān)控,本文使用的消息中間件,通過注冊消息來進(jìn)行數(shù)據(jù)發(fā)送。
(3)消息中間件模塊:本文中的消息中間件模塊是用于與應(yīng)用服務(wù)器進(jìn)行收發(fā)消息的通道,一般都會提供消息注冊接口,本文在處理物聯(lián)網(wǎng)云平臺的推送數(shù)據(jù)和接收應(yīng)用服務(wù)器的控制消息時需要用到,在此不在進(jìn)行詳細(xì)描述。
本文提出的一種基于物聯(lián)網(wǎng)云平臺的NB-IoT 單燈接口實現(xiàn),重寫基于工廠模式和線程池的HTTPServer 和HTTPClient 服務(wù),使用共享內(nèi)存技術(shù),并調(diào)用消息中間件接口來實現(xiàn)數(shù)據(jù)實時處理和控制。本接口有很好的擴展性,有效解決了NB-IoT 單燈數(shù)據(jù)的并發(fā)實時處理和實時控制。該方案已經(jīng)在天津路燈指揮系統(tǒng)中穩(wěn)定可靠運行,支持移動、聯(lián)通、華為、電信物聯(lián)網(wǎng)云平臺的NB-IoT 單燈,目前已有接近3 萬盞單燈的并發(fā)使用。