// 数据桥接脚本 - 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; } }