1.4.2.2.10 数据解析脚本开发框架-脚本定义
优质
小牛编辑
138浏览
2023-12-01
数据解析脚本开发框架-脚本定义
更新时间:2018-07-02 15:13:52
透传脚本功能介绍
脚本只需要支持以下两个方法即可接入到一站式开发平台:
- Alink协议数据转二进制数据
- 二进制数据转Alink协议数据
透传脚本相关的操作请参考脚本操作。
脚本定义
语言定义
目前脚本仅支持符合ECMAScript 5.1的JavaScript语法。
方法定义
Alink协议数据转二进制数据
方法如下:
解析服务端发送的AlinkJson数据,并转换为二进制数据返回
function protocalToRawData(jsonObj){
return rawdata;
}
参数定义:
输入参数jsonObj :符合产品TSL定义的Alink协议格式数据, 如:
{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}
返回参数 :二进制byte数组, 如
0x0100003039014d0142f6e76d
二进制数据转Alink协议数据
方法如下:
解析设备端发送的二进制数据,并转换为AlinkJson数据返回
function rawDataToProtocal(rawData){
return jsonObj;
}
参数定义:
输入参数rawData :二进制byte数组, 如
0x00002233441232013fa00000
返回参数 :符合产品TSL定义的Alink协议格式数据, 如:
{"method":"thing.event.property.post","id":"2241348","params":{"prop_float":1.25,"prop_int16":4658,"prop_bool":1},"version":"1.0"}
自动生成脚本
通过该功能我们会直接读取TSL数据, 并使用云平台定制的协议直接生成对应的脚本文件。但需要注意的是, 使用该功能时请配套使用为了设备端开发的MCUSDK(使用同一版本定制协议), 详情参考MCUSDK文档
示例demo
相关产品操作
在自定义的产品中添加属性, 如下图, 如需了解操作详情, 请参考功能定义
绑定脚本代码
把脚本代码复制到如下输入框中:
参考代码:
var COMMAND_REPORT = 0x00;
var COMMAND_SET = 0x01;
var ALINK_PROP_REPORT_METHOD = 'thing.event.property.post'; //标准ALink协议topic, 设备 上传属性数据到 云端
var ALINK_PROP_SET_METHOD = 'thing.service.property.set'; //标准ALink协议topic, 云端 下发属性控制指令 到设备端
/*
示例数据:
传入参数 ->
0x00002233441232013fa00000
输出结果 ->
{"method":"thing.event.property.post","id":"2241348",
"params":{"prop_float":1.25,"prop_int16":4658,"prop_bool":1},
"version":"1.0"}
*/
function rawDataToProtocol(bytes)
{
var uint8Array = new Uint8Array(bytes.length);
for (var i = 0; i < bytes.length; i++)
{
uint8Array[i] = bytes[i] & 0xff;
}
var dataView = new DataView(uint8Array.buffer, 0);
var jsonMap = new Object();
var fHead = uint8Array[0]; // command
if (fHead == COMMAND_REPORT)
{
jsonMap['method'] = ALINK_PROP_REPORT_METHOD; //Alink协议 - 属性上报topic
jsonMap['version'] = '1.0'; //Alink协议 - 协议版本号固定字段
jsonMap['id'] = '' + dataView.getInt32(1); //Alink协议 - 标示该次请求id值
var params = {};
params['prop_int16'] = dataView.getInt16(5); //对应产品属性中 prop_int16
params['prop_bool'] = uint8Array[7];//对应产品属性中 prop_bool
params['prop_float'] = dataView.getFloat32(8);//对应产品属性中 prop_float
jsonMap['params'] = params;//Alink协议 - params标准字段
}
return jsonMap;
}
/*
示例数据:
传入参数 ->
{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}
输出结果 ->
0x0100003039014d0142f6e76d
*/
function protocolToRawData(json)
{
var method = json['method'];
var id = json['id'];
var version = json['version'];
var payloadArray = [];
if (method == ALINK_PROP_SET_METHOD) // 属性设置
{
var params = json['params'];
var prop_float = params['prop_float'];
var prop_int16 = params['prop_int16'];
var prop_bool = params['prop_bool'];
//按照自定义协议格式拼接 rawdata
payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET)); // command字段
payloadArray = payloadArray.concat(buffer_int32(parseInt(id))); // Alink协议 'id'
payloadArray = payloadArray.concat(buffer_int16(prop_int16)); // 属性'prop_int16'的值
payloadArray = payloadArray.concat(buffer_uint8(prop_bool)); // 属性'prop_bool'的值
payloadArray = payloadArray.concat(buffer_float32(prop_float)); // 属性'prop_float'的值
}
return payloadArray;
}
//以下是部分辅助函数
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);
}
protocolToRawData 的返回值需要是个数组,例如
["123"]
。
数据测试
设备上报数据测试数据
0x00002233441232013fa00000
上报数据输出结果
{"method":"thing.event.property.post","id":"2241348",
"params":{"prop_float":1.25,"prop_int16":4658,"prop_bool":1},
"version":"1.0"}
设备接收数据测试数据
{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}
接收数据输出结果
0x0100003039014d0142f6e76d
Demo也支持在本地环境中进行调用
// Test Demo
function Test()
{
//0x001232013fa00000
var rawdata_report_prop = new Buffer([
0x00, //固定command头, 0代表是上报属性
0x00, 0x22, 0x33, 0x44, //对应id字段, 标记请求的序号
0x12, 0x32, //两字节 int16, 对应属性 prop_int16
0x01, //一字节 bool, 对应属性 prop_bool
0x3f, 0xa0, 0x00, 0x00 //四字节 float, 对应属性 prop_float
]);
rawDataToProtocol(rawdata_report_prop);
var setString = new String('{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}');
protocolToRawData(JSON.parse(setString));
}
Test();