网关与子设备接入
更新时间: 2023-04-10

除直连设备外,平台支持非直连联网设备接入(如蓝牙、Zigbee、Modbus、OPC协议的设备),此类设备必须通过网关对协议进行转换之后与平台进行交互,此类设备我们称之为子设备。

网关是一类特殊的直连设备,除可以直接接入平台外,网关也可以代理子设备接入

# 接入流程

image.png

  1. 分别创建网关设备和子设备产品,并将子设备产品关联为网关产品的子产品;
  2. 创建网关设备和子设备,在网关设备详情页子设备菜单下,将子设备绑定到网关设备上;
  3. 使用网关设备的三元组进行设备认证,使用设备认证通过返回的连接信息连接平台
  4. 连接成功后,按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格式的键值对

网关设备接收到消息后,需网关设备端实现控制子设备的逻辑

更多设备与平台交互逻辑请参考《开发者指南>设备管理>数据交互协议》章节