创建云云对接数据解析脚本
完成设备和产品物模型的创建,为了和电信AEP平台进行通信,物联网平台的物模型和中国电信平台物模型的数据格式不同,需要在产品管理相应产品下创建数据解析脚本进行格式转换。
示例编写了电信非透传设备的JS脚本,如下:
//上行:属性上报,事件上报
var PROPERTY_REPORT_NAME = "property_report"; //属性上报。
var EVENT_REPORT_NAME = "event_report"; //事件上报。
var EVENT_HUMI_WARNING_PROPERTY = "TEST_EVENT"; // 测试事件,和后台物模型定义事件标识保持一致
// 下行:服务调用
var EXAMPLE_SERVCE_IDENTIFY = "ontemp";
/**
* 上行平台间物模型数据格式转换
*
*/
function rawDataToProtocol(strString) {
var jsonMap = {}
var report = JSON.parse(strString);
if (report.reportType == 1) {
jsonMap['report_type'] = PROPERTY_REPORT_NAME; //必要字段,JSON格式,属性上报
var params = {};
params['temp'] = report.temp; //对应产品属性中temp。
jsonMap['params'] = params; //必要字段,JSON格式,属性上报参数。
} else if(report.reportType == 2) {
jsonMap['report_type'] = EVENT_REPORT_NAME; //必要字段,JSON格式,事件标识。
// 判断事件标识
jsonMap['event'] = EVENT_HUMI_WARNING_PROPERTY;
var params = {};
params['temp'] = report.temp; //对应产品属性中prop_int16。
jsonMap['params'] = params; //必要字段,JSON格式,事件上报参数。
}
// 必须stringify 格式化
return JSON.stringify(jsonMap);
}
/**
* 下行平台间物模型数据格式转换
*
*/
function protocolToRawData(json) {
var result ={};
var obj= JSON.parse(json);
var params=obj.params;
result.serviceIdentify=EXAMPLE_SERVICE_IDENTIFY; //必要字段,JSON格式,服务标识。
result.params=params; //必要字段,JSON格式,服务调用参数。
return JSON.stringify(result);
}
脚本写完后可以在旁边的模拟数据中先进行测试,如果所有的模拟数据对应的模拟运行结果如预期一样则说明脚本编写完成,如下:
电信透传设备JS脚本编写可参考如下:
var PROPERTY_REPORT_VALUE = 0x00; //属性上报。
var PROPERTY_REPORT_NAME = "property_report"; //属性上报。
var EVENT_REPORT_VALUE = 0x01; //事件上报。
var EVENT_REPORT_NAME = "event_report"; //事件上报。
var EVENT_HUMI_WARNING_VALUE =1; // 湿度告警标识
var EVENT_HUMI_WARNING_PROPERTY = "TEST_EVENT"; // 湿度告警标识,和后台物模型定义事件标识保持一致
var COMMAND_TYPE_FLAG = "command_type"; //下行指令类型标识符号
// service 示例
var EXAMPLE_SERVICE_IDENTIFY = "service1";
var EXAMPLE_SERVICE_IDENTIFY_VALUE = 1;
// 属性上报 head+参数1+参数2+......
var property_report = "00f0ff013FA00000";
// 事件上报 head+ 事件标识 + 参数1+参数2+......
var event_report = "0101f0ff013FA00000";
/**
* 上行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; //必要字段,JSON格式,属性上报topic。
var params = {};
params['prop_int'] = dataView.getInt8(1); //对应产品属性中prop_int16。
params['uint8_prop'] = dataView.getUint8(2); //对应产品属性中prop_bool。
params['bool_prop'] = uint8Array[3];
params['prop_float'] = dataView.getFloat32(4); //对应产品属性中prop_float。
jsonMap['params'] = params; //必要字段,JSON格式,属性上报参数。
} else if(fHead == EVENT_REPORT_VALUE) {
jsonMap['report_type'] = EVENT_REPORT_NAME; //必要字段,JSON格式,属性上报。
var event_flag_value = uint8Array[1];
// 判断事件标识
if(event_flag_value == EVENT_HUMI_WARNING_VALUE){
jsonMap['event'] = EVENT_HUMI_WARNING_PROPERTY;
}
var params = {};
params['prop_int'] = dataView.getInt8(2); //对应产品属性中prop_int16。
jsonMap['params'] = params; //必要字段,JSON格式,事件上报参数。
}
// 必须stringify 格式化
return JSON.stringify(jsonMap);
}
/**
* 下行json格式数据转十六进制字符串入口
*
*/
function protocolToRawData(json) {
var command_type = json['command_type'];
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'];
payloadArray = payloadArray.concat(buffer_uint8(COMMAND_SERVICE_CALL_VALUE)); //command字段。
//判断服务标识,自定义服务标识对应的标识值
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'的值。
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 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;
}