本文将具体介绍如何通过符合阿里云物联网平台接入协议规范的DTU设备,快速实现存量串口输出设备接入阿里云物联网平台。

背景信息

在工业、农业、医疗、城市、楼宇、园区等多种场景中,存在着大量的通过串口与外界通信的存量设备。对此类设备进行物联网改造时,往往无法修改设备本身的串口传输协议,只能在云端进行数据解析工作。为了快速使此类设备接入和使用阿里云物联网平台,阿里云联合硬件合作伙伴,共同定义了可以通过简单配置即可接入物联网平台平台的透传数据DTU设备。
图 1. 数据流转流程图
数据流转流程图
本地设备通过串口与DTU设备相连,DTU通过2G、3G、4G或Ethernet网络与阿里云物联网平台相连,由DTU设备实现阿里云物联网平台的接入协议。设备证书将被配置到DTU中,由DTU代表设备与物联网平台进行数据通信。

创建产品和设备

在物联网平台创建产品和设备,获取设备证书信息(ProductKey、DeviceName和DeviceSecret)。

  1. 登录物联网平台控制台
  2. 创建产品。
    1. 在左侧导航栏,选择设备管理>产品
    2. 产品管理页,单击创建产品
    3. 填入产品信息,单击确定。完成产品创建。
      存量设备的数据按其本身格式通过DTU设备透传到物联网平台,因此需创建数据格式为透传/自定义的产品。产品信息设置如下图所示。产品信息设置
  3. 创建设备。
    1. 在控制台左侧导航栏,选择设备
    2. 设备管理页,单击添加设备
    3. 选择刚创建的产品,输入设备名称和备注名称,单击确定。完成设备创建。
      添加设备设备创建成功后,会弹出设备证书信息。您也可以在设备管理页,单击设备对应的查看按钮,进入设备详情页查看设备证书信息。该设备证书将被配置到DTU设备端。

定义物模型

物模型指将物理空间中的实体进行数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能(包括属性、事件、服务)。完成功能定义后,系统将自动生成该产品的物模型。本文以电机变频设备为例,需创建电机转速、电流和设置转速三个属性。

  1. 在物联网平台控制台的左侧导航栏,选择设备管理>产品
  2. 产品管理页,找到之前创建的产品,单击对应的查看按钮。
  3. 产品详情页,选择功能定义,再单击自定义功能对应的添加功能
  4. 根据下表逐个添加属性。
    功能类型 功能名称 标识符 数据类型 取值范围 单位 读写类型
    属性 转速 speed int32 0 ~ 3000 rpm 只读
    属性 电流 current int32 0 ~ 30 A 只读
    属性 设置转速 setspeed Int32 0 ~ 3000 rpm 读写

编辑数据解析脚本

阿里云物联网平台支持的标准数据格式为Alink JSON格式,而存量设备的原始数据通过DTU设备透传到物联网平台,物联网平台不能直接处理此类数据。物联网平台提供数据解析功能,可将上行的自定义格式数据解析为Alink JSON格式;将下行数据解析为设备的自定义数据格式。您需在物联网平台控制台上,提交数据解析脚本供物联网平台调用。数据解析脚本需根据设备上报数据和云端下发数据进行编写。

  1. 在物联网平台控制台上,变频电机产品对应的产品详情页,选择数据解析页签。
  2. 编辑脚本输入框中,输入解析脚本。
    说明 脚本代码中属性的标识符必须与定义物模型时定义的一致。
    点击查看数据解析脚本编写指导

    本示例设备发送至云端的数据为16进制格式,因此脚本需将16进制格式数据格式转换为Alink JSON格式;并将云端下发的Alink JSON格式数据转换为16进制格式。本示例脚本如下:

    var ALINK_ID = "12345";
    var ALINK_VERSION = "1.1";
    var ALINK_PROP_POST_METHOD = 'thing.event.property.post';
    // var ALINK_EVENT_TEMPERR_METHOD = 'thing.event.TempError.post';
    // var ALINK_EVENT_HUMIERR_METHOD = 'thing.event.HumiError.post';
    var ALINK_PROP_SET_METHOD = 'thing.service.property.set';
    // var ALINK_SERVICE_THSET_METHOD = 'thing.service.SetTempHumiThreshold';
    /* * * * * *
    * 传入参数 ->
    * 0102 // 共2个字节 * 输出结果 ->
    *{"method":"thing.event.TempError.post","id":"12345","params":{"Temperature":
    2},"version":"1.1"}
    * 传入参数 ->
    * 0202 // 共2个字节 * 输出结果 ->
    *{"method":"thing.event.HumiError.post","id":"12345","params":{"Humidity":2},
    "version":"1.1"}
    */
    /*此函数用于实现设备上发数据到物模型的转换*/
    function rawDataToProtocol(bytes) {
        /*将设备上报的RAW数据转换为数组其中bytes对象中存储着设备上报RAW数据*/ 
        var uint8Array = new Uint8Array(bytes.length);
        for (var i = 0; i < bytes.length; i++) {
            uint8Array[i] = bytes[i] & 0xff;
        }
    
        var params = {};                            // 定义属性存放对象
        var jsonMap = {};                           // 定义模拟Alink数据报对象
    
        /*填写Alink数据报协议头部分*/
        jsonMap['version'] = ALINK_VERSION;         // Alink 协议版本号
        jsonMap['id'] = ALINK_ID;                   // 模拟消息ID
        jsonMap['method'] = ALINK_PROP_POST_METHOD;// 模拟设备上行数据方法:设备属性上报
        /*填写Alink数据报属性部分*/          
        params['speed']= uint8Array[0];            // 将收到的第一个字节转换为转速值
        params['current'] = uint8Array[1];          // 将收到的第二个字节转换为电流
        jsonMap['params'] = params;                 // 将参数打包到数据帧中
    
        return jsonMap;                             // 返回时会发送给IoT设备管理平台
    
    }
     
    //以下是部分辅助函数
    function buffer_uint8(value)
    {
        var uint8Array = new Uint8Array(1);
        var dv = new DataView(uint8Array.buffer,0);
        dv.setUint8(0, value);
        return [].slice.call(uint8Array);
    }
    function buffer_int16(value)
    {
        var uint8Array = new Uint8Array(2);
        var dv = new DataView(uint8Array.buffer,0);
        dv.setInt16(0, value);
        return [].slice.call(uint8Array);
    }
    
    function buffer_int32(value)
    {
        var uint8Array = new Uint8Array(4);
        var dv = new DataView(uint8Array.buffer,0);
        dv.setInt32(0, value);
        return [].slice.call(uint8Array);
    }
    function buffer_float32(value)
    {
        var uint8Array = new Uint8Array(4);
        var dv = new DataView(uint8Array.buffer,0);
        dv.setFloat32(0, value);
        return [].slice.call(uint8Array);
    }
    
    /*此函数实现由云端下发数据转换为到设备能识别的16进制数*/
    function protocolToRawData(json)
    {
        var method = json['method'];
        var id = json['id'];
        var version = json['version'];
    
        var payloadArray = [];
        if (method == ALINK_PROP_SET_METHOD)    // 接收来自IoT设备管理平台的“设置设备属性”的命令
        {
            var send_params = json['params'];
            var prop_cur = send_params['setspeed'];   // 将设置的具体值抽取出来
    
             //按照自定义协议格式拼接 rawdata
            payloadArray = payloadArray.concat(buffer_uint8(0x55)); // 第一字节数据头,标识数据功能用户自定义
            payloadArray = payloadArray.concat(buffer_uint8(prop_cur)); // 第二字节,具体的设置值
        }
    
         return payloadArray;    // 返回时,将数据发送至设备端。
    }
  3. 测试脚本。
    • 测试上行数据解析。
      1. 选择模拟类型为设备上报数据
      2. 模拟输入下的输入框中,输入一个模拟数据。

        本示例脚本的逻辑为:数据的第一个字节为转速值,第二个字节为电流值。例如6410 ,64表示转速为100;10表示电流为16安培。

      3. 单击运行
      4. 在右侧运行结果栏,查看解析结果。
      查看解析结果
    • 测试下行数据解析。
      1. 选择模拟类型为设备接受数据
      2. 模拟输入下的输入框中,输入模拟下行数据。下行数据示例如下:
        {
            "method": "thing.service.property.set",
             "id": "12345",
             "version": "1.0",
             "params": {
             "setspeed": 123
            }
        }
      3. 单击运行
      4. 在右侧运行结果栏,查看解析结果。
      查看解析结果
  4. 确认脚本可用后,单击提交按钮,将脚本提交到物联网平台。
    注意 物联网平台不能调用草稿状态的脚本,只有已提交的脚本才会被调用来解析数据。

设备端开发

在本示例中,使用电脑模拟DTU设备端。电脑通过USB转串口与DTU连接。
注意 请确保DTU可以正确连接Internet。
  1. 配置DTU设备。
    本示例使用F2x16 DTU设备。
    1. 连接DTU设备与电脑USB口。连接设备和PC端
    2. 在电脑上,打开DTU配置工具,配置正确的串口号,设置波特率,并打开串口。配置波特率打开串口
    3. 单击右下方登陆配置按钮,使DTU进入配置状态。
    4. 单击读取配置按钮,获取现有DTU的配置。读取配置
    5. 确保工作协议为port。在右侧配置界面下,单击串口,再进行本地串口配置。配置信息如下图。配置本地串口
    6. 单击IoT接入配置,填入从物联网平台获取的设备证书信息和地域。填写设备证书信息和地域1填写设备证书信息和地域2
    7. 单击下方下发配置按钮,使配置生效。
      如果配置下发失败,请单击退出登录后,重新配置。
    8. 完成配置后,单击退出登录按钮,使DTU进入正常工作模式。
    9. 将DTU断电,再重新上电。当DTU上online灯点亮后,即表示已连接上物联网平台。
      您还可以在物联网平台控制台上,查看设备的状态。查看设备状态
  2. 测试数据通信。
    1. 测试上传数据。
      测试DTU设备代替存量设备上传数据到物联网平台。
      1. 打开串口调试工具。
        注意 在本地电脑上,使用串口调试工具进行设备数据的收发模拟前,请务必确保DTU配置工具已经关闭。
      2. 设置串口调试工具的相关参数,并打开串口,然后单击发送
        根据物联网平台上的物模型定义,模拟发送转速和电流两个参数到云端。假定转速为150,电流为10安培,则在串口工具中,按先后顺序填写96 0A两个16进制数。设置串口调试工具参数
      3. 数据发送后,在物联网平台控制台,设备对应的设备详情运行状态页签下,打开实时刷新开关。稍后就可以看到上传的数据。设置数据实时刷新
    2. 测试接收云端下发数据。
      使用物联网平台调试真实设备功能,下发设置转速指令,测试DTU接收云端下发数据。
      1. 在物联网平台控制台左侧导航栏,选择监控运维>在线调试
      2. 选择要调试的设备,再选择调试真实设备调试真实设备
      3. 选择功能为已定义的转速设置属性,方法选择为设置,输入一个测试值,单击发送指令发送指令
      4. 指令发送成功后,在DTU串口调试工具的接收框中,查看接收到的数据。接收到的数据中,55为数据头,数据值为64(即十进制的100)。接收到的数据
      云端和设备端均能接收到正确数据,说明配置成功。

名词解释

  • 物模型

    阿里云物联网平台将设备抽象为”属性“,”事件“,”服务“三大要素。设备的三要素抽象描述,称为物模型。

  • 属性

    一般用于描述设备运行状态,例如电机的转速,灯的开关和亮度,水的温度。

  • 事件

    设备运行时的事件,一般包含需要被外部感知和处理的通知信息,例如开关机通知、报警等。

  • 服务

    设备可被外部调用的能力,例如调整电机转速。

  • 设备证书

    设备证书指ProductKey、DeviceName和DeviceSecret,是阿里云物联网平台认证设备的标识。设备证书信息不可泄露。

  • ProductKey

    物联网平台为产品颁发的全局唯一标识。

  • DeviceName

    在注册设备时,自定义的或系统自动生成的设备名称,具备产品维度内的唯一性。

  • DeviceSecret

    物联网平台为设备颁发的设备密钥。

更多最佳实践

点击查看更多最佳实践