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