fastbee/docs/scripts/data_bridge_script.groovy
2026-07-26 09:38:34 +08:00

138 lines
4.7 KiB
Groovy
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 数据桥接脚本 - FastBee物模型格式转第三方平台格式
// 输入格式:[{"message":[{"id":"物模型标识","value":"值"...}],"sources":"..."}]
// 输出格式:{"设备编号":{"节点标识":{"字段":值}}}
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import cn.hutool.core.util.NumberUtil;
// 在Groovy脚本中,msgContext对象直接可用
// 获取上下文信息
String topic = msgContext.getTopic();
String payload = msgContext.getPayload();
String serialNumber = msgContext.getSerialNumber();
msgContext.logger.info("数据桥接 - 接收到FastBee数据: 设备={}, payload={}", serialNumber, payload);
// 数据转换处理
try {
// 直接解析为JSONArray(实际格式是对象数组)
JSONArray inputArray = JSONUtil.parseArray(payload);
if (inputArray == null || inputArray.isEmpty()) {
msgContext.logger.warn("数据桥接 - 输入数据为空");
return;
}
msgContext.logger.info("数据桥接 - 解析到 {} 个物模型项", inputArray.size());
// 准备输出数据结构
JSONObject outputData = new JSONObject();
JSONObject deviceData = new JSONObject();
// 初始化两个节点容器
JSONObject L3_MS_1 = new JSONObject(); // 频率、温度、压力
JSONObject S1_ZT_1 = new JSONObject(); // 经纬度、电压
// 遍历物模型数据,进行字段映射
for (int i = 0; i < inputArray.size(); i++) {
JSONObject item = inputArray.getJSONObject(i);
String identifier = item.getStr("id");
Object value = item.get("value");
if (identifier == null || value == null) {
msgContext.logger.debug("跳过空项: {}", item);
continue;
}
msgContext.logger.debug("处理物模型项: id={}, value={}", identifier, value);
switch (identifier) {
// 字段映射 - 频率通道 -> L3_MS_1
case "F_CH1":
L3_MS_1.set("hz1", convertValue(value))
break
case "F_CH2":
L3_MS_1.set("hz2", convertValue(value))
break
case "F_CH3":
L3_MS_1.set("hz3", convertValue(value))
break
// 字段映射 - 温度通道 -> L3_MS_1
case "T_CH1":
L3_MS_1.set("wd1", convertValue(value))
break
case "T_CH2":
L3_MS_1.set("wd2", convertValue(value))
break
case "T_CH3":
L3_MS_1.set("wd3", convertValue(value))
break
// 字段映射 - 压力 -> L3_MS_1
case "KN":
L3_MS_1.set("value", convertValue(value))
break
// 字段映射 - 经纬度、电压 -> S1_ZT_1
case "Lont":
S1_ZT_1.set("lon", convertValue(value))
break
case "Lat":
S1_ZT_1.set("lat", convertValue(value))
break
case "Vol":
S1_ZT_1.set("ext_power_volt", convertValue(value))
break
default:
msgContext.logger.debug("未映射的物模型标识: {}", identifier)
break;
}
}
// 组装输出数据结构
// 只有非空节点才添加到输出
if (!L3_MS_1.isEmpty()) {
deviceData.set("L3_MS_1", L3_MS_1);
msgContext.logger.info("L3_MS_1 节点字段数: {}", L3_MS_1.size());
}
if (!S1_ZT_1.isEmpty()) {
deviceData.set("S1_ZT_1", S1_ZT_1);
msgContext.logger.info("S1_ZT_1 节点字段数: {}", S1_ZT_1.size());
}
// 使用上下文中的设备编号
if (serialNumber == null) {
throw new IllegalArgumentException("数据桥接失败:serialNumber 不能为空");
}
outputData.set(serialNumber, deviceData);
// 构建新的payload
String newPayload = outputData.toString();
msgContext.logger.info("数据桥接 - 转换完成: 设备={}, 输出payload={}", serialNumber, newPayload);
// 返回新的数据
msgContext.setTopic(topic);
msgContext.setPayload(newPayload);
} catch (Exception e) {
msgContext.logger.error("数据桥接 - 转换异常: ", e);
// 转换失败时保持原数据
msgContext.setTopic(topic);
msgContext.setPayload(payload);
}
// 执行Action动作参数(脚本由系统自动生成)
msgContext.setData("mqttBridgeID", 3);
// 辅助方法:转换值为数字类型(保持精度)
Object convertValue(Object value) {
if (value == null) {
return null;
}
try {
String strValue = String.valueOf(value);
return Double.parseDouble(strValue);
} catch (Exception e) {
return value;
}
}