腾讯云物联网-网关设备体验
sdk代碼請點擊這里獲取
網關設備簡介
對于 BLE、Zigbee 和485等不具備直接訪問網絡能力的設備,需要先接入網關,然后通過網關代理,間接實現設備接入騰訊物聯網開發平臺 IoT Explorer,具體流程框架圖如下:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-laOq4Nby-1650454646545)(https://main.qcloudimg.com/raw/f419fff3725378c770b7264ddb93b170.svg)]
那么對于一個網關設備來講,其基本的核心功能是:
網關設備自己是一個全功能的騰訊云物聯網開發平臺設備。在不做子設備代理時,完全可以將網關設備當作是一個普通騰訊云物聯網開發平臺的設備來操作。很多初學者有個誤區,網關設備是代理子設備通訊的,自身沒有和平臺通訊的業務,這個理解是完全錯誤的。舉個例子:網關設備可以是一個內置了433無線收發器的WiFi智能插座,那么作為一個插座,就應該先具備插座開關的功能,然后才是代理周圍433子設備上下線。
動態綁定/解綁子設備。很明顯,綁定和解綁子設備就是要子設備和網關建立一個拓撲關系。舉個例子:就像孩子和父親,一個父親可能有兩三個孩子,那么這個父親就要對孩子的衣食住行負責,而對于其他不相干的孩子,則這位父親是不需要負責的。綁定就是相當于承認了父子關系,解綁就相當于是斷絕了父子關系。當然了,在現實世界中,這種父子關系不是動態的。
代理子設備上下線。舉個例子,當一個藍牙網關掃描到附近有子設備的藍牙廣播并建立了連接后,就可以通過網關來通知云平臺,當前有子設備正在活動,可以上線。同樣的,當一個子設備長時間沒有和這個藍牙網關通訊且發消息不回復時(具體的離線策略可以自行定義,如:一個小時收不到子設備消息且ping不通子設備)就可以認為當前子設備離線,從而通知云平臺下線子設備。
代理子設備通訊。這個功能是網關設備存在的意義,之所以需要網關設備就是代理一些無法直接接入物聯網設備的數據。網關在這里就起到一個傳話的功能。騰訊云物聯網的網關設備是完全透傳子設備的消息。舉個例子,我們知道騰訊云物聯網開發平臺的屬性是通過這個mqtt topic來傳輸的:
- 數據上行 Topic(用于發布):$property/up/${productid}/${devicename}
- 數據下行 Topic(用于訂閱):$property/down/${productid}/${devicename}
那么網關也不會重新再使用其他的topic來傳輸子設備的數據。換句話說,網關產品與子產品建立綁定,獲取子設備的 Topic 權限后,網關設備可以使用子設備Topic代理進行收發消息,同時可以在設備調試-設備日志中查看通信信息。
代理子設備升級。子設備也有更新固件的需求,那么網關設備可以將子設備的固件從后臺拉下來,然后發送給子設備升級,整個流程如圖所示:
? 和普通設備升級相同的是,整個升級的流程會走普通設備升級的那一套流程,包括版本上報、升級url的獲取等等。但是,和普通設備升級不同的是,子設備升級需要網關設備先將子設備的固件存起來,然后通過私有協議(可以是BLE zigbee 433等等)將固件發送給子設備,獲取子設備的升級狀態后,再將升級的結果告訴云平臺。
具體的網關子設備拓撲關系管理協議,請點擊這里獲取。
網關設備代碼設計
了解了網關設備的功能,我們來思考一下網關設備代碼如何設計,然后來看看騰訊云物聯網開發平臺的設備端sdk是如何設計網關功能的。
首先,子設備的數量是未知的,可能有的網關會帶3個子設備,有的可能會帶30個,所以網關設計的時候,就需要考慮使用列表功能來管理子設備。其次,網關設備必須具備管理子設備的功能,即可以代理子設備的綁定解綁、上下線數據通訊等;這就需要維護子設備的狀態。我們來看一下網關結構體的構造:
typedef struct {void *mqtt_client; // 網關是基于mqtt協議來設計,這里維護一個mqtt客戶端MQTTEventHandler evt_handle; // 子設備事件回調,包括綁定/解綁 上下線等通知用戶GatewayClientPriv *priv; // 子設備鏈表void *event_context; // 回調參數gateway_event_handle_cb_t gateway_evt_cb; // 回調函數char gateway_pub_topic[MAX_SIZE_OF_GATEWAY_PUB_TOPIC]; // store gateway pub topic } GatewayClient;我們再來看一下子設備的結構體構造:
typedef enum {GATEWAY_SUBDEV_STATUS_ONLINE = 0,GATEWAY_SUBDEV_STATUS_OFFLINE, } GatewaySubStatus; // 子設備結構體 typedef struct {DeviceInfo dev_info; // 子設備信息,包括子設備的產品ID 設備名稱等等GatewaySubStatus status; // 子設備狀態int is_binded; // 是否已經綁定void *node; // 鏈表 } GatewaySub;Demo日志分析
網關設備上電后,會使用自己的三元組信息連接騰訊云物聯網開發平臺
INF|2022-04-20 17:48:42|mqtt_client.c|_qcloud_iot_mqtt_client_init(213): SDK_Ver: 4.0.0, Product_ID: 40FA6IALWV, Device_Name: gateway001 DBG|2022-04-20 17:48:42|qcloud_iot_tls_client.c|qcloud_iot_tls_client_connect(212): Setting up the SSL/TLS structure... DBG|2022-04-20 17:48:42|qcloud_iot_tls_client.c|qcloud_iot_tls_client_connect(252): Performing the SSL/TLS handshake... DBG|2022-04-20 17:48:42|qcloud_iot_tls_client.c|qcloud_iot_tls_client_connect(253): Connecting to /40FA6IALWV.iotcloud.tencentdevices.com/8883... DBG|2022-04-20 17:48:43|qcloud_iot_tls_client.c|qcloud_iot_tls_client_connect(281): connected with /40FA6IALWV.iotcloud.tencentdevices.com/8883... INF|2022-04-20 17:48:43|mqtt_client.c|IOT_MQTT_Construct(329): mqtt connect with id: C81F6 success INF|2022-04-20 17:48:43|gateway_sample.c|main(303): Cloud Device Construct Success連接成功后,會訂閱網關topic,接受網關下行消息
DBG|2022-04-20 17:48:43|mqtt_client_subscribe.c|qcloud_iot_mqtt_subscribe(329): subscribe topic_name=$gateway/operation/result/40FA6IALWV/gateway001|packet_id=7041 INF|2022-04-20 17:48:43|gateway_sample.c|_mqtt_event_handler(75): subscribe success, packet-id=7041發送describe_sub_devices消息,從云平臺拉取當前網關設備的拓撲關系
DBG|2022-04-20 17:48:43|mqtt_client_publish.c|qcloud_iot_mqtt_publish(264): publish qos=0|packet_id=0|topic_name=$gateway/operation/40FA6IALWV/gateway001|payload={"type":"describe_sub_devices"}云平臺回復:
DBG|2022-04-20 17:48:43|gateway_message_handle.c|gateway_message_handler(204): receive gateway message {"type":"describe_sub_devices","payload":{"devices":[{"product_id":"KRLT1QGQW5","device_name":"subdev001"},{"product_id":"KRLT1QGQW5","device_name":"subdev002"},{"product_id":"KRLT1QGQW5","device_name":"subdev003"},{"product_id":"KRLT1QGQW5","device_name":"subdev004"}]}}當前有四臺子設備已經和網關設備綁定。
綁定子設備
綁定子設備需要網關設備知道子設備的三元組信息,這個三元組信息可以從子設備獲取,或者從云平臺獲取。獲取到三元組信息后,需要網關設備本地做一個簽名,生成signature字段。
DBG|2022-04-20 17:48:43|gateway_sub_manage.c|IOT_Gateway_AddSub(332): Add 0x5647bd29fb70 KRLT1QGQW5:subdev006 DBG|2022-04-20 17:48:43|mqtt_client_publish.c|qcloud_iot_mqtt_publish(264): publish qos=0|packet_id=0|topic_name=$gateway/operation/40FA6IALWV/gateway001|payload={"type":"bind", "payload":{"devices":[{"product_id":"KRLT1QGQW5","device_name":"subdev006","signature":"+j45scCBXI9qCDioF7m1NB4VuOU=","random":1603981974,"timestamp":1650448123,"signmethod":"hmacsha1","authtype":"psk"}]}}云平臺回復:
DBG|2022-04-20 17:48:43|gateway_message_handle.c|gateway_message_handler(204): receive gateway message {"type":"bind","payload":{"devices":[{"result":0,"product_id":"KRLT1QGQW5","device_name":"subdev006"}]}} INF|2022-04-20 17:48:43|gateway_message_handle.c|gateway_message_handler(211): Get type 2 from server DBG|2022-04-20 17:48:43|gateway_message_handle.c|_gateway_down_array_result_parse(113): bind device KRLT1QGQW5:subdev006 INF|2022-04-20 17:48:43|gateway_sample.c|_mqtt_event_handler(111): gateway topology changed --- subdev KRLT1QGQW5:subdev006 change to binded同時我們也收到一條_mqtt_event_handler事件來通知有新設備加入當前網關設備的拓撲關系。當此設備上線后,就可以正常代理此子設備進行通訊了。
解綁子設備
解綁就比較簡單,直接發送需要解綁的設備列表給云平臺即可,同時本地也要更新拓撲關系
DBG|2022-04-20 17:49:02|mqtt_client_publish.c|qcloud_iot_mqtt_publish(264): publish qos=0|packet_id=0|topic_name=$gateway/operation/40FA6IALWV/gateway001|payload={"type":"unbind", "payload":{"devices":[{"product_id":"KRLT1QGQW5","device_name":"subdev006"}]}}云平臺回復:
DBG|2022-04-20 17:49:02|gateway_message_handle.c|gateway_message_handler(204): receive gateway message {"type":"unbind","payload":{"devices":[{"product_id":"KRLT1QGQW5","device_name":"subdev006","result":0}]}} INF|2022-04-20 17:49:02|gateway_message_handle.c|gateway_message_handler(211): Get type 3 from server DBG|2022-04-20 17:49:02|gateway_message_handle.c|_gateway_down_array_result_parse(117): del device KRLT1QGQW5:subdev006 INF|2022-04-20 17:49:02|gateway_sample.c|_mqtt_event_handler(111): gateway topology changed --- subdev KRLT1QGQW5:subdev006 change to unbinded同時收到一條_mqtt_event_handler事件來通知有設備解綁,后續不應該再將此設備的消息通過網關代理。
代理子設備上線
DBG|2022-04-20 17:48:45|mqtt_client_publish.c|qcloud_iot_mqtt_publish(264): publish qos=0|packet_id=0|topic_name=$gateway/operation/40FA6IALWV/gateway001|payload={"type":"online", "payload":{"devices":[{"product_id":"KRLT1QGQW5","device_name":"subdev001"}]}}當前子設備成功上線后,就可以和云平臺做數據交互了。
代理子設備下線
DBG|2022-04-20 17:48:51|mqtt_client_publish.c|qcloud_iot_mqtt_publish(264): publish qos=0|packet_id=0|topic_name=$gateway/operation/40FA6IALWV/gateway001|payload={"type":"offline", "payload":{"devices":[{"product_id":"KRLT1QGQW5","device_name":"subdev001"}]}} DBG|2022-04-20 17:48:51|gateway_sample.c|_test_array_cb(243): test return 0 DBG|2022-04-20 17:48:51|gateway_message_handle.c|gateway_message_handler(204): receive gateway message {"type":"offline","payload":{"devices":[{"product_id":"KRLT1QGQW5","device_name":"subdev001","result":0}]}} INF|2022-04-20 17:48:51|gateway_message_handle.c|gateway_message_handler(211): Get type 1 from server INF|2022-04-20 17:48:51|gateway_sample.c|_mqtt_event_handler(117): gateway status changed --- subdev KRLT1QGQW5:subdev001 change to offline同時收到一條_mqtt_event_handler事件來通知有設備下線,后續不應該再上報子設備的信息到網關。
總結
以上是生活随笔為你收集整理的腾讯云物联网-网关设备体验的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 游戏暂停
- 下一篇: Directory Opus一款功能强大