1.4.2.2.10 数据解析脚本开发框架-脚本定义

优质
小牛编辑
138浏览
2023-12-01

数据解析脚本开发框架-脚本定义

更新时间:2018-07-02 15:13:52

透传脚本功能介绍

脚本只需要支持以下两个方法即可接入到一站式开发平台:

  1. Alink协议数据转二进制数据
  2. 二进制数据转Alink协议数据

image.png | center | 482x393
透传脚本相关的操作请参考脚本操作

脚本定义

语言定义

目前脚本仅支持符合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

相关产品操作

在自定义的产品中添加属性, 如下图, 如需了解操作详情, 请参考功能定义

image | center

image | center

image | center

绑定脚本代码

把脚本代码复制到如下输入框中:

参考代码:

image | center

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"}

undefined | center

设备接收数据测试数据

{"method":"thing.service.property.set","id":"12345","version":"1.0","params":{"prop_float":123.452, "prop_int16":333, "prop_bool":1}}

接收数据输出结果

0x0100003039014d0142f6e76d

undefined | center

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();