设备通过DTU接入物联网平台前,您需要在物联网平台上依次完成以下操作:创建数据格式为透传/自定义的产品、创建设备、获取设备证书信息、定义物模型、编辑并提交数据解析脚本。
创建产品和设备
在物联网平台创建产品和设备,获取设备证书信息(ProductKey、DeviceName和DeviceSecret)。
- 登录物联网平台控制台。
- 在实例概览页面,找到对应的实例,单击实例进入实例详情页面。注意 目前华东2(上海)、华北2(北京)、华南1(深圳)地域开通了企业版实例服务。其他地域,请跳过此步骤。
- 在左侧导航栏,选择设备管理 > 产品,再单击创建产品,创建一个产品:电机变频。
表 1. 产品信息 参数 说明 产品名称 自定义产品名称。例如电机变频。 所属品类 选择自定义品类。 节点类型 选择直连设备。 连网方式 选择蜂窝(2G/3G/4G/5G)。 数据格式 选择透传/自定义。 认证方式 选择设备密钥。 - 在左侧导航栏,选择设备,再单击添加设备,在创建的电机变频产品下,添加设备。设备创建成功后,您也可以在设备页,单击设备对应的查看,进入设备详情页查看设备证书信息。该设备证书将被配置到DTU设备端,请妥善保存。
定义物模型
本文以电机变频设备为例,需创建电机转速、电流和设置转速三个属性。物模型相关概念说明,请参见什么是物模型。
- 在物联网平台控制台对应实例下的左侧导航栏,选择设备管理 > 产品。
- 在产品页面,单击电机变频产品对应的查看。
- 在产品详情页面的功能定义页签下,选择编辑草稿 > 添加自定义功能。
- 根据下表逐个添加属性,然后单击发布上线,将物模型发布为正式版。
功能类型 功能名称 标识符 数据类型 取值范围 步长 单位 读写类型 属性 转速 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格式;将下行数据解析为设备的自定义数据格式。您需在物联网平台控制台上,提交数据解析脚本供物联网平台调用。数据解析脚本需根据设备上报数据和物联网平台下发数据进行编写。
- 在电机变频产品的产品详情页面,选择数据解析页签。
- 在数据解析页签下的编辑脚本输入框中,选择脚本语言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; }
- 测试脚本。
- 测试解析设备上报数据。
- 选择模拟类型为设备上报数据。
- 在模拟输入下的输入框中,输入一个模拟数据。
本示例脚本的逻辑为:数据的第一个字节为转速值,第二个字节为电流值。例如输入6410,第一个字节64表示转速为100 r/min,第二个字节10表示电流为16 A。
- 单击执行。
运行结果栏显示解析结果如下图。
- 测试物联网平台下行数据解析。
- 选择模拟类型为设备接收数据。
- 在模拟输入下的输入框中,输入一个模拟数据。下行数据示例如下:
{ "method": "thing.service.property.set", "id": "12345", "version": "1.0", "params": { "setspeed": 123 } }
- 单击执行。
运行结果栏显示解析结果如下图。
- 测试解析设备上报数据。
- 确认脚本能正确解析数据后,单击提交,将脚本提交到物联网平台系统。说明 物联网平台不能调用草稿状态的脚本,只有已提交的脚本才会被调用来解析数据。