创建物模型数据解析脚本
用户可对非透传、物模型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;
}