IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 腾讯云物联网-网关设备体验 -> 正文阅读

[嵌入式]腾讯云物联网-网关设备体验

sdk代码请点击这里获取

网关设备简介

对于 BLE、Zigbee 和485等不具备直接访问网络能力的设备,需要先接入网关,然后通过网关代理,间接实现设备接入腾讯物联网开发平台 IoT Explorer,具体流程框架图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laOq4Nby-1650454646545)(https://main.qcloudimg.com/raw/f419fff3725378c770b7264ddb93b170.svg)]

那么对于一个网关设备来讲,其基本的核心功能是:

  1. 网关设备自己是一个全功能的腾讯云物联网开发平台设备。在不做子设备代理时,完全可以将网关设备当作是一个普通腾讯云物联网开发平台的设备来操作。很多初学者有个误区,网关设备是代理子设备通讯的,自身没有和平台通讯的业务,这个理解是完全错误的。举个例子:网关设备可以是一个内置了433无线收发器的WiFi智能插座,那么作为一个插座,就应该先具备插座开关的功能,然后才是代理周围433子设备上下线。

  2. 动态绑定/解绑子设备。很明显,绑定和解绑子设备就是要子设备和网关建立一个拓扑关系。举个例子:就像孩子和父亲,一个父亲可能有两三个孩子,那么这个父亲就要对孩子的衣食住行负责,而对于其他不相干的孩子,则这位父亲是不需要负责的。绑定就是相当于承认了父子关系,解绑就相当于是断绝了父子关系。当然了,在现实世界中,这种父子关系不是动态的。

  3. 代理子设备上下线。举个例子,当一个蓝牙网关扫描到附近有子设备的蓝牙广播并建立了连接后,就可以通过网关来通知云平台,当前有子设备正在活动,可以上线。同样的,当一个子设备长时间没有和这个蓝牙网关通讯且发消息不回复时(具体的离线策略可以自行定义,如:一个小时收不到子设备消息且ping不通子设备)就可以认为当前子设备离线,从而通知云平台下线子设备。

  4. 代理子设备通讯。这个功能是网关设备存在的意义,之所以需要网关设备就是代理一些无法直接接入物联网设备的数据。网关在这里就起到一个传话的功能。腾讯云物联网的网关设备是完全透传子设备的消息。举个例子,我们知道腾讯云物联网开发平台的属性是通过这个mqtt topic来传输的:

    • 数据上行 Topic(用于发布):$property/up/${productid}/${devicename}
    • 数据下行 Topic(用于订阅):$property/down/${productid}/${devicename}

    那么网关也不会重新再使用其他的topic来传输子设备的数据。换句话说,网关产品与子产品建立绑定,获取子设备的 Topic 权限后,网关设备可以使用子设备Topic代理进行收发消息,同时可以在设备调试-设备日志中查看通信信息。

  5. 代理子设备升级。子设备也有更新固件的需求,那么网关设备可以将子设备的固件从后台拉下来,然后发送给子设备升级,整个流程如图所示:

? 和普通设备升级相同的是,整个升级的流程会走普通设备升级的那一套流程,包括版本上报、升级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事件来通知有设备下线,后续不应该再上报子设备的信息到网关。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:52:42  更:2022-04-22 18:54:16 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:49:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码