除直连设备外,平台支持非直连联网设备接入(如蓝牙、Zigbee、Modbus、OPC协议的设备),此类设备必须通过网关对协议进行转换之后与平台进行交互,此类设备我们称之为子设备。
网关是一类特殊的直连设备,除可以直接接入平台外,网关也可以代理子设备接入
# 接入流程
- 分别创建网关设备和子设备产品,并将子设备产品关联为网关产品的子产品;
- 创建网关设备和子设备,在网关设备详情页子设备菜单下,将子设备绑定到网关设备上;
- 使用网关设备的三元组进行设备认证,使用设备认证通过返回的连接信息连接平台
- 连接成功后,按G+link协议规范与平台进行数据交互,上报网关自身消息或代理子设备上报消息。
# 设备与平台交互
假设设备及定义的如模型如下
- 网关设备:数采网关
ProductKey:cgateway
DeviceName:sncbox202112280001
功能类型 | 功能名称 | 唯一标识 | 参数 | 描述 |
---|---|---|---|---|
属性 | 内存占用率 | memusage | float-单精度浮点 | 设备上报 |
属性 | 5分钟平均负载 | loadavg | float-单精度浮点 | 设备上报 |
与直连设备一样,可以定义事件和服务,可参考直连设备接入
- 子设备:环境监测仪
ProductKey:dht22
DeviceName:sn202112280001
功能类型 | 功能名称 | 唯一标识 | 参数 | 描述 |
---|---|---|---|---|
属性 | 环境湿度 | humidity | float-单精度浮点 | 设备上报 |
属性 | 环境温度 | temperature | float-单精度浮点 | 设备上报 |
事件 | 温度超限 | temperature_overrun | 输出参数temperature、msg | 设备上报 |
服务 | 设置告警值 | set_alarm_value | 输入参数alarm_value | 设备接收云端 |
# 网关上报自身属性
向thing/cgateway/sncbox202112280001/property/post主题发布如下消息:
{
"reqId":"442c1da4-9d3a-4f9b-a6e9-bfe858e4ac43",
"method":"thing.property.post",
"version":"1.0",
"timestamp":1610430718000,
"bindName":"MAIN",
"properties":{
"memusage":56.1,
"loadavg":80.0
}
}
其中:
reqId为设备端自定义生成的消息唯一ID
method固定为thing.property.post
version为协议版本号,当前固定为1.0
timestamp为设备端生成的数据时间戳
bindName为槽位名称,默认为MAIN
properties为属性key:value格式的键值对
按此格式上报后如果设备开启了设备影子,可以在控制台查看设备属性数据是否更新,如已更新则标识上报成功,同时可以在日志服务中查看设备上报记录
# 网关上报自身事件
与直连设备方法一致
# 远程控制网关设备
与直连设备方法一致
# 子设备属性上报
上报子设备属性时使用网关设备的主题,并在消息体中传输子设备的信息
向thing/cgateway/sncbox202112280001/property/post主题发布如下消息:
{
"reqId":"442c1da4-9d3a-4f9b-a6e9-bfe858e4ac43",
"subEquipment":{
"productKey":"dht22",
"deviceName":"sn202112280001"
},
"method":"thing.property.post",
"version":"1.0",
"timestamp":1610430718000,
"bindName":"MAIN",
"properties":{
"humidity":23.1,
"temperature":28
}
}
其中:
reqId为设备端自定义生成的消息唯一ID
subEquipment为子设备信息,包括子设备的productKey和deviceName
method固定为thing.property.post
version为协议版本号,当前固定为1.0
timestamp为设备端生成的数据时间戳
bindName为槽位名称,默认为MAIN
properties为属性key:value格式的键值对
按此格式上报后如果设备开启了设备影子,可以在控制台查看子设备设备属性数据是否更新,如已更新则标识上报成功,同时可以在日志服务中查看设备上报记录
# 子设备事件上报
上报子设事件性时使用网关设备的主题,并在消息体中传输子设备的信息
向thing/cgateway/sncbox202112280001/event/post主题发布如下消息:
{
"reqId":"442c1da4-9d3a-4f9b-a6e9-bfe858e4ac43",
"subEquipment":{
"productKey":"dht22",
"deviceName":"sn202112280001"
},
"method":"thing.event.post",
"version":"1.0",
"timestamp":1610430718000,
"bindName":"MAIN",
"events":{
"temperature_overrun":{
"temperature":38.5,
"msg":"环境温度超限,请开启空调"
}
}
}
其中:
reqId为设备端自定义生成的消息唯一ID
subEquipment为子设备信息,包括子设备的productKey和deviceName
method固定为thing.event.post
version为协议版本号,当前固定为1.0
timestamp为设备端生成的数据时间戳
bindName为槽位名称,默认为MAIN
events为事件的事件名称和输出参数的key:value格式的键值对
按此格式上报后可以在控制台日志服务或设备详情页事件管理中查看设备上报事件记录
# 远程控制子设备
平台服务端提供API接口,业务应用服务可以使用http方式调用接口向子设备下发指令,平台下发给子设备的指令只到达网关,需要网关实现指令向子设备的传递
请求设备服务,可参考《API参考>服务端>设备管理>发送消息到设备》章节
网关设备端订阅thing/cgateway/sncbox202112280001/command/invoke主题可以接收到平台的控制指令消息:
{
"reqId":"442c1da4-9d3a-4f9b-a6e9-bfe858e4ac43",
"subEquipment":{
"productKey":"dht22",
"deviceName":"sn202112280001"
},
"method":"thing.command.invoke",
"version":"1.0",
"timestamp":1610430718000,
"bindName":"MAIN",
"name":"set_alarm_value",
"params":{
"alarm_value":36
}
}
其中:
reqId为设备端自定义生成的消息唯一ID
subEquipment为子设备信息,包括子设备的productKey和deviceName
method固定为thing.command.invoke
version为协议版本号,当前固定为1.0
timestamp为设备端生成的数据时间戳
bindName为槽位名称,默认为MAIN
name为设备定义的服务名称
params为服务的输入参数的key:value格式的键值对
网关设备接收到消息后,需网关设备端实现控制子设备的逻辑
更多设备与平台交互逻辑请参考《开发者指南>设备管理>数据交互协议》章节