本文描述网关以及其连接的子设备如何接入物联网平台。

网关接入LP
说明
  • 子设备:指没有集成Link SDK的设备,这些设备通常没有IP地址,不能直接与阿里云物联网平台建立连接,例如Zigbee设备、KNX设备。
  • 网关:集成了Link SDK的设备,可以与物联网平台建立连接,并代理子设备连接到阿里云物联网平台。
  • 网关接入网络:网关往往使用ZigBee、KNX、Zwave、RS485等协议连接子设备,网关用于连接子设备的网络称为网关接入网络。

首先网关需要连接到阿里云物联网平台,然后当一个子设备通过网关连接网络后,由网关告知物联网平台该网关代理了该子设备,该子设备的身份认证、上线与离线均由网关告知物联网平台,子设备上传的数据、云端发送给子设备的数据均通过网关进行中转。

当网关告知物联网平台代理了某个子设备后,物联网平台会将该子设备加入到网关的子设备拓扑表中。

云端开发

  • 网关
    • 网关云端数据处理

      网关上报数据到物联网平台之后,开发者可以将数据转发到自己的业务服务器,或者在物联网平台上将该数据转发到另外的设备。

      需要发送数据给网关时,开发者需要调用物联网平台提供的接口将数据发送给设备。

    说明 创建网关产品时生成的产品标识(ProductKey)和产品密钥(ProductSecret),以及创建调试设备时生成设备密钥(DeviceSecret)和设备标识(DeviceName)统称设备身份认证信息。请注意保存设备认证信息。
  • 子设备

    子设备云端数据处理

    子设备通过网关上报数据到物联网平台后,开发者需要在云端对子设备上报的数据进行处理。

    云端需要发送数据给子设备时,开发者调用物联网平台提供的接口将数据发送给子设备。

网关开发

不论是网关自身的功能、还是子设备的功能,都是在网关上进行实现的,子设备上无需集成Link SDK,因此在子设备上无开发工作。具体细节请阅读下面的开发指南:

  1. 支持网关开发的SDK类型

    开发者需要根据网关开发使用的语言或平台来进行网关的功能开发,不同语言SDK的使用方式存在差异,下面是支持的语言或平台的SDK获取以及编程文档链接,推荐用户先阅读完本文之后再阅读相关语言或平台的SDK的开发文档:

  2. 网关自身功能的开发

    这里提到的网关自身功能,包括网关连接物联网平台时对网关的身份认证、以及其它一些功能实现。例如,如果网关是一个灯,那么需要实现灯的状态变化的上报、以及对来自物联网平台关于灯开关命令的处理。

    因此网关首先需要连接到物联网平台,然后才能进行子设备的添加、删除以及状态报告。

  3. SDK依赖

    下面是需要网关厂商在产品上实现而不是SDK提供的功能:

    • 如果网关通过Wi-Fi的方式连接网络,那么设备商需要实现Wi-Fi热点的SSID或密码输入功能,让网关可以连接到Wi-Fi网络。
    • 需要通过DHCP Client从路由器获取IP地址,或者手动指定IP地址功能。
    • 如何对子设备进行发现、使子设备接入网关、发现子设备的离线、以及从子设备接收数据和将数据发送到子设备,都需要由网关厂商实现。SDK只负责网关和阿里云IoT之间的通讯,不涉及网关与子设备之间的通讯。

    开发者需要设计如何保存设备身份认证信息到每个设备上,建议开发者将该信息加密后存放到设备的Flash的某个位置或某个文件中,当设备上电后可以将这些信息从指定的地方读取出来,然后传递给SDK。

  4. 网关开发方式

    目前很多的网关仅仅实现将子设备连接到网络的功能,本身并没有特殊的功能。如果网关本身也有特殊的功能,例如网关除了连接子设备之外,自己也还是一个灯,那么网关自己的功能也需要进行开发。

    网关自身功能的开发有以下两种方式:

    • 基于Topic进行数据收发

      开发者在物联网平台产品定义时添加Topic,完成数据的发布(指网关数据上传)和订阅(网关从云端接收数据),也可以根据网关的需要进行Topic的定义以及Topic上传输的数据格式的定义。

    • 基于物模型方式开发网关功能

      开发者在物联网平台可以使用物模型来定义产品,也即定义产品支持的属性、服务、事件,其中:

      概念 解释
      属性 表示设备支持的某个可读、或者可读可写的参数,例如灯的亮度。
      服务 表示一个设备支持的功能,例如让一个设备重启。
      事件 是设备主动上报的某种情况发生的信息,例如有人在撬锁时智能锁可以上报一个暴力撬锁的事件到云端进行报警。

      使用物模型开发设备的好处在于对设备的功能以JSON格式进行了格式化,设备与云端交互数据的可读性较好,并且对云端服务而言编程比较友好,阿里云IoT也对常见的产品进行了物模型定义,开发者可以使用阿里云定义的物模型进行设备开发,这样当有应用服务商想对设备进行管理时,只要将物模型定义告知服务商即可。

  5. 网关上子设备接入逻辑

    对于子设备接入而言,SDK提供了一些接口用于子设备身份认证、子设备在线和离线状态上报、子设备数据上报、子设备云端下行数据处理,其它很多逻辑是需要网关厂商去实现的。

    下文描述网关在接入子设备时建议的各种逻辑。

    • 初始化

      建议网关需要维护的数据结构(由网关厂商实现):

      • 网关本地拓扑列表(LocalTopoList):用于记录网关已经告知物联网平台代理的子设备、以及已代理子设备的身份认证信息,这些信息是需要持久化的,也即网关reboot之后这些信息仍然存在。
      • 网关已连接子设备列表(LocalDevList):表示当前已经连接到了网关所在接入网络的子设备,这些子设备可能已经被网关告知物联网平台,也可能未被告知物联网平台,该列表无需持久化。
      • 网关已本地删除子设备列表(RemovedDevList):表示在网关与物联网平台断开连接期间,用户通过网关的某种操作本地删除的子设备列表,这些被删除的设备网关尚未告知物联网平台,该列表需要持久化。

      网关上电之后需要执行如下操作:

      • 构建这些数据结构。
      • 去获取网关的IP地址。
      • 当设备获取到IP地址之后,调用SDK的接口去连接物联网平台。
    • 子设备身份认证信息获取

      很多的子设备是无法存储阿里云物联网平台分配的身份认证信息的,因此子设备的身份认证信息都需要保存在网关上。

      子设备往往有自己定义的产品型号、设备唯一标识(MAC地址、序列号等),因此网关上需要实现子设备产品型号到物联网平台ProductKey、ProductSecret的映射,也需要实现基于设备的唯一标识到物联网平台DeviceName、DeviceSecret的映射。子设备身份认证信息获取

      如果网关在部署时,可以预先把将会连接的子设备的型号、设备标识以及与其对应的身份认证信息进行输入,那么当网关通过接入网络接入一个新的子设备时,调用SDK提供的接口告知物联网平台对该子设备进行代理。

      如果网关的使用者无法将将要连接的子设备的型号、设备标识与其对应的身份认证信息进行预配置,那么网关就需要实现接入了一个子设备(将会获取到型号和设备DevID)时如何获取该子设备的身份认证的逻辑。阿里云也提供了一种方案供网关厂商参考和选用:

      • 网关的固件需要记录自己支持的子设备型号与该子设备产品的ProductKey、ProductSecret的映射表,该映射表由网关厂商自行实现。
      • 将设备的标识(DevID)用做设备在阿里云物联网平台的DeviceName,网关厂商需要将设备的标识预先上传到物联网平台,此时设备的标识在物联网平台起到一个白名单的作用。
      • 当网关通过接入网络连接一个新的子设备时,通过网关与子设备之间定义的协议获取设备的型号和设备标识,获得该产品对应的ProductKey、ProductSecret,然后调用SDK的接口使用ProductKey、ProductSecret和DeviceName去物联网平台判断该子设备是否位于白名单中,如果是,那么物联网平台将把子设备的DeviceSecret发送给网关。
        注意 物联网平台将子设备的DeviceSecret发送给网关后,网关再次来获取DeviceSecret将会失败。
      • 当网关收到物联网平台返回的子设备的DeviceSecret之后,就具有了该子设备完整的身份认证信息,再调用SDK提供的接口将子设备添加到物联网平台。
        注意 网关需要将子设备的DeviceSecret持久化,也即网关重启之后无需再次到物联网平台去获取子设备的DeviceSecret。
    • 网关与物联网平台建立连接之后的逻辑

      当网关连接到物联网平台之后,SDK会告知网关连接已建立,此时建议网关执行以下操作:

      • 判断子设备是否已被用户通过物联网平台删除

        场景描述:网关关机,然后用户通过手机APP或者物联网平台的接口将某个子设备从网关下删除,此时物联网平台将会把该子设备从网关的拓扑表删除,但是网关因为关机接收不到这个信息,因此网关还会认为这个设备已经被添加到了物联网平台。

        网关调用SDK的接口从物联网平台拉取网关的拓扑表,对比网关上本地的拓扑表,如果有某个子设备在网关本地的拓扑表中、而不在云端获取的拓扑表中,表示用户已经通过物联网平台提供的接口删除了这个子设备,网关需要将将该子设备从网关本地拓扑表中移除,并将该子设备从网关的接入网络删除。

      • 已代理子设备上线通知

        调用SDK接口通知物联网平台设置当前依然存在于网关本地拓扑表中的在线子设备为在线状态。离线的子设备由于在网关离线时物联网平台已将所有子设备设置离线,所以不需要通知物联网平台。

      • 未代理子设备添加通知

        如果一个设备已经连接到了网关的接入网络,但是并不在网关的本地拓扑表中,此时可以调用SDK提供的接口告知物联网平台网关需要代理该子设备。当子设备代理成功之后,将该设备添加到网关的本地拓扑表中。

      • 告知物联网平台移除已删除子设备

        场景描述:网关与物联网平台的连接断开,例如网关连接路由器的网线被拔掉,然后用户又通过网关的web server、Telnet、或者某种操作将某个子设备删除,此时物联网平台不知道设备被删除。

        将已删除列表中的子设备调用SDK的接口告知物联网平台删除该子设备的拓扑,然后将子设备从网关本地的已删除子设备列表中删除。

    • 网关与物联网平台的连接断开

      当网关与物联网平台的连接断开后,网关如果有子设备被用户在网关上删除(不是通过物联网平台执行的删除),网关需要将这些子设备记录到网关的本地已删除子设备列表,并把该子设备从网关的本地拓扑表和已连接子设备表中删除。

    • 网关添加了新子设备

      场景描述:网关接入的网络中增加了一个新的子设备。

      网关接入的网络中添加了新的子设备时,需要将子设备加入到网关的已连接子设备列表。

      • 如果网关与物联网平台的连接是已建立,则调用SDK的接口告知物联网平台添加子设备。如果添加成功:
        1. 调用SDK的接口告知物联网平台将该子设备设置为在线状态。
        2. 将该子设备也加入网关的本地拓扑表。
      • 如果网关尚未建立与物联网平台的连接,无需做特殊操作,等待建立连接之后通知物联网平台去添加子设备以及上报子设备状态。
    • 网关删除子设备

      场景描述:当用户通过网关提供的命令或者某种操作方式将某个子设备从网关的接入网络删除。

      • 首先,将子设备从已连接子设备列表删除。
      • 其次,如果子设备在网关的本地拓扑表中,将子设备加入已删除子设备列表。
      • 然后,如果网关与物联网平台已建立连接,告知物联网平台去删除该子设备,并将该设备从已删除子设备列表删除;如果网关与物联网平台未建立连接,则无需处理。
    • 子设备上线

      场景描述:一个曾经连接到网关的子设备连接到网关的接入网络。

      • 首先将其加入网关的已连接子设备列表,并设置子设备的状态为在线状态。
      • 如果网关与物联网平台处于连接状态:
        • 如果子设备不在网关的本地拓扑表中,调用SDK的接口让物联网平台将该子设备添加到网关的拓扑表中,添加成功将该子设备加入网关的本地拓扑表,再调用SDK的接口告知物联网平台该子设备上线。
        • 如果子设备在网关的本地拓扑表中,就调用SDK的接口告知物联网平台子设备上线。
    • 子设备离线
      • 设置子设备的状态为离线状态。
      • 如果子设备位于网关的本地拓扑表中,且网关与物联网平台处于连接状态,则调用SDK的接口告知物联网平台设备离线。
    • 子设备数据上报

      网关收到子设备的数据时,使用MQTT Topic或者基于物模型的方式对数据编码后发送到物联网平台。

    • 来自云端子设备数据处理

      网关收到物联网平台发送给某个子设备的数据,需要将数据解析出来之后,再发送给子设备,该数据如何编码以及如何发送给子设备由网关实现。

参考

下文列出与网关编程相关的文档链接。

  • 基于Ubuntu+C+MQTT Topic的数据收发实现

    请参见快速体验中的“以MQTT Topic方式接入设备”,该章节描述了设备在Ubuntu上使用C SDK将数据发送到物联网平台、然后将该数据接收回来的实现案例。

    更多详细内容请参见自定义MQTT Topic编程

  • 基于Ubuntu+C+MQTT+物模型的加法器实现

    请参见快速体验中的“以物模型编程方式接入设备”,该章节描述了在Ubuntu上使用C SDK实现的一个支持加法运算的设备逻辑。

    物模型编程以及相关API说明,请参见C语言的物模型编程指南

    注意 非C语言的SDK也有网关编程相关文档,本处单独给出C语言的链接是因为当前网关主要使用嵌入式Linux、并使用C语言开发为主。
  • 基于Ubuntu+C+MQTT的OTA实现

    OTA用于设备固件升级,C SDK的目录src\ota\examples\ota_example_mqtt.c描述了OTA的实现示例。

  • 基于Ubuntu+C+MQTT的动态注册实现

    如果在产线上给每个网关烧录ProductKey、ProductSecret、DeviceName、DeviceSecret,由于每个网关的DeviceName和DeviceSecret每个设备烧写的内容都是不一样的,厂商需要对产线进行改造。有的厂商不愿意进行产线工具改造,因此阿里云IoT提供了动态注册用于解决该问题,网关上烧写网关设备的ProductKey、ProductSecret,并使用设备的MAC地址、或者序列号作为设备标识(DeviceName),来避免对产线工具进行改造。

    C SDK的目录src\dynamic_register\examples\dynreg_example.c示例了如何动态获取设的DeviceSecret,然后再连接阿里云物联网平台。

    更多详细内容请参见C语言的设备认证编程文档中的“一型一密”。

设备量产

下文描述相关设备添加。

  • 网关

    当网关功能调试运行正常之后,设备进入量产阶段。设备量产是指设备厂商将产品的固件烧录到每个设备,并将每个设备的身份认证信息烧录到每个设备的过程。

    开发者需要对自己的产线进行设计来将设备的身份信息可以快速的烧录到每个设备中。

    开发者需要在阿里云物联网平台为所有的网关设备申请设备身份信息,操作步骤为在设备管理 > 设备,选中相应产品后单击批量添加批量获取设备身份信息。

  • 子设备

    子设备接入阿里云物联网平台虽然没有特殊的开发,也需要为每个子设备申请设备身份信息,开发者需要在阿里云物联网平台为所有的网关设备申请设备身份信息,操作步骤为在设备管理 > 设备,选中相应产品后单击批量添加批量获取设备身份信息。

    如果子设备使用动态注册方式,子设备厂商需要将子设备的设备标识上传到物联网平台。