网关与子设备功能
物联网平台支持设备直连,也支持设备挂载在网关上,作为网关的子设备,由网关直连。
适用场景
适用于子设备不能直连或者需要拓扑关系管理的场景,如接入Wi-Fi网关、蓝牙网关、ZigBee网关等。
方案优势
平台可以帮助您管理子设备、子设备与网关的拓扑关系,对子设备进行监控运维等, 同时您的业务系统可以直接面向子设备收发消息,上层控制端给子设备下发消息时无需感知物理拓扑结构。
网关与设备
创建产品与设备时,需要选择节点类型。平台目前支持三种节点类型:
直连设备:直连物联网平台,但不能挂载子设备的设备。
网关子设备:作为网关的子设备,由网关代理连接物联网平台。
网关设备:可以挂载子设备的直连设备。网关可以管理子设备,维持与子设备的拓扑关系,并将该拓扑关系同步到云端。
接入方式
网关连接物联网平台后,将拓扑关系同步至云端,代理子设备进行设备认证、消息上传、指令接收等与物联网平台的通信。
- 网关接入物联网平台的方法与普通设备相同。
- 子设备接入物联网平台使用一机一密的认证方式。网关获取子设备的设备证书,由网关向物联网平台上报子设备证书信息(ProductKey、DeviceName和DeviceSecret)。
子设备管理
不具备IP地址的设备无法直接连接iFLYIoT 物联网平台,需要通过网关接入到平台,网关需要集成“子设备管理”用于接入不具备IP地址的设备。
由于子设备不能与物联网平台直接通信,所以网关需要代理子设备进行子设备的身份认证、子设备上线、下线、以及数据收发等工作。当网关离线时,物联网平台不会自动更新通过该网关接入的子设备的状态,因此每次网关连接到平台时,需要将当前在线的子设备的状态更新到物联网平台。
子设备设备密钥获取
如果用户知道需要通过网关接入哪些子设备,那么可以通过在网关上提供串口、Web页面等方式将子设备的设备密钥(ProductKey、DeviceName、DeviceSecret)输入给网关,当网关发现子设备连接到网关时,直接使用子设备的设备密钥将子设备连接到物联网平台。
子设备与网关建立拓扑关系(子设备注册)
建立拓扑关系是指:在注册子设备时,网关会告知物联网平台:某个或者某几个子设备通过自己连接到物联网平台。当物联网平台收到该通知后,将会更新网关连接的子设备信息,当有消息需要发送给子设备时,物联网平台将会把子设备的消息发送给对应的网关,然后由网关将子设备的数据转发给子设备。
子设备与网关解除拓扑关系(子设备删除)
解除拓扑关系是指:在删除子设备时,网关会告知物联网平台:自己不再代理某个或某几个子设备连接到物联网平台。当网关与子设备解除拓扑关系之后,平台不会将发送给子设备的消息发送给网关。
子设备上线
网关需要告知平台自己代理的子设备的状态,如果子设备已离线,那么当平台发送QoS=0的消息给子设备时将会立即丢弃该消息;如果子设备在线,平台才会尝试将消息发送给子设备。
子设备离线
当设备与网关之间的连接断开时,网关需要告知物联网平台子设备已离线,避免网关收到发送给子设备的消息。
子设备发送消息到物联网平台
子设备通过物模型方式,先将消息发送到网关,由与物联网平台通信,可以调用IotClient_SubDeviceUploadProperties
进行属性上报或者调用IotClient_SubDeviceUploadEvents
事件上报。
子设备接收来自物联网平台的消息
由于子设备不直接与物联网平台进行通信,因此会由网关设备接收到平台下发的属性设置和服务调用,客户编程时需要解析对应设备的ProductKey、DeviceName,来区分属性设置或者服务调用是针对网关还是某个子设备。
API列表
以下是完整的子设备API列表及简要说明(详见iot_demo\include\iot_subdevice.h
和iot_demo\include\iot_client.h
)
接口名 | 说明 |
---|---|
IotSubdeviceRegister | 注册网关子设备 |
IotSubdeviceOnline | 网关子设备上线 |
IotSubdeviceOffline | 网关子设备下线 |
IotSubdeviceDelete | 删除网关子设备 |
IotSubdeviceGetTopo | 获取网关和子设备的拓扑关系 |
IotSubdeviceGetClientIDandPassword | 生成设备的上线登录ID和密码 |
IotClient_SubDeviceUploadEvents | 子设备上报事件 |
IotClient_SubDeviceUploadProperties | 子设备上报属性 |
集成讲解及代码示例
1.注册子设备
// 设备名和产品ID由外部自行获得
const IotSubDevice_t device = {
"234f5bf4e0ab",
"456"
};
// 调用注册接口,传入子设备信息;此处只注册一个设备,因此传入的个数为1
IotSubdeviceRegister(&device, 1);
2.子设备上线
// 临时数据,用于保存登录ID和密码
char client_id[128] = {0};
char password[128] = {0};
// 申请一个结构体用于传入设备的密钥和设备码,用于生成登录ID和密码
const IotLogInfo_t login = {
"191A058621744A559ABA02D19E44685F",
"00-15-5D-B0-AD-65"
};
// 调用接口获取登录ID和密码
IotSubdeviceGetClientIDandPassword(&device, &login, client_id, password);
// 登录使用的结构体
IotDeviceClient_t client = {
client_id,
password
};
// 调用接口进行设备上线
IotSubdeviceOnline(&device, &client);
4.子设备下线
// 设备名和产品ID由外部自行获得
const IotSubDevice_t device = {
"234f5bf4e0ab",
"456"
};
// 调用接口进行设备下线
IotSubdeviceOffline(&device);
5.获取网关与子设备的拓扑关系
// 调用接口获取拓扑关系
IotSubdeviceGetTopo();
6.删除子设备
// 设备名和产品ID由外部自行获得
IotSubDevice_t device = {
"3c1e25bd34d3",
"123"
};
// 调用接口进行删除子设备
IotSubdeviceDelete(&device);
7.上报设备属性
#define UUID_LEN 37
// 申请一个字符数组用于保存此次会话ID
char *mid[UUID_LEN] = {0};
// 将要上报的属性构造为Json格式
cJSON *params = cJSON_CreateObject();
cJSON_AddNumberToObject(params, "WorkMode", 3);
// 调用接口进行属性上报
int ret = IotClient_SubDeviceUploadProperties(params, &mid, &device);
8.上报设备事件
与上报属性流程类似,不再赘述。
9.获取属性设置和服务调用
子设备与普通设备使用同一个回调接口用来获取物联网平台下发的属性设置及服务回调;
请参见"C-SDK-物模型开发.md"。