规则脚本
大约 2 分钟
规则脚本
规则脚本使用 Groovy 语法(与 Java 类似)对设备上报和平台下发的原始数据进行处理和转换。
使用场景
- 设备使用自定义二进制协议,需转换为平台标准 JSON 格式
- 对上报数据进行过滤、计算或补充
- 将平台下发指令转换为设备可识别的格式
创建脚本
- 进入 物联网 > 规则脚本
- 点击 新增,关联产品和设备
- 编写 Groovy 脚本代码
- 在线调试并保存
脚本示例
1. 设备上报示例
按照平台处理上报数据的系统主题和系统数据格式分别是:
Topic: /96/D1ELV3A5TOJS/property/post
[
{
"id": "temperature",
"value": "26.45"
},
{
"id": "humidity",
"value": "65.8"
}
]实际设备上报的数据格式和主题分别是:
Topic: D1ELV3A5TOJS/post
{
"temperature": 26.5,
"humidity": 65.8
}// 设备上报原始数据解码
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.NumberUtil;
//系统主题
String sysTopic = '';
//系统数据格式
String sysPayload = '';
// 1. 获取主题和内容,topic S&D1PGLPG58K66/post
String name = msgContext.getTopic();
Long productId = msgContext.getProductId();
String serialNumber = msgContext.getSerialNumber();
String protocolCode = msgContext.getProtocolCode();
String payload = msgContext.getPayload();
msgContext.printlog("产品id/协议编号:" + productId + " / " + protocolCode);
// 2. 转换为系统主题 /96/D1ELV3A5TOJS/property/post
sysTopic = "/" + productId + "/" + serialNumber + "/property/post"
if("JSON".equals(protocolCode)){
// 3. 内容格式转换
JSONArray newArray = new JSONArray();
JSONObject jsonObject = JSONUtil.parseObj(payload);
jsonObject.keySet().forEach(key -> {
JSONObject newObject =new JSONObject();
newObject.put("id" , key);
newObject.put("value" , jsonObject.getStr(key));
newArray.add(newObject);
});
sysPayload = newArray.toString();
}else{
//其他协议处理
}
// 4.打印
msgContext.printlog("新主题:" + sysTopic);
msgContext.printlog("新内容:" + sysPayload);
// 5. 返回新的数据(必要)
msgContext.setTopic(sysTopic)
msgContext.setPayload(sysPayload);5. 服务下发转换示例
假设实际设备服务下发的主题和数据格式分别是:
Topic: D1PGLPG58KZ2/set
{
"report_monitor": "4"
}平台系统主题和数据格式:
Topic: /96/D1PGLPG58K66/property/post
[
{
"id": "temperature",
"value": "26.45"
},
{
"id": "humidity",
"value": "65.8"
}
]我们看看脚本的定义内容:
1.将系统主题转为真实设备需要的主题
2.将系统数据格式转为真实设备需要的主题(注意:主题转换时 设备编号必须带上且长度大于9位,如果不带设备编号,需要修改后端代码)
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.NumberUtil;
//系统主题
String tranTopic = '';
//系统数据格式
String tranPayload = '';
// 1. 获取主题和内容
String topic = msgContext.getTopic();
String payload = msgContext.getPayload();
Long productId = msgContext.getProductId();
String serialNumber = msgContext.getSerialNumber();
String protocolCode = msgContext.getProtocolCode();
// 2. topic转换 将/60/DEVICE555/function/get 系统主题 转为 DEVICE555/set
tranTopic = serialNumber+ "/set";
if("JSON".equals(protocolCode)){
// 3. 转发的数据 {"temperature":26.5,"humidity":65.8}
JSONArray jsonArray = JSONUtil.parseArray(payload);
JSONObject resultObj = new JSONObject();
jsonArray.forEach(obj -> {
JSONObject jsonObject = (JSONObject)obj;
resultObj.put(jsonObject.getStr("id"),jsonObject.getStr("value"));
});
tranPayload = JSONUtil.toJsonStr(resultObj);
}else{
//其他协议处理
}
// 4.打印
msgContext.printlog("转发主题:" + tranTopic);
msgContext.printlog("转发内容:" + tranPayload);
// 5. 返回新的数据(必要)
msgContext.setTopic(tranTopic);
msgContext.setPayload(tranPayload);调试
平台提供在线调试功能,可输入模拟数据测试脚本效果,确认无误后再应用到生产环境。
