创建物模型数据解析脚本

用户可对非透传、物模型16进制或自定义消息格式的产品进行添加数据解析脚本。

操作步骤

1.登录物联网平台,在控制台首页点击进入云平台,在左侧导航栏,选择产品管理

2.在产品列表页中,找到非透传、物模型16进制/自定义消息产品,进入产品详情页,点击数据解析

3.在编辑脚本窗口输入脚本,目前支持的脚本语言为JavaScript

创建解析脚本

4.测试脚本:在模拟数据框内选择模拟类型(上报/下发),输入测试数据,单击模拟运行后,查看运行结果。

5.确认脚本可用后,单击提交按钮,进行脚本的发布。

物模型数据解析脚本示例

var PROPERTY_REPORT_VALUE = 0x00; //属性上报。
var PROPERTY_REPORT_NAME = "property_report"; //属性上报。
var EVENT_REPORT_VALUE = 0x01; //事件上报。
var EVENT_REPORT_NAME = "event_report"; //事件上报。
var SERVICE_ACK_VALUE = 0x02; //服务调用设备端ack。
var SERVICE_ACK_NAME = "service_call_ack"; //服务调用设备端ack。

var EVENT_HUMI_WARNING_VALUE =1;  // 湿度告警标识
var EVENT_HUMI_WARNING_PROPERTY = "TEST_EVENT";  // 湿度告警标识,和后台物模型定义事件标识保持一致

var COMMAND_TYPE_FLAG = "command_type";  //下行指令类型标识符号

var COMMAND_SET_PROPERTY = "set_property";   //下行指令类型-属性设置
var COMMAND_SET_PROPERTY_VALUE = 0;   //属性设置的标识值

var COMMAND_SERVICE_CALL = "service_call";   //下行指令类型-服务调用
var COMMAND_SERVICE_CALL_VALUE = 1;   //服务调用的标识值

var COMMAND_ASK_PROPERTY = "ask_property";   //下行指令类型-属性设置
var COMMAND_ASK_PROPERTY_VALUE = 0x02;   //属性设置的标识值

var COMMAD_UNKOWN = 404;

// service 示例
var EXAMPLE_SERVICE_IDENTIFY = "switch";
var EXAMPLE_SERVICE_IDENTIFY_VALUE = 1;


// 属性上报  head+message_id+参数1+参数2+......
var property_report = "00ff000001f0ff013FA00000";
// 事件上报 head+messageId+ 事件标识 + 参数1+参数2+......
var event_report = "01ff00000101f0ff013FA00000";
// 服务调用ack haed + messageId + 参数...
var event_report = "02ff00000101";

/**
 * 上行16进制字符串转物模型JSON入口
 * 
*/
function rawDataToProtocol(strString) {
    var bytes = str2Bytes(strString);
    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 == PROPERTY_REPORT_VALUE) {
        jsonMap['report_type'] = PROPERTY_REPORT_NAME; //ALink JSON格式,属性上报topic。
        jsonMap['message_id'] = dataView.getUint32(1); //ALink JSON格式,属性上报topic。
        var params = {};
        params['prop_int'] = dataView.getInt8(5); //对应产品属性中prop_int16。
        params['uint8_prop'] = dataView.getUint8(6); //对应产品属性中prop_bool。
        params['bool_prop'] =  uint8Array[7];
        params['prop_float'] = dataView.getFloat32(8); //对应产品属性中prop_float。
        jsonMap['params'] = params; //ALink JSON格式,params标准字段。

    } else if(fHead == EVENT_REPORT_VALUE) {
        jsonMap['report_type'] = EVENT_REPORT_NAME; //ALink JSON格式,属性上报topic。
        jsonMap['message_id'] = dataView.getUint32(1); //ALink JSON格式,属性上报topic。

       var event_flag_value = uint8Array[5];
       // 判断事件标识
       if(event_flag_value == EVENT_HUMI_WARNING_VALUE){
           jsonMap['event'] = EVENT_HUMI_WARNING_PROPERTY;
       }

        var params = {};
        params['prop_int'] = dataView.getInt8(6); //对应产品属性中prop_int16。
        jsonMap['params'] = params; //ALink JSON格式,params标准字段。
    }else if(fHead == SERVICE_ACK_VALUE){
        jsonMap['report_type'] = SERVICE_ACK_NAME; //ALink JSON格式,属性上报topic。
        jsonMap['message_id'] = dataView.getUint32(1); //ALink JSON格式,属性上报topic。
        dataView.getUint8(5);
        // 其他参数....
        var params = {};
        jsonMap['result'] = params; //
    }

     // 必须stringify 格式化
    return JSON.stringify(jsonMap);
}



var setProperty = {
    command_type:"set_property",
    params:{
        prop_float:123.452,
        prop_int16:45,
        prop_bool: 1
    },
    message_id:4278190081
}

var askProperty = {
    command_type:"ask_property",
    params:"prop_float",
    message_id:4278190081
}

var serviceCall = {
    command_type:"service_call",
    service_identify: "switch",
    params:{
        on: 1
    },
    message_id:4278190081
}

/**
 * 下行json格式数据转十六进制字符串入口
 * 
*/
function protocolToRawData(json) {
    var command_type = json['command_type'];
    var message_id = json['message_id'];

    var payloadArray = [];

    // 参数
    var params = json['params'];
    var prop_float = params['prop_float'];
    var prop_int16 = params['prop_int'];
    var prop_bool = params['prop_bool'];
    var prop_int = params['on'];

    if (command_type == COMMAND_SET_PROPERTY) //属性设置。
    {
        //属性设置,按照自定义格式组装数据 rawData。
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SET_PROPERTY_VALUE)); //command字段。
        payloadArray = payloadArray.concat(buffer_int32(message_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'的值。
    } else if (command_type ==  COMMAND_SERVICE_CALL) { //服务调用。
        //服务调用, 按照自定义格式组装数据
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SERVICE_CALL_VALUE));             //command字段。
        payloadArray = payloadArray.concat(buffer_int32(message_id));
        //判断服务标识,自定义服务标识对应的标识值
        if(json['service_identify']==EXAMPLE_SERVICE_IDENTIFY){
        payloadArray = payloadArray.concat(buffer_uint8(EXAMPLE_SERVICE_IDENTIFY_VALUE)); 
    }
        payloadArray = payloadArray.concat(buffer_int16(prop_int16)); //属性'prop_int16'的值。       
    } else if(command_type ==  COMMAND_ASK_PROPERTY) { //未知命令,对于这些命令不做处理。
        payloadArray = payloadArray.concat(buffer_uint8(COMMAND_ASK_PROPERTY_VALUE)); //command字段。
        payloadArray = payloadArray.concat(buffer_int32(message_id));
        payloadArray = payloadArray.concat(buffer_int16(prop_int16)); //属性'prop_int16'的值。
    }else{
        var code = json['code'];
        payloadArray = payloadArray.concat(buffer_uint8(COMMAD_UNKOWN)); //command字段。
        payloadArray = payloadArray.concat(buffer_int32(parseInt(message_id))); //ALink JSON格式'id'。
        payloadArray = payloadArray.concat(buffer_uint8(code));
    }
    return bytes2Str(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);
}


/*
字符串转字节数组
*/
function str2Bytes(str)
{
    var pos = 0;
    var len = str.length;
    if(len %2 != 0)
    {
       return null; 
    }

    len /= 2;
    var hexA = new Array();
    for(var i=0; i<len; i++)
    {
       var s = str.substr(pos, 2);
       var v = parseInt(s, 16);
       hexA.push(v);
       pos += 2;
    }
    return hexA;
}

/* 字节数组转字符串 */
function bytes2Str(arr)
{
    var str = "";
    for(var i=0; i<arr.length; i++)
    {
       var tmp = arr[i].toString(16);
       if(tmp.length == 1)
       {
           tmp = "0" + tmp;
       }
       str += tmp;
    }
    return str;
}

results matching ""

    No results matching ""