背景
最近幾年公司規(guī)劃了好幾個(gè)工業(yè)物聯(lián)網(wǎng)方面項(xiàng)目,由于前期團(tuán)隊(duì)較小,資源有限比較少考慮技術(shù)復(fù)用和抽象的問(wèn)題,后面隨著業(yè)務(wù)的不斷發(fā)展,團(tuán)隊(duì)規(guī)模組件擴(kuò)大,為了能夠更好的支撐后期業(yè)務(wù)的快速迭代和輸出,從整個(gè)研發(fā)體系出發(fā)不得不考技術(shù)沉淀,抽象復(fù)用的問(wèn)題。
目標(biāo)
根據(jù)公司業(yè)務(wù)特性,抽象提取出針對(duì)于設(shè)備連接、安全、數(shù)據(jù)分析和存儲(chǔ)等能力,形成公司技術(shù)沉淀和后期業(yè)務(wù)快速構(gòu)建的基礎(chǔ)。提升開發(fā)效率。
分析
公司本身從事工業(yè)物聯(lián)網(wǎng)行業(yè),所涉及的解決方案基本都會(huì)涉及到設(shè)備的連接和監(jiān)控,不同設(shè)備具備不同的數(shù)據(jù)協(xié)議,在考慮對(duì)這塊能力進(jìn)行抽象和提去的過(guò)程中,重點(diǎn)需要考慮設(shè)備從連接到上傳,到云端數(shù)據(jù)存儲(chǔ)和最終分析展現(xiàn)數(shù)據(jù)的整個(gè)環(huán)節(jié)。
針對(duì)具體使用場(chǎng)景分析如下:
場(chǎng)景一:
此處以企業(yè)中央空調(diào)為例:作為物業(yè)的管理人員或是作為空調(diào)的運(yùn)維人員,希望能隨時(shí)隨地查看空調(diào)當(dāng)前輸出溫度,本身運(yùn)行溫度,連續(xù)運(yùn)行時(shí)長(zhǎng),耗電等及時(shí)性的狀態(tài)。
場(chǎng)景二:
此處以城市智輝照明為例:作為城市管理人員想要監(jiān)控到當(dāng)前各個(gè)街道的路燈是否正常運(yùn)行,或是否在運(yùn)行。當(dāng)大霧或是夜幕能夠通過(guò)手工或是自動(dòng)化的機(jī)制遠(yuǎn)程開啟路燈
場(chǎng)景三:
此處再列舉一個(gè)汽車?yán)?比如一輛小汽車,汽車使用者希望能時(shí)刻了解汽車的安全狀態(tài),什么時(shí)候該做保養(yǎng),該加油,應(yīng)該換剎車片,當(dāng)前是否有行駛等。作為一個(gè)汽車維修技師在為車輛做檢查時(shí)也需要能夠知道汽車的重要部件是否有更換,運(yùn)行狀態(tài),都希望能有一些數(shù)據(jù)以供維修參考。
以上的三個(gè)場(chǎng)景,理論上是絕大部分物聯(lián)網(wǎng)解決方案需要能夠支持,總結(jié)主要在于三方面:
1. 設(shè)備實(shí)時(shí)狀態(tài)監(jiān)控
2. 遠(yuǎn)程設(shè)備控制
3. 設(shè)備數(shù)據(jù)分析
思路
對(duì)于這部分能力的抽象主要從設(shè)備的連接開始到最后設(shè)備數(shù)據(jù)分析的整個(gè)鏈路做組件的抽象和提取,通過(guò)領(lǐng)域的邊界的確定從而劃分出對(duì)應(yīng)的職責(zé)邊界。
抽象
在這里通過(guò)前期的分析和多個(gè)項(xiàng)目業(yè)務(wù)共性的抽象,整體規(guī)劃如下圖所示:
?
在圖中左邊部分主要是下端傳感器設(shè)備,傳感器設(shè)備可能通過(guò)低功耗網(wǎng)絡(luò)或是串口與工業(yè)網(wǎng)關(guān)進(jìn)行通訊,在工業(yè)網(wǎng)關(guān)中去實(shí)現(xiàn)對(duì)應(yīng)的應(yīng)用程序,主要負(fù)責(zé)解析下端傳感器傳輸回來(lái)的數(shù)據(jù),并對(duì)數(shù)據(jù)做一定量的分析和計(jì)算,然后將數(shù)據(jù)傳送到云端服務(wù)器,在云端經(jīng)過(guò)一些列的處理和存儲(chǔ),最終通過(guò)圖形化界面展示出設(shè)備的狀態(tài)及分析數(shù)據(jù)。
前面主要描述了設(shè)備端到云端再到用戶端的整個(gè)過(guò)程,接下來(lái)根據(jù)目前的思路從設(shè)備端抽象-云端抽象-用戶端抽象進(jìn)行分層介紹
設(shè)備端抽象介紹
設(shè)備端一般分為傳感設(shè)備和路由設(shè)備,一般所為的傳感設(shè)備即為不能直接聯(lián)網(wǎng)的物理設(shè)備,但是他本身可以產(chǎn)生數(shù)據(jù),比如溫度傳感器,煙感,熱感,光感等。路由設(shè)備一般俗稱路由器,本身具備上網(wǎng)能力,無(wú)論這個(gè)能力是通過(guò)網(wǎng)線還是通過(guò)無(wú)線蜂窩網(wǎng)等,總之最后能讓設(shè)備連上網(wǎng)絡(luò),我們的設(shè)備端抽象更多是聚焦于路由端,設(shè)備端的抽象相對(duì)比較簡(jiǎn)答,主要是是抽象除了與云端建立通訊的SDK,此SDK朱啊喲負(fù)責(zé)與云端建立連接,接受消息,和對(duì)設(shè)備本身的集成應(yīng)用提供對(duì)應(yīng)的API接口。
云端抽象介紹
接下來(lái)主要針對(duì)云端處理做抽象的分析和介紹。
對(duì)于云端的處理由圖可以看出來(lái),主要分為5部分:Iot Hub、數(shù)據(jù)分析、設(shè)備管理、規(guī)則引擎和安全;接下來(lái)將對(duì)這五部分做整體介紹和說(shuō)明
Iot Hub介紹
在每個(gè)物聯(lián)網(wǎng)企業(yè)中大家對(duì)于Iot Hub的理解可能存在不一樣的定義,在本設(shè)計(jì)中對(duì)于IOT Hub主要解決設(shè)備連接的問(wèn)題,因此也是成為了所有設(shè)備連接的入口。
當(dāng)然對(duì)于此部分的技術(shù)選型可以有很多,比如需要支持目前主流的物聯(lián)網(wǎng)通訊協(xié)議如:MQTT,CoAP,HTTP,XMPP,SoAP等,在這些協(xié)議中目前主流的應(yīng)該是MQTT,可能還有一些大型設(shè)備是基于XMPP,因此在設(shè)計(jì)之初更多是考慮支持MQTT和XMPP這兩種,當(dāng)然需要支持其他協(xié)議也是可以的,無(wú)非就是后期在Iot Hub增加對(duì)應(yīng)的實(shí)現(xiàn)。理清楚了協(xié)議,就涉及到實(shí)現(xiàn)了,我們的實(shí)現(xiàn)并不一定要自己重頭造輪子,而是更多的調(diào)研和借鑒行業(yè)主流的中間件技術(shù),除非真心找不到適合自身需要的。目前對(duì)于MQTT主流的中間件,可參考官網(wǎng)推薦產(chǎn)品:
https://github.com/mqtt/mqtt.github.io/wiki/server-support,對(duì)于產(chǎn)品之間的對(duì)比如下

如上所示,對(duì)應(yīng)的可選產(chǎn)品有很多,需要根據(jù)我們實(shí)際業(yè)務(wù)特性去選擇,當(dāng)然如果開源產(chǎn)品無(wú)法滿足,可以考慮直接繼承百度、阿里、Azure、AWS等大廠的IoT Hub形成自身能力,但為可能無(wú)法滿足私有化部署的需求。
安全認(rèn)證&權(quán)限策略
安全認(rèn)證和權(quán)限策略,更多的是集成在Broker中,比如MQTT協(xié)議的服務(wù)器,對(duì)于連接的認(rèn)證,對(duì)于Topic的發(fā)布和訂閱的權(quán)限控制策略,包括黑白名單等均由此模塊負(fù)責(zé)
數(shù)據(jù)分析
數(shù)據(jù)分析模塊主要負(fù)責(zé)設(shè)備聯(lián)網(wǎng)后的所有數(shù)據(jù)的上傳,解析,存儲(chǔ)和分析。目前抽象出的幾個(gè)組件為消息路由、協(xié)議解析、多級(jí)存儲(chǔ)、地圖定位;根據(jù)實(shí)際業(yè)務(wù)需要適當(dāng)選擇搭配;
消息路由:主要負(fù)責(zé)將接受到的消息路由到對(duì)應(yīng)的目標(biāo)隊(duì)列或渠道,可以是一個(gè)或多個(gè),便于對(duì)數(shù)據(jù)的不同業(yè)務(wù)處理
協(xié)議解析: 主要負(fù)責(zé)解析從設(shè)備端上傳過(guò)來(lái)的消息,可能上傳過(guò)來(lái)的是二進(jìn)制、Json、xml或自定義字符串等,這里主要是對(duì)消息進(jìn)行解析
多級(jí)存儲(chǔ): 主要提供對(duì)于解析后的消息做存儲(chǔ)功能,對(duì)于設(shè)備的消息可以支持多種存儲(chǔ)方式,比如Mysql,MongoDB,TSDB等,便于系統(tǒng)在整合時(shí)的適配
地圖定位: 主要負(fù)責(zé)解析或轉(zhuǎn)換設(shè)備的地理位置,因?yàn)樵O(shè)備很多時(shí)候不能定位或是GPS不到導(dǎo)致定位數(shù)據(jù)缺失,此組件提供基于其他云廠商地圖服務(wù)的基站定位,和地址編碼轉(zhuǎn)換功能,從而明確出設(shè)備的具體經(jīng)緯度和地址描述
設(shè)備管理
設(shè)備管理模塊主要負(fù)責(zé)設(shè)備注冊(cè)、數(shù)字孿生、設(shè)備控制、OTA升級(jí)等,對(duì)設(shè)備整體做管理和控制。
設(shè)備注冊(cè): 設(shè)備注冊(cè)負(fù)責(zé)設(shè)備連接前的添加注冊(cè),同時(shí)提供對(duì)外接口便于業(yè)務(wù)系統(tǒng)根據(jù)實(shí)際進(jìn)行設(shè)備登記
數(shù)字孿生: 數(shù)字孿生是一個(gè)抽象概念,意為在云端構(gòu)建一個(gè)與實(shí)體一致的設(shè)備模型,然后同步設(shè)備狀態(tài)及動(dòng)作,當(dāng)需要操作設(shè)備或是查詢?cè)O(shè)備信息時(shí)直接通過(guò)數(shù)字孿生設(shè)備進(jìn)行查詢或操作即可,形成與物理設(shè)備一一對(duì)應(yīng)
設(shè)備控制: 設(shè)備控制主要負(fù)責(zé)下發(fā)消息給設(shè)備,與設(shè)備建立下達(dá)通道,確保通道暢通。同時(shí)記錄操作日志,便于如其他模塊集成
OTA升級(jí):OTA升級(jí)引擎提供安全的OTA升級(jí)服務(wù),基于補(bǔ)丁分發(fā)機(jī)制的云端智能推送策略,解決OTA升級(jí)過(guò)程中可能出現(xiàn)的如數(shù)據(jù)篡改,固件包偽造,鏈路劫持等安全風(fēng)險(xiǎn)。主要體現(xiàn)形態(tài):自動(dòng)升級(jí)、手動(dòng)升級(jí)、強(qiáng)制升級(jí)三種模式,單臺(tái)升級(jí)、批量升級(jí)、全網(wǎng)升級(jí)三種模式。技術(shù)上實(shí)現(xiàn)可通過(guò)連接通道,后端的定時(shí)任務(wù)和隊(duì)列進(jìn)行組合實(shí)現(xiàn)。
規(guī)則引擎
規(guī)則引擎主要在于解析設(shè)備協(xié)議,或是上傳設(shè)備數(shù)據(jù)之后對(duì)于設(shè)備數(shù)據(jù)終端狀態(tài)、時(shí)間進(jìn)行過(guò)濾,提取出關(guān)鍵信息然后通過(guò)對(duì)外接口(如廣播)進(jìn)行公告。此處可通過(guò)集成第三方規(guī)則引擎再結(jié)合MQ消息隊(duì)列或是http外部調(diào)用方式擴(kuò)散特征數(shù)據(jù)。
用戶端抽象
用戶端抽象主要分為兩方面,一方面是對(duì)于搜集到的設(shè)備數(shù)據(jù)在用戶端的個(gè)性化呈現(xiàn),另一方面是對(duì)于外部系統(tǒng)集成所能提供的開放接口,因此主要抽象出兩個(gè)組件,自定義報(bào)表和OPEN-API
自定義報(bào)表
主要希望通過(guò)此組件能實(shí)現(xiàn)設(shè)備的實(shí)時(shí)展示,或是對(duì)分析過(guò)的數(shù)據(jù)進(jìn)行結(jié)果呈現(xiàn);此處可選實(shí)現(xiàn)方案可繼承第三方的BI組件,或是開源的報(bào)表組件,如果前期對(duì)于數(shù)據(jù)暫時(shí)效果要求不高,推薦用grafana,這是一個(gè)不錯(cuò)的展示工具,支持多種數(shù)據(jù)源,可以多維度呈現(xiàn)不同的業(yè)務(wù)或設(shè)備數(shù)據(jù)。
OPEN-API
openApi模塊更多的是為了對(duì)外暴露整個(gè)云端能力接口,在OPEN-API中需要能夠提供接口鑒權(quán),限流,容錯(cuò),記錄等功能,
總結(jié):
以上是近期對(duì)于物理網(wǎng)整體架構(gòu)抽象的思考,或許還不完美,但是已經(jīng)比最初不知道如何做好了很多,知識(shí)的積累在于不斷的學(xué)習(xí)、驗(yàn)證、總結(jié)再學(xué)習(xí)、驗(yàn)證、總結(jié)的無(wú)限循環(huán)。
最后,希望看到此文章的朋友能為大家?guī)ニ悸泛退伎?,也歡迎有不同見解的朋友一起探討學(xué)習(xí)。