数据解析任务中源节点的Topic数据格式为原始数据时,可以使用自定义脚本进行解析。物联网平台支持配置JavaScript(ECMAScript 5)、Python 2.7和PHP 7.2语言的脚本。本文介绍自定义Topic数据解析脚本模板和示例。
JavaScript脚本示例
脚本模板
/**
* 将设备自定义Topic数据转换为JSON格式数据,设备上报数据到物联网平台时调用。
* 入参:data,byte[]数组,不能为空。
* 出参:jsonObj,对象,不能为空。
*/
function executeScript(data) {
var jsonObj = {};
return jsonObj;
}
脚本示例
/*
示例数据:
自定义Topic:
/user/update,上报数据。
输入参数:
data: 0x000000000100320100000000
输出参数:
{
"prop_float": 0,
"prop_int16": 50,
"prop_bool": 1
}
*/
function executeScript(data) {
var uint8Array = new Uint8Array(data.length);
for (var i = 0; i < data.length; i++) {
uint8Array[i] = data[i] & 0xff;
}
var dataView = new DataView(uint8Array.buffer, 0);
var jsonMap = {};
jsonMap['prop_int16'] = dataView.getInt16(5);
jsonMap['prop_bool'] = uint8Array[7];
jsonMap['prop_float'] = dataView.getFloat32(8);
return jsonMap;
}
Python脚本示例
脚本模板
# 将设备自定义Topic数据转换为JSON格式数据,设备上报数据到物联网平台时调用。
# 入参: data,列表,列表元素取值为int类型,不能为空。
# 出参: jsonObj,字典。
def execute_script(data):
jsonObj = {}
return jsonObj
脚本示例
# coding=UTF-8
# 示例数据:
# 自定义Topic:/user/update,上报数据。
# 输入参数:
# data: 0x000000000100320100000000
# 输出参数:
# {
# "prop_float": 0,
# "prop_int16": 50,
# "prop_bool": 1
# }
def execute_script(data):
uint8Array = []
for byteValue in data:
uint8Array.append(byteValue & 0xff)
jsonMap = {}
jsonMap['prop_int16'] = bytes_to_int(uint8Array[5:7])
jsonMap['prop_bool'] = bytes_to_int(uint8Array[7: 8])
jsonMap['prop_float'] = bytes_to_int(uint8Array[8:])
return jsonMap
# byte数组转换为整型。
def bytes_to_int(bytes):
data = ['%02X' % i for i in bytes]
return int(''.join(data), 16)
PHP脚本示例
脚本模板
<?php
/**
* 将设备自定义Topic数据转换为JSON格式数据,设备上报数据到物联网平台时调用。
* 入参:$data,普通数组,数组元素为整数。
* 出参:$jsonObj,关联数组,关联数组key取值为英文字符串不能是字符的数字如"10",不能为空。
*/
function executeScript($data)
{
$jsonObj = array();
return $jsonObj;
}
重要
请避免使用全局变量或者static变量,否则会造成执行结果不一致。
脚本中,处理数据采用补码的方式, [-128, 127]补码范围为[0, 255]。例如:-1对应的补码为255(10进制表示)。
自定义协议解析的函数(executeScript)的入参为整型数组,需要通过0xFF进行与操作,获取其对应的补码。返回结果为关联数组,要求key取值包含非数组字符(例如:数组key为“10”,PHP数组中会获取到整数10)。
PHP执行环境对于异常处理要求严格,例如:发生错误会直接抛出异常,后续代码不会执行。为保证代码的健壮性,对于异常需要捕获并进行处理。
脚本示例
<?php
/*
示例数据
自定义Topic:
/user/update,上报数据。
输入参数:
data: 0x000000000100320100000000。
输出参数:
{
"prop_float": 0,
"prop_int16": 50,
"prop_bool": 1
}
*/
function executeScript($bytes)
{
$data = array();
$length = count($bytes);
for ($i = 0; $i < $length; $i++) {
$data[$i] = $bytes[$i] & 0xff;
}
$jsonMap = array();
$jsonMap['prop_int16'] = getInt16($data, 5);
$jsonMap['prop_bool'] = $data[7];
return $jsonMap;
}
function getInt16($bytes, $index)
{
$array = array($bytes[$index], $bytes[$index + 1]);
return hexdec(byteArrayToHexString($array));
}
function byteArrayToHexString($data)
{
$hexStr = '';
for ($i = 0; $i < count($data); $i++) {
$hexValue = dechex($data[$i]);
$tempHexStr = strval($hexValue);
if (strlen($tempHexStr) === 1) {
$hexStr = $hexStr . '0' . $tempHexStr;
} else {
$hexStr = $hexStr . $tempHexStr;
}
}
return $hexStr;
}
相关文档
选择脚本语言,完成自定义脚本编辑和调试。具体操作,请参见配置源节点。