?
本文将具体介绍如何通过符合阿里云物联网平台接入协议规范的DTU设备,快速实现存量串口输出设备接入阿里云物联网平台。
背景信息
在工业、农业、医疗、城市、楼宇、园区等多种场景中,存在着大量的通过串口与外界通信的存量设备。对此类设备进行物联网改造时,往往无法修改设备本身的串口传输协议,只能在云端进行数据解析工作。为了快速使此类设备接入和使用阿里云物联网平台,阿里云联合硬件合作伙伴,共同定义了可以通过简单配置即可接入物联网平台平台的透传数据DTU设备。
图 1.?数据流转流程图
本地设备通过串口与DTU设备相连,DTU通过2G、3G、4G或Ethernet网络与阿里云物联网平台相连,由DTU设备实现阿里云物联网平台的接入协议。设备证书将被配置到DTU中,由DTU代表设备与物联网平台进行数据通信。
创建产品和设备
在物联网平台创建产品和设备,获取设备证书信息(ProductKey、DeviceName和DeviceSecret)。
- 登录物联网平台控制台。
- 创建产品。
? ? ? ? ? ? ?a. 在左侧导航栏,选择设备管理>产品。?
? ? ? ? ? ? ?b. 在产品管理页,单击创建产品。
? ? ? ? ? ? ?c. 填入产品信息,单击确定。完成产品创建。
? ? ? ? ? ? ? ? ? 存量设备的数据按其本身格式通过DTU设备透传到物联网平台,因此需创建数据格式为透传/自定义的产品。产品信息设置如下图所示。
?3. 创建设备。
? ? ? ? a. 在控制台左侧导航栏,选择设备。
? ? ? ? b. 在设备管理页,单击添加设备。
? ? ? ? c. 选择刚创建的产品,输入设备名称和备注名称,单击确定。完成设备创建。
设备创建成功后,会弹出设备证书信息。您也可以在设备管理页,单击设备对应的查看按钮,进入设备详情页查看设备证书信息。该设备证书将被配置到DTU设备端。
?
定义物模型
物模型指将物理空间中的实体进行数字化,并在云端构建该实体的数据模型。在物联网平台中,定义物模型即定义产品功能(包括属性、事件、服务)。完成功能定义后,系统将自动生成该产品的物模型。本文以电机变频设备为例,需创建电机转速、电流和设置转速三个属性。
- 在物联网平台控制台的左侧导航栏,选择设备管理>产品。
- 在产品管理页,找到之前创建的产品,单击对应的查看按钮。
- 在产品详情页,选择功能定义,再单击自定义功能对应的添加功能。
- 根据下表逐个添加属性。
功能类型 | 功能名称 | 标识符 | 数据类型 | 取值范围 | 单位 | 读写类型 |
---|
属性 | 转速 | speed | int32 | 0 ~ 3000 | rpm | 只读 | 属性 | 电流 | current | int32 | 0 ~ 30 | A | 只读 | 属性 | 设置转速 | setspeed | Int32 | 0 ~ 3000 | rpm | 读写 |
编辑数据解析脚本
阿里云物联网平台支持的标准数据格式为Alink JSON格式,而存量设备的原始数据通过DTU设备透传到物联网平台,物联网平台不能直接处理此类数据。物联网平台提供数据解析功能,可将上行的自定义格式数据解析为Alink JSON格式;将下行数据解析为设备的自定义数据格式。您需在物联网平台控制台上,提交数据解析脚本供物联网平台调用。数据解析脚本需根据设备上报数据和云端下发数据进行编写。
- 在物联网平台控制台上,变频电机产品对应的产品详情页,选择数据解析页签。
- 在编辑脚本输入框中,输入解析脚本。
说明?脚本代码中属性的标识符必须与定义物模型时定义的一致。 点击查看数据解析脚本编写指导。 本示例设备发送至云端的数据为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;??? // 返回时,将数据发送至设备端。
} - 测试脚本。
- 测试上行数据解析。
- 选择模拟类型为设备上报数据。
- 在模拟输入下的输入框中,输入一个模拟数据。
本示例脚本的逻辑为:数据的第一个字节为转速值,第二个字节为电流值。例如6410 ,64表示转速为100;10表示电流为16安培。 - 单击运行。
- 在右侧运行结果栏,查看解析结果。
- 测试下行数据解析。
- 选择模拟类型为设备接受数据。
- 在模拟输入下的输入框中,输入模拟下行数据。下行数据示例如下:
{
??? "method": "thing.service.property.set",
????"id": "12345",
????"version": "1.0",
????"params": {
? "setspeed": 123
??? }
} - 单击运行。
- 在右侧运行结果栏,查看解析结果。
- 确认脚本可用后,单击提交按钮,将脚本提交到物联网平台。
注意?物联网平台不能调用草稿状态的脚本,只有已提交的脚本才会被调用来解析数据。
设备端开发
在本示例中,使用电脑模拟DTU设备端。电脑通过USB转串口与DTU连接。
注意?请确保DTU可以正确连接Internet。
- 配置DTU设备。
本示例使用F2x16 DTU设备。
- 连接DTU设备与电脑USB口。
- 在电脑上,打开DTU配置工具,配置正确的串口号,设置波特率,并打开串口。
- 单击右下方登陆配置按钮,使DTU进入配置状态。
- 单击读取配置按钮,获取现有DTU的配置。
- 确保工作协议为port。在右侧配置界面下,单击串口,再进行本地串口配置。配置信息如下图。
- 单击IoT接入配置,填入从物联网平台获取的设备证书信息和地域。
- 单击下方下发配置按钮,使配置生效。
如果配置下发失败,请单击退出登录后,重新配置。 - 完成配置后,单击退出登录按钮,使DTU进入正常工作模式。
- 将DTU断电,再重新上电。当DTU上online灯点亮后,即表示已连接上物联网平台。
您还可以在物联网平台控制台上,查看设备的状态。
- 测试数据通信。
- 测试上传数据。测试DTU设备代替存量设备上传数据到物联网平台。
- 打开串口调试工具。
注意?在本地电脑上,使用串口调试工具进行设备数据的收发模拟前,请务必确保DTU配置工具已经关闭。 - 设置串口调试工具的相关参数,并打开串口,然后单击发送。
根据物联网平台上的物模型定义,模拟发送转速和电流两个参数到云端。假定转速为150,电流为10安培,则在串口工具中,按先后顺序填写96 0A两个16进制数。 - 数据发送后,在物联网平台控制台,设备对应的设备详情页运行状态页签下,打开实时刷新开关。稍后就可以看到上传的数据。
- 测试接收云端下发数据。使用物联网平台调试真实设备功能,下发设置转速指令,测试DTU接收云端下发数据。
云端和设备端均能接收到正确数据,说明配置成功。
- 在物联网平台控制台左侧导航栏,选择监控运维>在线调试。
- 选择要调试的设备,再选择调试真实设备。
- 选择功能为已定义的转速设置属性,方法选择为设置,输入一个测试值,单击发送指令。
- 指令发送成功后,在DTU串口调试工具的接收框中,查看接收到的数据。接收到的数据中,55为数据头,数据值为64(即十进制的100)。
名词解释
- 物模型
阿里云物联网平台将设备抽象为”属性“,”事件“,”服务“三大要素。设备的三要素抽象描述,称为物模型。 - 属性
一般用于描述设备运行状态,例如电机的转速,灯的开关和亮度,水的温度。 - 事件
设备运行时的事件,一般包含需要被外部感知和处理的通知信息,例如开关机通知、报警等。 - 服务
设备可被外部调用的能力,例如调整电机转速。 - 设备证书
设备证书指ProductKey、DeviceName和DeviceSecret,是阿里云物联网平台认证设备的标识。设备证书信息不可泄露。 - ProductKey
物联网平台为产品颁发的全局唯一标识。 - DeviceName
在注册设备时,自定义的或系统自动生成的设备名称,具备产品维度内的唯一性。 - DeviceSecret
物联网平台为设备颁发的设备密钥。
|