如果当前设备是一个网关,且该网关下的子设备需接入云端,此时需要使用子设备管理功能。 网关子设备管理提供了子设备动态注册、获取云端网关下子设备列表、添加子设备、删除子设备、子设备上线、子设备下线、监听子设备禁用和删除、代理子设备上下行的能力。 网关本身是一个直连设备可直接使用上述介绍的所有能力。网关和子设备之间的连接、数据通信需要用户处理。 说明 网关子设备管理相关接口参见设备 IGateway 设备每次初始建联的时候都需要调用添加、登录接口。

网关开发过程说明

  • 厂商在物联网平台定义网关产品(基础版或者高级版),设置“节点类型”为“网关”,设置网关的身份认证模式,并根据网关功能定义topic或者定义物模型,并参照前面的章节中的说明对网关自身的功能进行开发;

  • 实现子设备的管理功能

    1. 实现子设备的发现与连接功能,该部分功能由厂商自行实现,阿里并未提供网关如何发现以及如何将子设备连接到网关的代码实现

    2. 实现子设备证书的获取方式,下面的内容有介绍几种获取子设备证书的方式供厂商参考

    3. 当网关发现并将一个子设备连接到网关后,如果需要该子设备能够通过物联网平台进行远程管理,需要调用SDK的添加子设备接口将其告知物联网平台,添加之前需要先获得该子设备的证书信息;然后调用SDK提供的子设备上线接口通知物联网平台,因为如果一个子设备处于离线状态,如果远程对子设备进行控制,物联网平台将直接返回失败、而不是将命令发送给网关之后等待错误提示或者超时提示

    4. 当网关告知物联网平台一个子设备上线之后,需要将子设备的状态信息上报云端以保证子设备在云端的状态与当前子设备的状态一致。特别是使用物模型定义子设备功能时,子设备上线需要将属性的最新数值通知云端;

    5. 当网关的一个已添加到物联网平台的子设备离线时,网关需要调用子设备离线接口告知物联网平台这个子设备已离线;

    6. 当一个在线子设备的属性发生变化时,也需要实时告知物联网平台

    7. 当网关离线并再次上线时(比如网络连接断开,或者网关重启),网关需要对所有已添加到云端的子设备再次调用添加子设备接口,再次调用子设备上线接口,如果网关不知道子设备的属性与网关离线前上报到云端的是否一致,那么网关需要将子设备的最新属性再次上报云端。

    8. 当网关接收到来自物联网平台对子设备的控制消息时,网关如何将该消息转换成子设备识别的格式并发送给子设备,由网关厂商进行实现

子设备开发过程

  • 设备厂商在物联网平台定义子设备产品(基础版或者高级版),设置“节点类型”为“设备”,设置产品的身份认证模式

  • 阿里并不在子设备上提供任何SDK,因此网关如何发现子设备、如何连接子设备、网关如何发现子设备上线或者离线、网关如何将来自物联网平台的命令发送给子设备,均由网关厂商与子设备厂商定义协议并实现

子设备证书的获取方式

子设备是通过网关到阿里云物联网进行注册的,注册时也需要使用到子设备的证书进行设备验证。下面是网关获取子设备证书的几种方式,网关厂家根据自己的实际情况进行选用:

  • 网关从子设备获取子设备证书

由网关与子设备之间定义一套协议,当网关发现与连接子设备之后,获取到子设备的证书。阿里云并不提供参考协议实现,该协议由网关厂商与子设备厂商自行定义与实现。

  • 网关预置子设备的证书

如果网关设备预先可以得知自己需要连接的子设备,并且网关提供了某种配置方式输入子设备的证书信息,那么可以通过这种方式获取子设备的证书。同样,该功能由网关厂商实现。

  • 网关通过动态注册获取子设备证书

网关可以通过某种协议发现与连接子设备,并获取到子设备的型号(model)以及唯一标识(比如SN、MAC地址),但是并不知道子设备的DeviceSecret。由于子设备也需要在阿里云物联网平台进行产品定义(云端会为子设备生成ProductKey),网关可以建立子设备型号(model)到阿里云物联网平台ProductKey的映射(网关厂家在网关上实现该映射),并将设备的唯一标识作为阿里云物联网平台的DeviceName,然后通过阿里云物联网平台提供的动态注册功能从云端获取子设备的DeviceSecret,从而得到完整的子设备的证书信息。

子设备动态注册

使用PK&DN动态注册

需要在云端开启允许动态注册功能,可以同时注册多个,用于获取子设备证书。子设备添加到网关之前需要先进行动态注册获取子设备证书信息,如果本地已有子设备证书信息,可以跳过这一步。如果子设备已经被绑定到其他网关设备,动态注册不会返回该子设备的证书信息。

LinkKit.getInstance().getGateway().gatewaySubDevicRegister(getSubDevList(), new IConnectSendListener() {
    @Override
    public void onResponse(ARequest aRequest, AResponse aResponse) {
        ALog.d(TAG, "onResponse() called with: aRequest = [" + aRequest + "], aResponse = [" + (aResponse == null ? "null" : aResponse.data) + "]");
        try {
            // 子设备动态注册成功
            ResponseModel<List<DeviceInfo>> response = JSONObject.parseObject(aResponse.data.toString(), new TypeReference<ResponseModel<List<DeviceInfo>>>() {
            }.getType());
            // 根据 response 的数据判断是否成功 code=200
            //TODO 保存子设备的证书信息
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onFailure(ARequest aRequest, AError aError) {
        // 子设备动态注册失败
    }
});
            

使用PK&DN&PS动态注册

需要注意的是这种动态注册方式涉及到子设备的pk需要预先获取,安全性会低于第一种动态注册方式。如果当前已经有子设备的productKey、deviceName、productSecret信息,并且需要进行抢占式动态注册,则可以使用 这种方式进行子设备动态注册。抢占式动态注册,即被其它网关设备绑定