Skip to content

规则脚本 ​

规则脚本使用 Groovy 语法(与 Java 类似)对设备上报和平台下发的原始数据进行处理和转换。

使用场景 ​

  • 设备使用自定义二进制协议,需转换为平台标准 JSON 格式
  • 对上报数据进行过滤、计算或补充
  • 将平台下发指令转换为设备可识别的格式

创建脚本 ​

  1. 进入 物联网 > 规则脚本
  2. 点击 新增,关联产品和设备
  3. 编写 Groovy 脚本代码
  4. 在线调试并保存

脚本示例 ​

1. 设备上报示例 ​

按照平台处理上报数据的系统主题和系统数据格式分别是:

json
Topic: /96/D1ELV3A5TOJS/property/post

[
  {
    "id": "temperature",
    "value": "26.45"
  },
  {
    "id": "humidity",
    "value": "65.8"
  }
]

实际设备上报的数据格式和主题分别是:

json
Topic: D1ELV3A5TOJS/post
{
  "temperature": 26.5,
  "humidity": 65.8
}
groovy
// 设备上报原始数据解码
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. 服务下发转换示例 ​

假设实际设备服务下发的主题和数据格式分别是:

JSON
Topic: D1PGLPG58KZ2/set
{
  "report_monitor": "4"
}

平台系统主题和数据格式:

json
Topic: /96/D1PGLPG58K66/property/post

[
  {
    "id": "temperature",
    "value": "26.45"
  },
  {
    "id": "humidity",
    "value": "65.8"
  }
]

我们看看脚本的定义内容:

1.将系统主题转为真实设备需要的主题
2.将系统数据格式转为真实设备需要的主题(注意:主题转换时 设备编号必须带上且长度大于9位,如果不带设备编号,需要修改后端代码)

java
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);

调试 ​

平台提供在线调试功能,可输入模拟数据测试脚本效果,确认无误后再应用到生产环境。

蜂信物联 | fastbee.cn