相關系列文章
基于芯科Host-NCP解決方案的Zigbee 3.0 Gateway技術研究(-)-Z3GatewayHost應用搭建
基于芯科Host-NCP解決方案的Zigbee 3.0 Gateway技術研究(二)-使用gateway-management-ui
概要
Host-NCP環境搭建好后,怎么測驗驗證zigbee功能,怎么將Host集成到自己的應用中,應該是大部分使用者關心的問題,芯科公司為此提供了一套基于Nodejs和ReactJS的Web應用例子“gateway-management-ui”來指引開發,如下圖所示,通過web可視化界面,使用者可以簡單、快捷地體驗ZigBee的各種功能,主要包括:網路配置、網路開放、設備加入、設備資訊查看、設備控制、設備屬性讀取、設備應用系結等;大部分功能都是基于芯科ZigBee 插件應用實作的,穩定性和可用性都比較高,“久經考驗”,

本人覺得使用“gateway-management-ui”,對使用者來說,有以下幾點意義:
1.理解Host作為外部應用和ZigBee應用之間的一座橋梁,應當怎么為上層應用提供服務能力;(從整體架構設計的角度,理解Host的定位)
2.理解應用如何從依賴于callback回呼的編程模式,轉變為通過mqtt方式實作“訂閱“-“發布”的編程模式;(移動互聯網、云端應用的概念)
3.有助于使用者更加快速地將應用與各大物聯網平臺對接,(微信、阿里等)
軟體架構
在《ug129-zigbee-gateway-ref-design-guide.pdf》檔案中的第4章節,有具體的描述,

軟體安裝
1.gateway-management-ui最新版本可以在https://github.com/SiliconLabs/gateway-management-ui獲取;
2.gateway-management-ui運行,需要nodejs、npm環境,而且對版本可能有一點要求(nodejs版本過高,可能運行失敗),
目前,在本人電腦上能正確運行的環境如下:
NodeJS: v10.15.0
npm:6.4.1
3.下載代碼后,需要分別進入nodeserver目錄、reactui目錄進行依賴安裝和應用部署(和大部分node應用一樣),具體可以參考檔案4.2.2章節,如下圖所示

特別注意:npm 安裝gulp時,需要帶上版本號@3.9.0;因為現在gulp最新版本4.x為,在語法上和3.x有較大出入;reactui中用到的是3.x的語法,所以只能安裝舊版gulp

備注:如果后續調整了reactui中的資源檔案(頁面、js或圖片等),都要執行sudo npm run build命令,重新build一下reactui專案,
軟體配置
幾個重要的組態檔:
1.mqtt服務地址和埠配置:位于nodeserver\src\common\routes\GatewayInterface.js檔案中,如下圖所示
var mqttBrokerPort = 1883;
var mqttBrokerAddress = "127.0.0.1";

2.nodeserver與reactui間socket通訊的配置:位于nodeserver\src\common\routes\SocketInterface.js檔案中,如下圖所示

備注1:socket埠需要與reactui\src\js\Config.js檔案中的埠保持一致,如下所示
備注2:socketio默認使用polling方式,如果需要支持微信小程式通訊,需要采用websocket方式,而且客戶端需要使用支持微信小程式的socketio版本
var Config = {}
Config.gatewayAddress = window.location.hostname + ':9010';
module.exports = Config;
3.nodeserver\src\common\Constants.js配置了日志目錄、ota檔案存放目錄、外部程式目錄(包括installcode生成key的外部程式路徑),如下圖所示

ZigBee功能驗證
1.網路配置
點擊網路配置按鈕

設定好網路引數(通道、PANID),accept后,可以看到新的網路生效,(界面顯示先停止已有網路,然后新的網路生效)


在Z3GatewayHost的命令列面板可以到以下日志:

說明Host收到mqtt的命令后,轉換為呼叫對應插件命令,在配置網路的操作中,主要的mqtt命令為
{"commands":[{"command":"plugin device-table clear"},{"command":"plugin command-relay clear","postDelayMs":100},{"command":"plugin ias-zone-client clear-all","postDelayMs":100},{"command":"plugin groups-server clear","postDelayMs":100},{"command":"plugin scenes clear","postDelayMs":100}]}
{"commands":[{"command":"network leave","postDelayMs":1000},{"command":"plugin network-creator form 0x1 0x6D17 -2 0x14"}]}
2.設備入網
點擊新增ZigBee設備按鈕,打開網路,(界面提示設備180秒的入網倒計時)

讓終端設備按正常進行加網請求,可以看到設備正常入網,Z3GatewayHost日志如下:

設備加入網路后的展示

在Z3GatewayHost 的命令列下,通過plugin device-tables print命令可以看到已經加入的設備

在抓包軟體中可以看到整個入網流程日志

在設備入網的操作中,主要的mqtt命令為
{"commands":[{"command":"plugin network-creator-security open-network","postDelayMs":100}]}
3.設備屬性讀取
ZigBee一個優勢是在傳感器領域指定了一套規范,包括對設備屬性的讀寫、對設備的控制等,從而能實作不同廠家設備間“互聯互通、資料共享”(理論上),而其中zcl是實作這些功能的最主要手段,
在gateway-management-ui中可以在“Home”標簽頁下面,看到相關設備的屬性,例如下圖所示的溫度傳感器顯示的溫度,終端的manufacturer name,這些屬性都是通過標準的zcl方式進行讀取,

無論你的模組是efr32的,還是cc2530的,或者其他廠家的;都能通過zcl進行設備控制,(后面專門寫一篇cc2530和efr32在實作同一個zigbee功能中的差異性)

所以,這里應當作為重點來分析掌握一下,
流程分析:reactUI界面-》node server-》host-》ncp
關鍵代碼分析如下:
1)reactUI界面:gateway-management-ui\reactui\src\js\actions\ServerActions.js中的requestNodeAttribute方法,
從方法的實作可以看到,它是通過socket方式(前面提到的9010埠),發送請求和引數給nodeserver(json格式的socket呼叫,socketIO)

2)nodeserver:reactUI發送的socket請求,會在gateway-management-ui\nodeserver\src\common\controller\DeviceController.js中的onSocketAction方法j進行處理,

找到requestattribute,可以看到是呼叫ServerActions.GatewayInterface.zigbeeRequestAttribute方法,

zigbeeRequestAttribute方法位于gateway-management-ui\nodeserver\src\common\actions\ServerActions.js中,打開可以看到,它的實作是將命令和引數轉換為json格式,然后通過mqtt發布到對應的topic上,

重點:reactUI和nodeserver中的ServerAction.js都是重要的入口和處理檔案,大部分邏輯和實作,都可以在這里找到,
3)host:因為host在ncp啟動后,會通過mqtt方式訂閱commands主題(具體的代碼分析,在后一章esp32移植中再詳細描述),這個可以從host啟動的日志看到:
Subscribing to topic "gw/60A423FFFE068C75/commands" using QoS2
Subscribing to topic "gw/60A423FFFE068C75/publishstate" using QoS2
Subscribing to topic "gw/60A423FFFE068C75/updatesettings" using QoS2
所以上面nodeserver發布的命令,host會通過mqtt接收到,然后通過呼叫插件方式或者底層api方式,將zcl命令發送給ncp(通過ezsp協議),進行zigbee操作(具體的代碼分析,在后一章esp32移植中再詳細描述),
4)ncp:ncp收到命令,處理完后,回傳處理結果給host(這個程序可能是異步的?);
那么,host怎么將結果通知給前端?答案,也是mqtt的“訂閱”-“發布”
host通過mqtt方式,將處理ncp結果發布到zclresponse主題,所以只要是訂閱了gw/60A423FFFE068C75/zclresponse的客戶端(reactUI也好,VUE也好、微信小程式也好)都可以收到
如下圖所示

在nodeserver后臺,也可以看到對應的日志輸出(nodeserver做了一些資料轉換、格式化的作業)

在設備屬性讀取的操作中,主要的mqtt命令為
{"commands":[{"command" :"zcl global direction 0"},{"command":"zcl global read 1024 0"},{"command":"plugin device-table send {000B57FFFE097874} 1","postDelayMs":100}]}
調整的地方:
1)在除錯中發現gateway-management-ui\nodeserver\src\common\actions\ServerActions.js中的publishCommandListThrottled方法,并沒有真的把資料發送到mqtt,所以先調整為直接呼叫GatewayInterfaceSend.publishCommandList(commandlist);

2)當zclresponse回傳屬性的資料型別為String的時候,nodeserver處理不正確(例如:獲取manufacturer name中的字串值),先暫時改為呼叫自定義方法得到字串
位于nodeserver中的DeviceController.js檔案中的onAttributeUpdate方法

4.設備控制
設備控制主要指開、關這些常規的zcl操作,其實原理和上面設備屬性讀取一致,所以就不在這里詳細描述了,
入口還是在reactUI的ServerAction.js中,它已經封裝好比較細粒度的操作了,如下圖所示,

在設備控制的操作中,主要的mqtt命令為:
{"commands":[{"command":"zcl on-off on"},{"command":"plugin device-table send {00124B00213CCA01} 0x8"}]}
5.設備report引數配置
在設備report中,有幾個地方要注意:
1.設備終端要打開report功能,具體而言:
對于efr32要在plugin勾選Reporting插件,如下圖所示

對應cc2530,要配置BDB_REPORTING編譯條件

2.先將網關和reporting 終端系結:
mqtt命令如下:
{"commands":[{"command" :"zdo bind 0x434C 1 1 0x0400 {000B57FFFE097874} {0022A30000115EDA }"},{"command ":"plugin device-table send {000B57FFFE097874} 1","postDelayMs":100}]}
備注:以上這些zcl命令、zdo命令格式,都可以在《ug129-zigbee-gateway-ref-design-guide.pdf》的第4.3 Z3GatewayMqtt Application章節找到
簡單記錄一下自己用到的命令
#######light 終端##############
// 系結終端
// zdo bind 終端短地址 終端endpoint 網關endpoint 終端clusterid 終端eui 網關eui
zdo bind 0x3CEE 8 1 0x0006 {60A423FFFE091C85} {60A423FFFE0B648E}
// 設定終端屬性上報配置
// zcl global send-me-a-report 終端clusterid 屬性id 資料型別 最小上報周期 最大上報周期 變化值
zcl global send-me-a-report 0x0006 0x0000 0x10 0x0001 0x708 {00 01}
開關狀態上報配置:最小上報時間1秒,最大上報時間1800秒 0x10代表ZCL_BOOLEAN_ATTRIBUTE_TYPE資料型別
plugin device-table send {60A423FFFE091C85} 8
######switch 終端#################
zcl global send-me-a-report 0x0402 0x0000 0x29 0x0001 0x3c {00}
溫度值上報配置:最小上報時間1秒,最大上報時間60秒 0x29代表ZCL_INT16S_ATTRIBUTE_TYPE資料型別
plugin device-table send {60A423FFFE0B6A52} 8
查看設備系結表
option binding-table print
相關抓包截圖

6.設備OTA
需要了解efr32終端OTA的,可以參考以下文章(感謝相關文章作者的分享,在此借以參考參考,如有涉及著作權問題,請及時聯系我);
https://blog.csdn.net/weixin_42160773/article/details/101284109
在Z3GatewayHost專案的build/exe目錄下,會自動生成一個終端ota檔案存放的目錄ota-files

這個目錄的配置是在芯科SDK中protocol\zigbee\app\framework\plugin\ota-storage-posix-filesystem\ota-storage-linux.c檔案中,如下圖所示,

只要把終端的ota檔案保存到放在這里,然后設備入網后過一段時間即可自動進行ota;也可以通過cli命令方式,指定終端開始ota操作
這里,只記錄一下ota相關的一些命令;
#終端
plugin ota-client start
#host端
plugin ota-storage-common printImages
plugin ota-storage-common reload
后面esp32移植中再詳細講述怎么通過esp32到外網下載ota,存盤在flash中,然后通知終端進行ota,并測驗多終端一起ota的場景,
備注:
終端設備的bootloader型別需要選擇“Local storage”,如果是默認配置,可能出現ota完后,設備不能自動重啟的現象,

總結
- 通過使用gateway-management-ui,有助于了解整個Host-NCP架構;對于需要云端部署、對接互聯網平臺、對接第三方物聯網平臺的場景,有很好的參考價值;
- 在使用Host-NCP解決方案的時候應當遵循芯科的設計思想:優先使用“訂閱”-“發布”的編程模式,減少對callback的依賴,要有面向云端和移動互聯網的架構設計思想,專注于應用層面的使用,實作各層間的解耦和賦能,
- 芯科解決方案的優勢,是它擁有很多“久經考驗”的插件;我們在實作業務場景的時候應當盡量復用這些插件;而不是去大量呼叫底層的api(不要覺得自己寫的代碼比芯科的開發人員強);
- 用好Host-NCP比將Host移植到不同平臺更加重要,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274472.html
標籤:其他
