138 lines
4.7 KiB
Groovy
138 lines
4.7 KiB
Groovy
// 数据桥接脚本 - 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;
|
||
}
|
||
} |