对于不带有广域网联网能力的存量单品设备,往往无法进行硬件升级,通过外接DTU将这种设备进行互联网接入是最佳方案。设备接入阿里云IoT时需要遵守阿里云IoT的接入规范,因此DTU需要集成SDK接入阿里云IoT,来快速将存量设备快速接入阿里云物联网平台。

本文适用的硬件形态如下:

  • 2G透传DTU
  • 3/4G透传DTU
  • 串口转以太网透传服务器(模块)

1.名词解释

三元组

阿里云IoT平台,为保证端侧设备的连接安全和设备的唯一性,为用户提供了设备三元组,三元组指设备的ProductKey、deviceName、devicesecret。

SDK

阿里云IoT为希望进行设备接入的客户,提供了连接SDK。连接SDK运行于设备端,为用户提供了与阿里云IoT建立连接所需的协议栈,认证机制,加密机制,wifi配网,设备绑定等多种功能,用户可以按需选择使用,帮助用户快速接入阿里云IoT平台。对于存量DTU改造比较合适。

AliOS Things

相对于SDK提供的连接能力,AliOS Things是一个完整的嵌入式操作系统,AliOS Things已经原生包含连接SDK,同时也可以支持多种硬件平台的硬件抽象接口。对于新开发DTU产品在效率上会有比较大的提升。

云端透传解析服务

针对DTU在端侧的透传模式,如果用户希望在云端使用物模型能力,那么需要在数据抵达云平台后对数据用户的原数据进行解析,映射为物模型。如:用户上传数据为8个字节,前四字节为电压,后四字节为电流。则用户需要在阿里云IoT平台中编制一个解析脚本,实现从序列数据到物模型中属性的转换。

2.DTU改造需求

由于本地设备不能做软件上的修改,所以接入IoT平台的三元组的填写都需要在DTU的配置界面中完成,同时,DTU设备代替本地设备完成连接建立,以及往固定的云上topic发送数据和订阅云上下发topic的功能。具体功能需求如下:

增加配置项

在合作伙伴的DTU产品的配置页,增加阿里云IoT对接tab或功能配置组,下图作为参考:

其中 创建设备 的连接地址:https://iot.console.aliyun.com/product

设备三元组的具体位置位于阿里云IoT平台设备管理控制台下的具体设备详情中,如下图:

网关厂商需要将用户所配置的三元组信息,及接入版本的信息进行DTU本地存储,从而每次上电时都可以获取用户的身份认证信息进行阿里云IoT平台的鉴权和建立连接工作。

将用户数据通过阿里云提供的通道,转发至阿里云IoT平台的用户账户

  1. 完成连接SDK在DTU设备上的移植。本文档基于SDK版本2.3.0编写,因此建议用户基于相同的版本进行开发,用户也可以使用更高版本的SDK进行开发

    由于DTU设备主要存在于广域网场景中,且有本地配置工具,所以用户需要关心的是SDK中MQTT相关部分,TLS链接加密部分,以及物模型实现部分。

  2. 完成阿里云IoT平台的连接鉴权。

    在每次上电时,利用用户配置的三元组信息,通过SDK提供的连接和鉴权API完成和阿里云IoT平台建立连接并完成身份认证工作,等待用户本地数据到来。

    • 用户自定义topic方式:

      请参考example/MQTT/MQTT_example.c文件中IOT_MQTT_Construct()函数的调用以及传入参数,实现DTU的接入和鉴权。

    • 物模型方式:

      请参考examples/linkkit/linkkit_example_solo.c文件中IOT_Linkkit_Open()函数和IOT_Linkkit_Connect()函数完成连接和鉴权。

  3. 实现业务逻辑,将接收到的本地用户数据,通过SDK提供的API转发至阿里云IoT平台。针对不同的接入版本,分为如下两个模式

    • 自定义Topic方式:
      将接收到的用户数据,通过SDK提供的MQTT pub接口,发送至云端的一个特定topic。topic格式如下:
      /${Productkey}/${deviceName}/update         
      								

      其中“${Productkey}”部分需要替换为用户配置进来的productkey字符串,“${deviceName}”替换为用户配置进来的devicename字符串。DTU需要将用户本地传进来的数据作为一个MQTT报文的payload传至云端。具体调用可以参考SDK软件包中example/MQTT/MQTT_example.c这个示例文件中IOT_MQTT_Publish() 函数的调用实现。

    • 物模型:

      SDK已经将物模型涉及的topic进行封装,所以只需要将用户原数据通过IOT_Linkkit_Report()函数向云端上报数据,上报时需要传入“ITM_MSG_POST_RAW_DATA”参数,标识是透传上报,云端需要进行解析。具体的实现可以参考examples/linkkit/linkkit_example_solo.c文件中user_post_raw_data()函数的调用示例。

将收到的阿里云IoT平台的下发数据,转发至本地设备通信口。

在前一步的基础上,实现对云端特定topic的订阅,从而完成云端至边缘侧的数据下发。具体实现如下:
  • 自定义Topic方式:
    在建立MQTT实例后,订阅如下topic,具体的订阅操作参考examples/MQTT/MQTT_example.c文件中的IOT_MQTT_Subscribe()函数调用。在订阅时需要设置回调函数,用于处理接收到的数据。
    /${Productkey}/${deviceName}/get
  • 物模型:
    在物模型中,订阅的工作SDK已经完成,所以DTU只需要对RAWDATA_ARRIVED事件设置一个回调,在回调中获取云端下发的数据并转发给客户即可。具体可以参考examples/linkkit/linkkit_example_solo.c文件中的调用,以及回调的实现。
    IOT_RegisterCallback(ITE_RAWDATA_ARRIVED, \
                         user_down_raw_data_arrived_event_handler);
    
    static int user_down_raw_data_arrived_event_handler(const int devid, const unsigned char *payload,
            const int payload_len)
    {
        EXAMPLE_TRACE("Down Raw Message, Devid: %d, Payload Length: %d", devid, payload_len);
        return 0;
    }

安全连接

在阿里云连接SDK中为用户提供了包括TLS和阿里专有的iTLS两种安全加密方式,DTU在实现时可以自由选择使用。为了保证终端用户数据的安全,请尽量采用加密传输通道进行数据传输。

  • DTU实现建议框图

图中提到的函数参数或结构体成员的意义,请参考SDK软件包中examples/MQTT/MQTT_example.c和examples/linkkit/linkkit_example_solo.c文件。

3.用户使用路径示意

4. 集成Link SDK的DTU实例

DTU型号 厂商
F2A16 厦门四信通信科技有限公司
HF5111B 上海汉枫电子科技有限公司
ZWNET-4352 广州致远电子有限公司
LS-D3000 杭州乐舜