摘要:IoT, Internet of Things,物聯網,顧名思義,是物物相連。而要實現“物物相連”,一共有3個階段性任務,而這3個階段性任務,也伴隨著巨大的挑戰
本文分享自華為雲社群《【雲駐共創】以小窺大,從一盞路燈看億萬物聯網之路》,作者: 啟明。
物聯網的必然趨勢與巨大挑戰
在介紹華為雲IoT裝置接入管理服務業務之前,我們需要先了解“IoT”是什麼。
IoT, Internet of Things,物聯網,顧名思義,是物物相連。而要實現“物物相連”,一共有3個階段性任務,而這3個階段性任務,也伴隨著巨大的挑戰:
階段一:讓“物”說話。
正如嬰兒要融入世界,需要會說話一樣,我們的“物”也需要能夠與外界交流。感知物理世界,變成數字訊號:讓萬物可以感知溫度、空間、五覺,並且將自己感知到的進行資料化。在這資料化的過程中,我們發現如下挑戰:
• 大量現存裝置未被數字化;
• 多樣化裝置、各種行業協議、各種通訊網路;
• 裝置要求低功耗、低成本;
• 裝置安全問題突出
階段二:讓“物”說一種話
嬰兒光會說話是不行的,要能夠和外界交流,還需要和外界使用共同的語言。對於“物”也是一樣,我們需要將數變成Online,提供標準化資料,讓外部能夠理解“物”說的話。而這就需要有廣聯接和多協議接入,並且資料標準化,統一物模型。可是,現狀卻是:
• 百萬中資料元素,缺乏標準和規範;
• 多樣化資料格式
• 各廠商煙囪式發展,資料孤島林立,資料互通困難
階段三:讓“物”時候有價值的話
在可以用同一種語言溝通的基礎上,我們還需要讓嬰兒說有價值的話,才能夠實現高效溝通。對於“物”而言,亦是如此。尤其是在“物”的世界,我們需要解決海量資料處理和分析,因此對算力的要求極高,並且要求實時性。最終的結果就是行業數字化、數字化行業。但是,正如前面說到的:
• 海量資料帶來算力、儲存問題;
• 實時流、時序、離線、多維分析複雜;
• 行業應用場景的複雜性;
• 商業閉環、價值變形和分配問題
以小窺大,從一盞路燈,看萬物互聯世界
首先,讓我們在腦海裡描繪一盞路燈的樣子,你是不是覺得很簡單?
我們來回顧一下路燈的發展史:
從五六十年代的時間控制器+本地迴路控制,定時開關,最簡單的邏輯處理關係;到70年代,加上光電控制器,稍微“聰明”了一些,能夠感知周圍的光感強度,從而調節開關,但是此時還只是在本地迴路控制;而到了90年代,已經可以基於無線專網的三遙監控系統,實現遠端迴路控制;最後再到現在,基於物聯網技術的智慧化系統,實現資訊融合、智慧場景和應用擴充,從而實現智慧照明場景(如上圖)。
可以看到,智慧場景下的智慧路燈,搭載了許多智慧裝置,諸如監控元件、LED螢幕、集中控制器、電動汽車充電樁等等,讓一盞路燈實現一個路面能實現的基本功能。
以上,就是一盞燈的智慧之路,在這個過程中,物聯網技術發揮了極大的作用,讓一個單定時控制的路燈,一步步具有多場景、多應用的功能,最後演變為智慧路燈。
而華為雲IoT裝置接入管理服務,正是基於此技術。
華為雲IoT裝置接入管理服務介紹
首先,我們對物聯網要有一個正確的認知:物聯網是由多個服務組成的,而非單一的服務。下圖是一個整體的物聯網解決方案。
在圖左側,是裝置,體現的是我們前面說到的:讓裝置說話、讓裝置時候同一種話、讓裝置有說價值的話。那麼,我們首先要讓這些裝置能夠“被”感知到,在這個過程中,我們通過物聯網作業系統(LiteOS)或者SDK使能,使其智慧化;然後感知到的東西以資料的形式通過閘道器、邊緣閘道器或者直連的方式上傳。具體要上傳到哪裡呢?
考慮到裝置的海量問題,我們需要有一個物聯網平臺。資料通過前面所說的方式上傳至物聯網平臺中的裝置接入服務。在裝置接入服務,可以實現多網路接入、多協議接入、裝置影子等等多種功能;而在整體物聯網平臺上,還包括全球SIM連線、裝置發放、資料分析等等服務。
在圖右側,更能對接華為雲的其他產品,諸如DIS/DCS/OBS等等,幫助客戶快速構築滿足客戶要求的物聯網應用,如智慧城市、智慧園區、車聯網等等。
迴歸到技術本身。我們前面聊到,不同的裝置,都可以通過華為雲裝置接入服務接入,但實際上,他們的接入方式和接入協議都是不一樣的,那麼華為雲裝置接入服務又是怎麼遮蔽底端差異,實現裝置接入的呢?
我們首先來看下面這張圖:
通訊模型:在華為雲裝置接入服務裡,定義了“通訊模型”。同樣以我們之前說的嬰兒說話為例。人與人之間的溝通,雖然語言有很多種,但是表達的方式還是主要以聲音(說話)或者視覺(手語)為主。而物與物之間,同樣的,主要的內容也主要是幾類:命令下發、命令相應、屬性裝置等等。
裝置影子:而在此基礎之上,我們還有“裝置影子”這一概念。物聯網平臺支援建立裝置的“影子”。裝置影子是一個JSON檔案,用於儲存裝置的線上狀態、裝置最近一次上報的裝置屬性值、應用伺服器期望下發的配置。每個裝置有且只有一個裝置影子,裝置可以獲取和設定裝置影子以此來同步裝置屬性值,這個同步可以是影子同步給裝置,也可以是裝置同步給影子。
通用協議接入層:在具備“通訊模型”以後,我們需要把裝置資料和通訊模型進行關聯,而進行關聯的就是“通用協議接入層”。通過通訊協議接入層,我們可以將不同的協議型別(如MQTT/CoAP/TCP等等)上的不同資料轉化到通訊模型上。
編解碼處理:一款產品的裝置上報資料時,如果“資料格式”為“二進位制碼流”,則該產品需要進行編解碼外掛開發;如果“資料格式”為“JSON”,則該產品下不需要進行編解碼外掛開發。
以NB-IoT場景為例,NB-IoT裝置和物聯網平臺之間採用CoAP協議通訊,CoAP訊息的payload為應用層資料,應用層資料的格式由裝置自行定義。由於NB-IoT裝置一般對省電要求較高,所以應用層資料一般不採用流行的JSON格式,而是採用二進位制格式。但是,物聯網平臺與應用側使用JSON格式進行通訊。因此,需要開發編碼外掛,供物聯網平臺呼叫,以完成二進位制格式和JSON格式的轉換。
華為雲IoT裝置接入管理服務雲化架構解讀
IoT裝置接入管理服務架構
在講解整個框架之前,我們首先要明確的是,華為雲IoT裝置接入服務內部,實際上是基於Cloud Native(雲原生)的微服務的一個架構。裡面所有業務相關的服務,都是無狀態的。無狀態的服務就意味著可以隨時被建立,也可以隨時被kill掉。
也就是說,即使任何一個服務例項出現問題,都可以通過建立服務來保證業務的無損。同時在海量併發的情況下,通過彈性的縮、擴容,能夠使服務滿足對應業務量的需求。
在基於無狀態服務的框架下,除了負載均衡層(目的是為了讓海量的裝置能夠接入到服務中),上面可以分為兩層:
一層是CIG雲通訊閘道器層,這一層實際上是將各種各樣的裝置的不同的協議和不同的資料格式轉換成統一的模型;
另一層是連線&管理業務服務:資料和協議轉換成統一的模型,流轉到這一層後,由業務服務來做處理,比如說訊息流轉推送、裝置影子、規則引擎服務,以及任務管理服務等等。
更上層是公有云支撐管理服務:通過公有云的支撐服務,像CBC/IAM/SMN等等來整體構建裝置接入管理服務。
以上就是裝置技術管理服務的一個大致的框架。通過此框架可以瞭解內部的業務處理邏輯,有助於大家理解後續我們的沙箱實驗體驗。
產品模型(Profile)-統一的資料&通訊模型
產品模型,也就是常說的Profile,簡單來說也就是通訊模型的對映。
上圖是如何將不同型別的資料對映到通訊模型上面的例項。
在圖左側,有3個不同的表計。雖然它們都是水錶,但是它們是由不同的廠家生產的,因此資料格式和協議也是不一樣的,那麼我們該如何採集它們的資料形成統一的格式呢?
答案就是產品模型。通過產品模型裡面不同的外掛,可以將這些不同資料轉換成相同格式的資料。對裝置廠商來說,無需修改裝置程式碼,通過外掛即可適配不同企業的訴求,降低裝置廠家的維護複雜度。而對上層應用來說,降低了上層應用對裝置管理複雜度,通過在平臺規整不同廠家的資料,形成統一的Profile,上層應用無需感知不同裝置的差異
接下來再看規則引擎。規則引擎是華為雲IoT裝置接入服務特有的能力,通過規則引擎可以實現資料流轉和裝置聯動。無縫與公有云其他服務對接,實現裝置資料按需流轉和處理;
而裝置聯動,也是基於規則引擎來實現的,由條件觸發,基於預置規則,引發多裝置協同反應,如提醒、告警、狀態報告等等。
華為雲IoT智慧路燈沙箱實驗演示
在介紹完華為雲IoT裝置接入管理服務之後,接下來然後就帶大家瞭解一下相關的沙箱實驗。
沙箱實驗介紹
智慧路燈沙箱實驗組網結構如上。為了方便大家線上完成路等試驗,我們需要有一個虛擬裝置,在此我們使用的是裝置模擬器。裝置接入平臺,上報屬性,然後接收平臺下發的命令。而在平臺上層,有一個基於華為雲軟開雲的應用層的實現。大致步驟如下:
1、通過華為雲軟體開發平臺構建一個路燈的模擬應用(真實的應用可以參考其構建的方法);
2、申請ECS雲服務,將構建的應用部署於ECS上,通過EIP對接IoT裝置接入服務,並進行訂閱通知;
3、在實驗桌面執行MQTT模擬器,模擬路燈裝置的行為
裝置模擬器
在正式開始之前,我們先看一下裝置模擬器(如下圖)。
連線引數配置區:
裝置模擬器開啟之後,開啟“MQTT裝置模擬器”頁籤。在“連線引數配置區”需要指定進入平臺的地址資訊,拿到“註冊裝置成功”或者裝置ID和裝置金鑰,並與平臺建立連線;
訊息上報區:
與平臺建立連線之後,裝置上報資料到平臺。下面有“訊息上報區”,可以在指定裝置上報屬性的topic之後,在下面將jason格式資料貼上進來,並進行上報;
日誌列印區:
右側是一個類似訊息跟蹤的日誌列印區域,在此可以看到訊息上報的訊息記錄,包括平臺的下發的命令,也會在這裡做一個列印跟蹤。
Topic訂閱區:
Topic訂閱區是另一個頁籤。裝置需要訂閱平臺下發命令的相關topic的時候,就可以在這裡指定topic進行訂閱。
應用實現-API介紹
在實驗桌面裡面,建立程式碼倉庫之後,可以檢視詳細的原始檔。而比較典型的幾個原始檔的實現,是對應用側API的實現,比如:
建立裝置API:src/main/java/com/huawei/service/RegisterDirectConnectedDevice.java
建立訂閱API:src/main/java/com/huawei/service/SubscribeDataChg.java
下發裝置命令API:src/main/java/com/huawei/service/CreateDeviceCommand.java
基於這些原始檔的樣例程式碼,開發人員可以再基於自己的思路,做定製化開發。
前臺web頁面佈局的關鍵檔案,就是一個index的html的原始檔,加一個 js指令碼:
頁面佈局:src/main/resources/static/index.html
指令碼檔案:src/main/resources/static/js/common.js
智慧路燈沙箱實驗實操步驟
智慧路燈沙箱實驗,分為7步:
1、編譯構建智慧路燈應用DevCloud
2、建立主題並訂閱SMN
3、建立彈性雲伺服器ECS
4、部署智慧路燈應用DevCloud
5、匯入產品模型IoTDA
6、配置智慧路燈應用Web
7、結果驗證
開發者在登入華為雲賬號,進入沙箱實驗之後,會有上圖頁面:
左上角呈現實驗賬號,開發者拿這個實驗賬號在實驗桌面裡面通過firefox瀏覽器登入華為雲,並通過控制檯進入到各個服務。
賬號下有 step by step的實驗步驟指導,按照步驟操作即可。
右上角有一個完成進度顯示,實時重新整理,可以得到進度顯示和實驗倒數計時。
在左側部分,有一些相關的命令執行,可以方便大家執行的時候快速拷貝。
由於時間限制,我們省略前面簡單的1~4步,從第5步然後建立產品開始,正常後面的正式實驗過程中。
PS:前面1~4步過程中需要注意的事項是在建立主題並訂閱的時候,平臺會傳送一個確認的簡訊到使用者手機上,使用者需要檢視簡訊,點選裡面的連結,確認之後才能完成實際的訂閱。
接下來,我們正式進入實驗操作:
匯入產品模型:
建立產品
在華為雲控制檯,展開左側導航,選擇“服務列表”-> “物聯網”->“裝置接入IoTDA”,如下圖所示:
在左側欄中選擇“產品”,點選“建立產品”,引數如下:
①所屬資源空間:Default_APP_Sandbox_user_iot
②產品名稱:自定義,如:StreetLight
③協議型別:MQTT
④資料格式:JSON
⑤廠商名稱:自定義,如:Huawei_IoT
⑥裝置型別:自定義,如:StreetLight
填寫完成,點選“立即建立”,產品建立成功,請記錄“產品ID”資訊,並檢視“詳情”。
上傳模型檔案
點選建立的產品進入詳情,然後點選“上傳模型檔案”,選擇SmartStreetLight.zip檔案,點選“確認”完成上傳。
配置智慧路燈應用(訂閱推送方案)
訪問智慧路燈Web介面
新建瀏覽器標籤頁,輸入http://EIP:8080/index.html(使用步驟3.2中彈性雲伺服器的彈性公網IP替換地址中的“EIP”),訪問智慧路燈Web頁面。
引數設定
在彈出的“引數設定”視窗,引數填寫如下:
①資料來源:引數設定頁面下拉框選擇“訂閱推送”。
②本機IP:“控制檯”->“服務列表”->“計算”->“彈性雲伺服器ECS”進入伺服器列表,進行檢視並複製彈性公網IP。
③主題URN:“控制檯”->“服務列表”->“管理與監管”->“訊息通知服務SMN”進入主題列表,進行檢視並複製主題URN。
④APPID:“控制檯”->“服務列表”-> “物聯網”->“裝置接入IoTDA”,在左側導航欄選擇“資源空間”,複製獲取產品所需的“APPID”。
⑤賬號名:系統為您分配的華為雲實驗賬號名。
⑥IAM使用者名稱:系統為您分配的華為雲實驗使用者名稱。
⑦IAM使用者密碼:系統為您分配的華為雲實驗密碼。
⑧專案ID:控制檯在右上角使用者名稱下拉框中選擇“我的憑證->API憑證”頁面複製獲取所屬區域為“華北-北京四”的專案ID。
⑨產品ID:“控制檯”->“服務列表”-> “物聯網”->“裝置接入IoTDA”,在左側導航欄選擇“產品”,複製獲取產品所需的“產品ID”。
填寫完成後點選“確定”,彈窗提示如下,表示引數設定成功。
註冊裝置
輸入裝置標識(自定義,如123456789f),點選“註冊裝置”。
彈窗提示如下,表示註冊裝置成功。請記錄“裝置Id”和“金鑰”資訊,用於後續驗證。
注意:請記錄裝置id以及金鑰,便於後期使用!
裝置註冊成功後是“未啟用”狀態,請選擇“服務列表”-> “物聯網”->“裝置接入服務”,在左側欄選擇“裝置 > 所有裝置”,點選裝置標識碼進入,檢視裝置Id,或修改金鑰。
結果驗證(裝置屬性上報/訂閱/裝置命令下發)
模擬器與平臺建立連線
開啟MQTT裝置模擬器
在實驗桌面雙擊“Xfce終端”開啟Terminal,執行以下命令開啟裝置接入模擬器(HubSimulator.jar),然後切換到MQTT裝置模擬器頁籤。
建立連線
在MQTT裝置模擬器頁簽下,填寫引數如下:
①服務IP:進入“服務列表”-> “物聯網”->“裝置接入IoTDA”,在左側欄選擇“總覽”,點選“平臺接入地址”。
複製使用MQTT/MQTTS接入資訊的域名。
②裝置ID:配置智慧路燈應用,註冊裝置成功後返回的裝置Id
③裝置金鑰:配置智慧路燈應用,註冊裝置成功後返回的金鑰
配置好以上引數後,點選“建立連線”按鈕。
建立連線成功後,右側日誌顯示MQTT服務連線成功,如下圖所示:
若無法建立連線,請開啟“命令提示符”視窗,輸入“ping 服務IP”檢視您的主機是否能和華為雲物聯網平臺正常通訊,若無法正常通訊,請更換主機的網路環境。
檢視裝置狀態
回到物聯網所有裝置列表( “服務列表”-> “物聯網”->“裝置”→“所有裝置”),裝置狀態變更為“線上”,如下圖所示:
模擬器裝置屬性上報
模擬器傳送訊息,上報裝置屬性。
①在模擬器視窗中的Topic欄中輸入以下程式碼:$oc/devices/{device_id}/sys/properties/report,其中的{device_id}需要替換成實際裝置ID。
$oc/devices/{device_id}/sys/properties/report
②訊息內容:
其中,光感強度可自定義,燈狀態建議為OFF。
在模擬器視窗中的訊息編輯欄中輸入以下程式碼:
{"services":[{"service_id":"Sensor","properties":{"luminance":"200","light_state":"OFF"}}]}
傳送訊息成功後,右側日誌顯示資訊推送成功(圖片僅為示意,請以實際上報資料為準)。
檢視應用介面變化
返回智慧路燈Web介面,此時顯示“環境亮度”為200LUX,“燈狀態”為關。
注意:模擬器與Web頁面之間會有短暫延遲,不用重新整理頁面,幾秒鐘後可發現頁面會隨之變化!
模擬器訂閱Topic
切換到“訂閱Topic”頁籤,並在Topic欄中輸入以下程式碼:
$oc/devices/{device_id}/sys/commands/#,其中的{device_id}需要替換成實際裝置ID。
輸入完畢後,點選“訂閱”按鈕可完成訂閱。
$oc/devices/{device_id}/sys/commands/#
訂閱成功後,右側日誌顯示訂閱Topic成功。
平臺下發裝置命令/模擬器響應
終端聯控模式配置
返回智慧路燈Web介面,“路燈控制”選擇“終端聯控模式”,開關選擇“開”,單擊“設定”,然後點選”確認”。
①若當前燈狀態為“關”,開關選擇為“開”,服務後臺會實時下發一條開燈命令,彈窗提示會有5-10秒左右延遲,請耐心等待。
②若當前燈狀態為“關”,開關選擇為“關”,不會觸發命令下發,直接彈窗提示設定成功。
即“燈狀態”與“開關選擇”一致時,不會觸發命令下發;“燈狀態”與“開關選擇”不一致時,會觸發實時命令下發。
命令接收
因為當前“燈狀態”為關,“開關選擇”為開,檢視模擬器日誌區域,會收到一條開燈命令。(payload的值經過base64加密,解密後即可得到命令內容)。
模擬器傳送訊息,上報變更後的裝置屬性。
①Topic:$oc/devices/{device_id}/sys/properties/report,其中的{device_id}需要替換成實際裝置ID。
②訊息內容:
其中,光感強度可自定義,燈狀態建議為ON。
{"services":[{"service_id":"Sensor","properties":{"luminance":"110","light_state":"ON"}}]}
檢視應用介面變化
如下圖所示,應該顯示“環境亮度”為110LUX,“燈狀態”為開。
簡訊/郵件通知
在模擬器上單擊“斷開連線”後,重複7.4.1,“路燈控制”選擇“終端聯控模式”,開關選擇“關”,單擊“設定”。
因為燈狀態為“開”,開關選擇為“關”,服務後臺會實時下發一條關燈命令;而裝置處於離線狀態,導致命令下發失敗。
此時,系統會傳送簡訊/郵件通知告知訂閱使用者命令下發失敗;通知內容為命令下發失敗的錯誤資訊。
通知示例:【華為雲】錯誤資訊:{"error_code":"IOTDA.014016","error_msg":"Operation not allowed. The device is not online."}
裝置變更為“離線”狀態,請登入華為雲控制檯,選擇“物聯網 > 裝置接入服務”,在左側導航欄,選擇“裝置 > 所有裝置”,根據裝置標識碼檢視裝置狀態。
模擬器接收反應
因為當前“環境亮度”為110LUX,“燈狀態”為開,檢視模擬器日誌區域,應該會收到關燈命令。
①若當前“環境亮度”大於“亮度閾值”,且“燈狀態”為“開”,服務後臺會實時下發一條關燈命令,彈窗提示會有5-10秒左右延遲,請耐心等待。
②若當前“環境亮度”小於“亮度閾值”,且“燈狀態”為“開”,不會觸發命令下發,直接彈窗提示設定成功。
即“環境亮度”小於“亮度閾值”,且“燈狀態”為“開”或“環境亮度”大於“亮度閾值”,且“燈狀態”為“關”時,不會觸發命令下發;反之,則會觸發實時命令下發。
模擬器傳送訊息,上報變更後的裝置屬性。
①Topic:$oc/devices/{device_id}/sys/properties/report,其中的{device_id}需要替換成實際裝置ID。
②訊息內容:
其中,光感強度<100,燈狀態為OFF。
{"services":[{"service_id":"Sensor","properties":{"luminance":"80","light_state":"OFF"}}]}
檢視Web介面
返回智慧路燈Web介面,單擊“設定”,檢視模擬器日誌區域,會收到一條開燈命令。
刪除資源
刪除彈性雲伺服器 ECS
在華為雲控制檯,選擇“服務列表”-> “計算”-> “彈性雲伺服器 ECS”進入,勾選待刪除ECS伺服器,如ecs-iot,選擇“更多 > 刪除”,在彈窗中請勾選刪除彈性公網IP和資料盤後,點選“是”完成刪除。
刪除裝置接入服務 IoTDA
在華為雲控制檯,選擇“服務列表”->“物聯網”->“裝置”→“所有裝置”進入所有裝置列表,根據裝置標識碼刪除裝置,如123456789f。然後在左側欄選擇“產品”,刪除產品,如StreetLight。
刪除桌面下載的資源包
桌面雙擊“Xfce終端”開啟Terminal,輸入以下命令下載刪除“HubSimulator.jar”檔案。
cd Desktop/
rm HubSimulator.jar
接下來刪除“SmartStreetLight.zip”壓縮包。命令如下:
rm SmartStreetLight.zip
至此實驗體驗完畢。
總結
華為雲裝置接入服務(IoT Device Access)是華為雲的物聯網平臺,提供海量裝置連線上雲、裝置和雲端雙向訊息通訊、批量裝置管理、遠端控制和監控、OTA升級、裝置聯動規則等能力,並可將裝置資料靈活流轉到華為雲其他服務,幫助物聯網行業使用者快速完成裝置聯網及行業應用整合。全新升級後的裝置接入服務IoTDA,整合了原裝置接入服務和裝置管理服務的功能。
感興趣就來一起體驗一下吧~ https://www.huaweicloud.com/p...