diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java new file mode 100644 index 0000000..1a3ed58 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java @@ -0,0 +1,113 @@ +package com.casic.methane.frame.xfdz; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameXF extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", getDevTypeName() + "Data"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray dataArr = new JSONArray(); + for (DataItem dataItem : dataItemList) { + dataArr.add(dataItem.toJSON()); + + int cellVal = NumberUtil.toBigInteger(((MethaneDataItemXF) dataItem).getBat()).intValue(); + body.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemXF dataItem = new MethaneDataItemXF(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } + + private void setLGGasData(DataGasliquidGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java new file mode 100644 index 0000000..1a3ed58 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java @@ -0,0 +1,113 @@ +package com.casic.methane.frame.xfdz; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameXF extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", getDevTypeName() + "Data"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray dataArr = new JSONArray(); + for (DataItem dataItem : dataItemList) { + dataArr.add(dataItem.toJSON()); + + int cellVal = NumberUtil.toBigInteger(((MethaneDataItemXF) dataItem).getBat()).intValue(); + body.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemXF dataItem = new MethaneDataItemXF(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } + + private void setLGGasData(DataGasliquidGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java new file mode 100644 index 0000000..4d896ce --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java @@ -0,0 +1,38 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemXF extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gas); + data.put("vbat", bat); + data.put("sig", sig); + data.put("temp", temp); + data.put("ssState", ssState); + data.put("batsta", ""); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java new file mode 100644 index 0000000..1a3ed58 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java @@ -0,0 +1,113 @@ +package com.casic.methane.frame.xfdz; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameXF extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", getDevTypeName() + "Data"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray dataArr = new JSONArray(); + for (DataItem dataItem : dataItemList) { + dataArr.add(dataItem.toJSON()); + + int cellVal = NumberUtil.toBigInteger(((MethaneDataItemXF) dataItem).getBat()).intValue(); + body.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemXF dataItem = new MethaneDataItemXF(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } + + private void setLGGasData(DataGasliquidGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java new file mode 100644 index 0000000..4d896ce --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java @@ -0,0 +1,38 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemXF extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gas); + data.put("vbat", bat); + data.put("sig", sig); + data.put("temp", temp); + data.put("ssState", ssState); + data.put("batsta", ""); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java new file mode 100644 index 0000000..9e9f37d --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java @@ -0,0 +1,120 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import com.casic.common.general.EventItem; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameXF extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public void parseMessageBody() { + JSONArray eventArray = getMessageBody().getJSONArray("DATAS"); + eventItemList = new ArrayList<>(); + for (int i = 0; i < eventArray.size(); i++) { + JSONObject dataObj = eventArray.getJSONObject(i); + MethaneEventItemXF eventItem = new MethaneEventItemXF(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", "LGGasOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemXF item = (MethaneEventItemXF) eventItem; + switch (item.getEventType().toUpperCase()) { + case "GASL": + // 浓度低报 + eventArr.add(item.toJSON()); + break; + + case "GASH": + // 浓度高报 + eventArr.add(item.toJSON()); + break; + + case "LIQUID": + // 液位报警 + if (item.getValue().equals("0")) { + eventArr.add("CancelWaterImmersionAlarm"); // 解除液位报警 + } else { + eventArr.add("WaterImmersionAlarm"); + } + break; + + case "MV": + // 位移报警 + eventArr.add(item.toJSON()); + break; + + case "VIBERATE": + // 振动报警 不自动消警 + if (item.getValue().equals("1")) { + eventArr.add("VibrationAlarm"); + } + break; + + case "SENSORSTATE": + // 传感器故障报警 + eventArr.add("sensorState"); + break; + + case "BATL": + // 低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "TEMPL": + // 温度超低限报警 + eventArr.add(item.toJSON()); + break; + + case "TEMPH": + // 温度超高限报警 + eventArr.add(item.toJSON()); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java new file mode 100644 index 0000000..1a3ed58 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java @@ -0,0 +1,113 @@ +package com.casic.methane.frame.xfdz; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameXF extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", getDevTypeName() + "Data"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray dataArr = new JSONArray(); + for (DataItem dataItem : dataItemList) { + dataArr.add(dataItem.toJSON()); + + int cellVal = NumberUtil.toBigInteger(((MethaneDataItemXF) dataItem).getBat()).intValue(); + body.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemXF dataItem = new MethaneDataItemXF(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } + + private void setLGGasData(DataGasliquidGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java new file mode 100644 index 0000000..4d896ce --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java @@ -0,0 +1,38 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemXF extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gas); + data.put("vbat", bat); + data.put("sig", sig); + data.put("temp", temp); + data.put("ssState", ssState); + data.put("batsta", ""); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java new file mode 100644 index 0000000..9e9f37d --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java @@ -0,0 +1,120 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import com.casic.common.general.EventItem; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameXF extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public void parseMessageBody() { + JSONArray eventArray = getMessageBody().getJSONArray("DATAS"); + eventItemList = new ArrayList<>(); + for (int i = 0; i < eventArray.size(); i++) { + JSONObject dataObj = eventArray.getJSONObject(i); + MethaneEventItemXF eventItem = new MethaneEventItemXF(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", "LGGasOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemXF item = (MethaneEventItemXF) eventItem; + switch (item.getEventType().toUpperCase()) { + case "GASL": + // 浓度低报 + eventArr.add(item.toJSON()); + break; + + case "GASH": + // 浓度高报 + eventArr.add(item.toJSON()); + break; + + case "LIQUID": + // 液位报警 + if (item.getValue().equals("0")) { + eventArr.add("CancelWaterImmersionAlarm"); // 解除液位报警 + } else { + eventArr.add("WaterImmersionAlarm"); + } + break; + + case "MV": + // 位移报警 + eventArr.add(item.toJSON()); + break; + + case "VIBERATE": + // 振动报警 不自动消警 + if (item.getValue().equals("1")) { + eventArr.add("VibrationAlarm"); + } + break; + + case "SENSORSTATE": + // 传感器故障报警 + eventArr.add("sensorState"); + break; + + case "BATL": + // 低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "TEMPL": + // 温度超低限报警 + eventArr.add(item.toJSON()); + break; + + case "TEMPH": + // 温度超高限报警 + eventArr.add(item.toJSON()); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java new file mode 100644 index 0000000..f2b344a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java @@ -0,0 +1,56 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemXF extends EventItem { + String eventType; + String value; + String time; + + @Override + public JSONObject toJSON() { + JSONObject event = new JSONObject(); + + switch (getEventType().toUpperCase()) { + case "MV": + event.put("alarmType", "DisplacementAlarm"); + String[] location = value.split(","); + if (location.length == 2) { + event.put("lon", location[0]); + event.put("lat", location[1]); + } else { + event.put("lon", "0.00"); + event.put("lat", "0.00"); + } + break; + case "GASL": + event.put("alarmType", "GasLeakLowAlarm"); + event.put("alarmValue", value); + break; + case "GASH": + event.put("alarmType", "GasLeakHighAlarm"); + event.put("alarmValue", value); + break; + case "TEMPL": + event.put("alarmType", "TempOverLowAlarm"); + event.put("alarmValue", value); + break; + case "TEMPH": + event.put("alarmType", "TempOverHighAlarm"); + event.put("alarmValue", value); + break; + } + + return event; + } + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java new file mode 100644 index 0000000..1a3ed58 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java @@ -0,0 +1,113 @@ +package com.casic.methane.frame.xfdz; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameXF extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", getDevTypeName() + "Data"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray dataArr = new JSONArray(); + for (DataItem dataItem : dataItemList) { + dataArr.add(dataItem.toJSON()); + + int cellVal = NumberUtil.toBigInteger(((MethaneDataItemXF) dataItem).getBat()).intValue(); + body.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemXF dataItem = new MethaneDataItemXF(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } + + private void setLGGasData(DataGasliquidGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java new file mode 100644 index 0000000..4d896ce --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java @@ -0,0 +1,38 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemXF extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gas); + data.put("vbat", bat); + data.put("sig", sig); + data.put("temp", temp); + data.put("ssState", ssState); + data.put("batsta", ""); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java new file mode 100644 index 0000000..9e9f37d --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java @@ -0,0 +1,120 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import com.casic.common.general.EventItem; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameXF extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public void parseMessageBody() { + JSONArray eventArray = getMessageBody().getJSONArray("DATAS"); + eventItemList = new ArrayList<>(); + for (int i = 0; i < eventArray.size(); i++) { + JSONObject dataObj = eventArray.getJSONObject(i); + MethaneEventItemXF eventItem = new MethaneEventItemXF(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", "LGGasOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemXF item = (MethaneEventItemXF) eventItem; + switch (item.getEventType().toUpperCase()) { + case "GASL": + // 浓度低报 + eventArr.add(item.toJSON()); + break; + + case "GASH": + // 浓度高报 + eventArr.add(item.toJSON()); + break; + + case "LIQUID": + // 液位报警 + if (item.getValue().equals("0")) { + eventArr.add("CancelWaterImmersionAlarm"); // 解除液位报警 + } else { + eventArr.add("WaterImmersionAlarm"); + } + break; + + case "MV": + // 位移报警 + eventArr.add(item.toJSON()); + break; + + case "VIBERATE": + // 振动报警 不自动消警 + if (item.getValue().equals("1")) { + eventArr.add("VibrationAlarm"); + } + break; + + case "SENSORSTATE": + // 传感器故障报警 + eventArr.add("sensorState"); + break; + + case "BATL": + // 低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "TEMPL": + // 温度超低限报警 + eventArr.add(item.toJSON()); + break; + + case "TEMPH": + // 温度超高限报警 + eventArr.add(item.toJSON()); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java new file mode 100644 index 0000000..f2b344a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java @@ -0,0 +1,56 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemXF extends EventItem { + String eventType; + String value; + String time; + + @Override + public JSONObject toJSON() { + JSONObject event = new JSONObject(); + + switch (getEventType().toUpperCase()) { + case "MV": + event.put("alarmType", "DisplacementAlarm"); + String[] location = value.split(","); + if (location.length == 2) { + event.put("lon", location[0]); + event.put("lat", location[1]); + } else { + event.put("lon", "0.00"); + event.put("lat", "0.00"); + } + break; + case "GASL": + event.put("alarmType", "GasLeakLowAlarm"); + event.put("alarmValue", value); + break; + case "GASH": + event.put("alarmType", "GasLeakHighAlarm"); + event.put("alarmValue", value); + break; + case "TEMPL": + event.put("alarmType", "TempOverLowAlarm"); + event.put("alarmValue", value); + break; + case "TEMPH": + event.put("alarmType", "TempOverHighAlarm"); + event.put("alarmValue", value); + break; + } + + return event; + } + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java index cac14c8..53525f2 100644 --- a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -69,8 +69,8 @@ gasFrame.setDeviceType(deviceType); gasFrame.setSequence(sequence); - // 心跳类的消息不解析MessageBody - if (!gasFrame.getMessageType().equals("00")) { + // 心跳类的消息 / 配置响应类消息 不解析MessageBody + if (!gasFrame.getMessageType().equals("00") && !gasFrame.getMessageType().equals("03")) { gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); gasFrame.parseMessageBody(); } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java new file mode 100644 index 0000000..1a3ed58 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java @@ -0,0 +1,113 @@ +package com.casic.methane.frame.xfdz; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameXF extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", getDevTypeName() + "Data"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray dataArr = new JSONArray(); + for (DataItem dataItem : dataItemList) { + dataArr.add(dataItem.toJSON()); + + int cellVal = NumberUtil.toBigInteger(((MethaneDataItemXF) dataItem).getBat()).intValue(); + body.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemXF dataItem = new MethaneDataItemXF(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } + + private void setLGGasData(DataGasliquidGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java new file mode 100644 index 0000000..4d896ce --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java @@ -0,0 +1,38 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemXF extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gas); + data.put("vbat", bat); + data.put("sig", sig); + data.put("temp", temp); + data.put("ssState", ssState); + data.put("batsta", ""); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java new file mode 100644 index 0000000..9e9f37d --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java @@ -0,0 +1,120 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import com.casic.common.general.EventItem; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameXF extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public void parseMessageBody() { + JSONArray eventArray = getMessageBody().getJSONArray("DATAS"); + eventItemList = new ArrayList<>(); + for (int i = 0; i < eventArray.size(); i++) { + JSONObject dataObj = eventArray.getJSONObject(i); + MethaneEventItemXF eventItem = new MethaneEventItemXF(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", "LGGasOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemXF item = (MethaneEventItemXF) eventItem; + switch (item.getEventType().toUpperCase()) { + case "GASL": + // 浓度低报 + eventArr.add(item.toJSON()); + break; + + case "GASH": + // 浓度高报 + eventArr.add(item.toJSON()); + break; + + case "LIQUID": + // 液位报警 + if (item.getValue().equals("0")) { + eventArr.add("CancelWaterImmersionAlarm"); // 解除液位报警 + } else { + eventArr.add("WaterImmersionAlarm"); + } + break; + + case "MV": + // 位移报警 + eventArr.add(item.toJSON()); + break; + + case "VIBERATE": + // 振动报警 不自动消警 + if (item.getValue().equals("1")) { + eventArr.add("VibrationAlarm"); + } + break; + + case "SENSORSTATE": + // 传感器故障报警 + eventArr.add("sensorState"); + break; + + case "BATL": + // 低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "TEMPL": + // 温度超低限报警 + eventArr.add(item.toJSON()); + break; + + case "TEMPH": + // 温度超高限报警 + eventArr.add(item.toJSON()); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java new file mode 100644 index 0000000..f2b344a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java @@ -0,0 +1,56 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemXF extends EventItem { + String eventType; + String value; + String time; + + @Override + public JSONObject toJSON() { + JSONObject event = new JSONObject(); + + switch (getEventType().toUpperCase()) { + case "MV": + event.put("alarmType", "DisplacementAlarm"); + String[] location = value.split(","); + if (location.length == 2) { + event.put("lon", location[0]); + event.put("lat", location[1]); + } else { + event.put("lon", "0.00"); + event.put("lat", "0.00"); + } + break; + case "GASL": + event.put("alarmType", "GasLeakLowAlarm"); + event.put("alarmValue", value); + break; + case "GASH": + event.put("alarmType", "GasLeakHighAlarm"); + event.put("alarmValue", value); + break; + case "TEMPL": + event.put("alarmType", "TempOverLowAlarm"); + event.put("alarmValue", value); + break; + case "TEMPH": + event.put("alarmType", "TempOverHighAlarm"); + event.put("alarmValue", value); + break; + } + + return event; + } + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java index cac14c8..53525f2 100644 --- a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -69,8 +69,8 @@ gasFrame.setDeviceType(deviceType); gasFrame.setSequence(sequence); - // 心跳类的消息不解析MessageBody - if (!gasFrame.getMessageType().equals("00")) { + // 心跳类的消息 / 配置响应类消息 不解析MessageBody + if (!gasFrame.getMessageType().equals("00") && !gasFrame.getMessageType().equals("03")) { gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); gasFrame.parseMessageBody(); } diff --git a/src/main/java/com/casic/util/aep/AepConfig.java b/src/main/java/com/casic/util/aep/AepConfig.java index 943e2ce..0118b98 100644 --- a/src/main/java/com/casic/util/aep/AepConfig.java +++ b/src/main/java/com/casic/util/aep/AepConfig.java @@ -16,7 +16,10 @@ @Value("${casic.aep.base-url}") private String baseUrl; + // 超时时间为12小时 + @Value("${casic.aep.ttl}") private Integer ttl = 7200; + private Integer level = 1; private String operator = "birmm"; diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 9b3c884..2ce0ee3 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -11,6 +11,8 @@ import com.casic.methane.frame.brs.MethaneEventFrameBRS; import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; +import com.casic.methane.frame.xfdz.MethaneDataFrameXF; +import com.casic.methane.frame.xfdz.MethaneEventFrameXF; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; @@ -134,6 +136,9 @@ case "22": // 华视远大 return new MethaneDataFrameHSYD(); + case "23": // 先锋电子 + return new MethaneDataFrameXF(); + default: // 默认与百瑞生协议一样 return new MethaneDataFrameBRS(); @@ -173,6 +178,9 @@ case "22": // 华视远大 return new MethaneEventFrameHSYD(); + case "23": // 百瑞生 + return new MethaneEventFrameXF(); + default: // 默认与百瑞生一样 return new MethaneEventFrameBRS(); diff --git a/src/main/java/com/casic/common/general/ConfigResponseFrame.java b/src/main/java/com/casic/common/general/ConfigResponseFrame.java index 17609f8..4fdff74 100644 --- a/src/main/java/com/casic/common/general/ConfigResponseFrame.java +++ b/src/main/java/com/casic/common/general/ConfigResponseFrame.java @@ -1,13 +1,11 @@ package com.casic.common.general; -import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import lombok.Data; import java.time.LocalDateTime; import java.time.ZoneId; -import java.time.format.DateTimeFormatter; @Data public class ConfigResponseFrame extends CasicFrame { diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java new file mode 100644 index 0000000..1a3ed58 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataFrameXF.java @@ -0,0 +1,113 @@ +package com.casic.methane.frame.xfdz; + +import cn.hutool.core.util.NumberUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameXF extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", getDevTypeName() + "Data"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray dataArr = new JSONArray(); + for (DataItem dataItem : dataItemList) { + dataArr.add(dataItem.toJSON()); + + int cellVal = NumberUtil.toBigInteger(((MethaneDataItemXF) dataItem).getBat()).intValue(); + body.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemXF dataItem = new MethaneDataItemXF(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } + + private void setLGGasData(DataGasliquidGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemXF)dataItem).getGas()); + data.setCell(((MethaneDataItemXF)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemXF)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java new file mode 100644 index 0000000..4d896ce --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneDataItemXF.java @@ -0,0 +1,38 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemXF extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gas); + data.put("vbat", bat); + data.put("sig", sig); + data.put("temp", temp); + data.put("ssState", ssState); + data.put("batsta", ""); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java new file mode 100644 index 0000000..9e9f37d --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventFrameXF.java @@ -0,0 +1,120 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import com.casic.common.general.EventItem; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameXF extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LGGasOther"; + } + + @Override + public String toString() { + String prefix = MESSAGE_TYPE_DESCRIPTION + "/" + "燃气" + "(" + MESSAGE_TYPE_STRING + "/" + getDevTypeName() + ")"; + return prefix + super.toString(); + } + + @Override + public void parseMessageBody() { + JSONArray eventArray = getMessageBody().getJSONArray("DATAS"); + eventItemList = new ArrayList<>(); + for (int i = 0; i < eventArray.size(); i++) { + JSONObject dataObj = eventArray.getJSONObject(i); + MethaneEventItemXF eventItem = new MethaneEventItemXF(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } + + @Override + public JSONObject toJSON() { + JSONObject obj = super.toJSON(); + + obj.put("devType", getDevTypeName()); + obj.put("devCode", getDeviceCode()); + + JSONObject body = new JSONObject(); + body.put("bType", "LGGasOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemXF item = (MethaneEventItemXF) eventItem; + switch (item.getEventType().toUpperCase()) { + case "GASL": + // 浓度低报 + eventArr.add(item.toJSON()); + break; + + case "GASH": + // 浓度高报 + eventArr.add(item.toJSON()); + break; + + case "LIQUID": + // 液位报警 + if (item.getValue().equals("0")) { + eventArr.add("CancelWaterImmersionAlarm"); // 解除液位报警 + } else { + eventArr.add("WaterImmersionAlarm"); + } + break; + + case "MV": + // 位移报警 + eventArr.add(item.toJSON()); + break; + + case "VIBERATE": + // 振动报警 不自动消警 + if (item.getValue().equals("1")) { + eventArr.add("VibrationAlarm"); + } + break; + + case "SENSORSTATE": + // 传感器故障报警 + eventArr.add("sensorState"); + break; + + case "BATL": + // 低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "TEMPL": + // 温度超低限报警 + eventArr.add(item.toJSON()); + break; + + case "TEMPH": + // 温度超高限报警 + eventArr.add(item.toJSON()); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java new file mode 100644 index 0000000..f2b344a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/xfdz/MethaneEventItemXF.java @@ -0,0 +1,56 @@ +package com.casic.methane.frame.xfdz; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemXF extends EventItem { + String eventType; + String value; + String time; + + @Override + public JSONObject toJSON() { + JSONObject event = new JSONObject(); + + switch (getEventType().toUpperCase()) { + case "MV": + event.put("alarmType", "DisplacementAlarm"); + String[] location = value.split(","); + if (location.length == 2) { + event.put("lon", location[0]); + event.put("lat", location[1]); + } else { + event.put("lon", "0.00"); + event.put("lat", "0.00"); + } + break; + case "GASL": + event.put("alarmType", "GasLeakLowAlarm"); + event.put("alarmValue", value); + break; + case "GASH": + event.put("alarmType", "GasLeakHighAlarm"); + event.put("alarmValue", value); + break; + case "TEMPL": + event.put("alarmType", "TempOverLowAlarm"); + event.put("alarmValue", value); + break; + case "TEMPH": + event.put("alarmType", "TempOverHighAlarm"); + event.put("alarmValue", value); + break; + } + + return event; + } + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java index cac14c8..53525f2 100644 --- a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -69,8 +69,8 @@ gasFrame.setDeviceType(deviceType); gasFrame.setSequence(sequence); - // 心跳类的消息不解析MessageBody - if (!gasFrame.getMessageType().equals("00")) { + // 心跳类的消息 / 配置响应类消息 不解析MessageBody + if (!gasFrame.getMessageType().equals("00") && !gasFrame.getMessageType().equals("03")) { gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); gasFrame.parseMessageBody(); } diff --git a/src/main/java/com/casic/util/aep/AepConfig.java b/src/main/java/com/casic/util/aep/AepConfig.java index 943e2ce..0118b98 100644 --- a/src/main/java/com/casic/util/aep/AepConfig.java +++ b/src/main/java/com/casic/util/aep/AepConfig.java @@ -16,7 +16,10 @@ @Value("${casic.aep.base-url}") private String baseUrl; + // 超时时间为12小时 + @Value("${casic.aep.ttl}") private Integer ttl = 7200; + private Integer level = 1; private String operator = "birmm"; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3a0eeb1..cc4cab0 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -31,6 +31,7 @@ aep: time-url: https://ag-api.ctwing.cn/echo base-url: https://ag-api.ctwing.cn + ttl: 86400 push: # url: http://10.30.7.26:20705/device/receiveData