设备通过DTU接入物联网平台前,您需要在物联网平台上依次完成以下操作:创建数据格式为透传/自定义的产品、创建设备、获取设备证书信息、定义物模型、编辑并提交数据解析脚本。

创建产品和设备

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

  1. 登录物联网平台控制台
  2. 实例概览页面,找到对应的实例,单击实例进入实例详情页面。
    注意 目前华东2(上海)、华北2(北京)、华南1(深圳)地域开通了企业版实例服务。其他地域,请跳过此步骤。
    实例概览
  3. 在左侧导航栏,选择设备管理 > 产品,再单击创建产品,创建一个产品:电机变频
    表 1. 产品信息
    参数 说明
    产品名称 自定义产品名称。例如电机变频
    所属品类 选择自定义品类
    节点类型 选择直连设备
    连网方式 选择蜂窝(2G/3G/4G/5G)
    数据格式 选择透传/自定义
    认证方式 选择设备密钥
  4. 在左侧导航栏,选择设备,再单击添加设备,在创建的电机变频产品下,添加设备。
    设备创建成功后,您也可以在设备页,单击设备对应的查看,进入设备详情页查看设备证书信息。该设备证书将被配置到DTU设备端,请妥善保存。

定义物模型

本文以电机变频设备为例,需创建电机转速、电流和设置转速三个属性。物模型相关概念说明,请参见什么是物模型

  1. 物联网平台控制台对应实例下的左侧导航栏,选择设备管理 > 产品
  2. 产品页面,单击电机变频产品对应的查看
  3. 产品详情页面的功能定义页签下,选择编辑草稿 > 添加自定义功能
  4. 根据下表逐个添加属性,然后单击发布上线,将物模型发布为正式版。
    功能类型 功能名称 标识符 数据类型 取值范围 步长 单位 读写类型
    属性 转速 speed int32 0 ~ 3000 1 r/min 只读
    属性 电流 current int32 0 ~ 300 1 A 只读
    属性 设置转速 setspeed int32 0 ~ 3000 1 r/min 读写

编写数据解析脚本

阿里云物联网平台支持的标准数据格式为Alink JSON格式,而设备的原始数据通过DTU设备透传到物联网平台,物联网平台不能直接处理此类数据。

物联网平台提供数据解析功能,可将上行的自定义格式数据解析为Alink JSON格式;将下行数据解析为设备的自定义数据格式。您需在物联网平台控制台上,提交数据解析脚本供物联网平台调用。数据解析脚本需根据设备上报数据和物联网平台下发数据进行编写。

  1. 电机变频产品的产品详情页面,选择数据解析页签。
  2. 数据解析页签下的编辑脚本输入框中,选择脚本语言JavaScript(ECMAScript 5),然后输入数据解析脚本。
    数据解析脚本编写指导,请参见提交数据解析脚本

    本示例设备发送至物联网平台的数据为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"}
    */
    /*此函数将设备上报数据转换为Alink JSON物模型数据。*/
    function rawDataToProtocol(bytes) {
        /*将设备上报的原始数据转换为数组。其中bytes对象中存储着设备上报原始数据。*/
        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;                             // 返回结果会发送给物联网平台。
    }
    
    //以下是部分辅助函数。
    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)    // 接收来自物联网平台的“设置设备属性”的命令。
        {
            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;    // 返回时,将数据发送至设备端。
    }
    function transformPayload(topic, rawData) {
        var jsonObj = {};
        return jsonObj;
    }                        
  3. 测试脚本。
    • 测试解析设备上报数据。
      1. 选择模拟类型为设备上报数据
      2. 模拟输入下的输入框中,输入一个模拟数据。

        本示例脚本的逻辑为:数据的第一个字节为转速值,第二个字节为电流值。例如输入6410,第一个字节64表示转速为100 r/min,第二个字节10表示电流为16 A。

      3. 单击执行

        运行结果栏显示解析结果如下图。

        设备上报数据
    • 测试物联网平台下行数据解析。
      1. 选择模拟类型为设备接收数据
      2. 模拟输入下的输入框中,输入一个模拟数据。下行数据示例如下:
        {
            "method": "thing.service.property.set",
            "id": "12345",
            "version": "1.0",
            "params": {
                "setspeed": 123
            }
        }
      3. 单击执行

        运行结果栏显示解析结果如下图。

        设备接收数据
  4. 确认脚本能正确解析数据后,单击提交,将脚本提交到物联网平台系统。
    说明 物联网平台不能调用草稿状态的脚本,只有已提交的脚本才会被调用来解析数据。

后续步骤

配置DTU设备