diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java deleted file mode 100644 index 4789467..0000000 --- a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.casic.methane.frame.brs; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class MethaneInfoFrameBRS extends CasicFrame { - - String workmode; // 工作模式 - String model; // 型号 - String softVersion; // 软件版本 - String hwVersion; // 硬件版本 - String sensorType; // 传感器类型 - String simcard; // SIM卡号 - String imei; // IMEI号 - - String rsrp; // 信号接收功率 - String rsrq; // 信号接收质量 - String cellId; // 服务小区ID - String rssi; // 信号强度指示 - String signalECL; // 信号增强覆盖等级 - String sinr; // 信噪比 - String pci; // 服务小区物理小区识别码 - - String gasL; // 浓度低报阈值,单位为%LEL - String gasH; // 浓度高报阈值,单位为%LEL - String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 - String tempL; // 温度低限阈值,扩大100倍 - String tempH; // 温度高限阈值,扩大100倍 - String bat; // 电池电压,单位mV - String sampleIntvl; // 采样间隔,单位秒 - String sampleCnt; // 采样点数,达到采样点数上传数据 - String preheatTim; // 传感器预热时间,仅针对催化传感器有效 - - String shakeEn; // 振动功能使能 - String shakeSampleEn; // 振动采样功能使能 - String shake1; // 振动阈值1 - String shake2; // 振动阈值2 - String antitheftEn; // 位移功能使能 - String liquidLevelEn; // 液位功能使能 - - String pressEn; // 压力采集使能 - String accThrld; // 加速度阈值1 - String accCnt; // 加速度阈值2 - String preRange; // 压力表量程,单位kPa,扩大100倍传输 - String preAlarmEn; // 压力报警使能 - String preK; // 压力修正系数k - String preB; // 压力修正系数b - String preH; // 压力高报阈值,单位kPa,扩大100倍传输 - String preL; // 压力低报阈值,单位kPa,扩大100倍传输 - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + - (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + - (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + - (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + - (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + - (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + - (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + - (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - if (getMessageBody().containsKey("WORKMODE")) { - workmode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - simcard = getMessageBody().getString("SIMCARD"); - imei = getMessageBody().getString("IMEI"); - } - - if (getMessageBody().containsKey("RSRP")) { - rsrp = getMessageBody().getString("RSRP"); - rsrq = getMessageBody().getString("RSRP"); - cellId = getMessageBody().getString("CELLID"); - rssi = getMessageBody().getString("RSSI"); - signalECL = getMessageBody().getString("SIGNALECL"); - sinr = getMessageBody().getString("SINR"); - pci = getMessageBody().getString("PCI"); - } - - if (getMessageBody().containsKey("GASL")) { - gasL = getMessageBody().getString("GASL"); - gasH = getMessageBody().getString("GASH"); - slope = getMessageBody().getString("SLOPE"); - tempL = getMessageBody().getString("TEMPL"); - tempH = getMessageBody().getString("TEMPH"); - bat = getMessageBody().getString("BAT"); - sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); - sampleCnt = getMessageBody().getString("SAMPLECNT"); - preheatTim = getMessageBody().getString("PREHEATTIM"); - } - - if (getMessageBody().containsKey("SHAKEEN")) { - shakeEn = getMessageBody().getString("SHAKEEN"); - shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); - shake1 = getMessageBody().getString("SHAKE1"); - shake2 = getMessageBody().getString("SHAKE2"); - antitheftEn = getMessageBody().getString("ANTITHEFTEN"); - liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); - } - - if (getMessageBody().containsKey("PRESSEN")) { - pressEn = getMessageBody().getString("PRESSEN"); - accThrld = getMessageBody().getString("ACCTHRLD"); - accCnt = getMessageBody().getString("ACCCNT"); - preRange = getMessageBody().getString("PRERANGE"); - preAlarmEn = getMessageBody().getString("PREALARMEN"); - preK = getMessageBody().getString("PREK"); - preB = getMessageBody().getString("PREB"); - preH = getMessageBody().getString("PREH"); - preL = getMessageBody().getString("PREL"); - } - } -} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java deleted file mode 100644 index 4789467..0000000 --- a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.casic.methane.frame.brs; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class MethaneInfoFrameBRS extends CasicFrame { - - String workmode; // 工作模式 - String model; // 型号 - String softVersion; // 软件版本 - String hwVersion; // 硬件版本 - String sensorType; // 传感器类型 - String simcard; // SIM卡号 - String imei; // IMEI号 - - String rsrp; // 信号接收功率 - String rsrq; // 信号接收质量 - String cellId; // 服务小区ID - String rssi; // 信号强度指示 - String signalECL; // 信号增强覆盖等级 - String sinr; // 信噪比 - String pci; // 服务小区物理小区识别码 - - String gasL; // 浓度低报阈值,单位为%LEL - String gasH; // 浓度高报阈值,单位为%LEL - String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 - String tempL; // 温度低限阈值,扩大100倍 - String tempH; // 温度高限阈值,扩大100倍 - String bat; // 电池电压,单位mV - String sampleIntvl; // 采样间隔,单位秒 - String sampleCnt; // 采样点数,达到采样点数上传数据 - String preheatTim; // 传感器预热时间,仅针对催化传感器有效 - - String shakeEn; // 振动功能使能 - String shakeSampleEn; // 振动采样功能使能 - String shake1; // 振动阈值1 - String shake2; // 振动阈值2 - String antitheftEn; // 位移功能使能 - String liquidLevelEn; // 液位功能使能 - - String pressEn; // 压力采集使能 - String accThrld; // 加速度阈值1 - String accCnt; // 加速度阈值2 - String preRange; // 压力表量程,单位kPa,扩大100倍传输 - String preAlarmEn; // 压力报警使能 - String preK; // 压力修正系数k - String preB; // 压力修正系数b - String preH; // 压力高报阈值,单位kPa,扩大100倍传输 - String preL; // 压力低报阈值,单位kPa,扩大100倍传输 - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + - (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + - (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + - (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + - (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + - (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + - (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + - (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - if (getMessageBody().containsKey("WORKMODE")) { - workmode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - simcard = getMessageBody().getString("SIMCARD"); - imei = getMessageBody().getString("IMEI"); - } - - if (getMessageBody().containsKey("RSRP")) { - rsrp = getMessageBody().getString("RSRP"); - rsrq = getMessageBody().getString("RSRP"); - cellId = getMessageBody().getString("CELLID"); - rssi = getMessageBody().getString("RSSI"); - signalECL = getMessageBody().getString("SIGNALECL"); - sinr = getMessageBody().getString("SINR"); - pci = getMessageBody().getString("PCI"); - } - - if (getMessageBody().containsKey("GASL")) { - gasL = getMessageBody().getString("GASL"); - gasH = getMessageBody().getString("GASH"); - slope = getMessageBody().getString("SLOPE"); - tempL = getMessageBody().getString("TEMPL"); - tempH = getMessageBody().getString("TEMPH"); - bat = getMessageBody().getString("BAT"); - sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); - sampleCnt = getMessageBody().getString("SAMPLECNT"); - preheatTim = getMessageBody().getString("PREHEATTIM"); - } - - if (getMessageBody().containsKey("SHAKEEN")) { - shakeEn = getMessageBody().getString("SHAKEEN"); - shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); - shake1 = getMessageBody().getString("SHAKE1"); - shake2 = getMessageBody().getString("SHAKE2"); - antitheftEn = getMessageBody().getString("ANTITHEFTEN"); - liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); - } - - if (getMessageBody().containsKey("PRESSEN")) { - pressEn = getMessageBody().getString("PRESSEN"); - accThrld = getMessageBody().getString("ACCTHRLD"); - accCnt = getMessageBody().getString("ACCCNT"); - preRange = getMessageBody().getString("PRERANGE"); - preAlarmEn = getMessageBody().getString("PREALARMEN"); - preK = getMessageBody().getString("PREK"); - preB = getMessageBody().getString("PREB"); - preH = getMessageBody().getString("PREH"); - preL = getMessageBody().getString("PREL"); - } - } -} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java new file mode 100644 index 0000000..9ae4fbc --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.hsyd; + +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 com.casic.tube.frame.mhk.DataItemMHK; +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 MethaneDataFrameHSYD 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()); + obj.put("cell", ""); + + 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(((MethaneDataItemHSYD) dataItem).getVbat()).intValue(); + body.put("cell", cellVal / 3600); // 占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); + MethaneDataItemHSYD dataItem = new MethaneDataItemHSYD(); + + dataItem.setGasval(Double.parseDouble(dataObj.getString("GAS"))); + dataItem.setVbat(Integer.parseInt(dataObj.getString("BAT"))); + dataItem.setBatsta(dataObj.getString("BATSTA")); + dataItem.setTime(dataObj.getString("UPTIME")); + dataItem.setSin(Integer.parseInt(dataObj.getString("SIN"))); + dataItem.setRsrp(Integer.parseInt(dataObj.getString("RSRP"))); + dataItem.setSinr(Integer.parseInt(dataObj.getString("SINR"))); + + 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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)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 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java deleted file mode 100644 index 4789467..0000000 --- a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.casic.methane.frame.brs; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class MethaneInfoFrameBRS extends CasicFrame { - - String workmode; // 工作模式 - String model; // 型号 - String softVersion; // 软件版本 - String hwVersion; // 硬件版本 - String sensorType; // 传感器类型 - String simcard; // SIM卡号 - String imei; // IMEI号 - - String rsrp; // 信号接收功率 - String rsrq; // 信号接收质量 - String cellId; // 服务小区ID - String rssi; // 信号强度指示 - String signalECL; // 信号增强覆盖等级 - String sinr; // 信噪比 - String pci; // 服务小区物理小区识别码 - - String gasL; // 浓度低报阈值,单位为%LEL - String gasH; // 浓度高报阈值,单位为%LEL - String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 - String tempL; // 温度低限阈值,扩大100倍 - String tempH; // 温度高限阈值,扩大100倍 - String bat; // 电池电压,单位mV - String sampleIntvl; // 采样间隔,单位秒 - String sampleCnt; // 采样点数,达到采样点数上传数据 - String preheatTim; // 传感器预热时间,仅针对催化传感器有效 - - String shakeEn; // 振动功能使能 - String shakeSampleEn; // 振动采样功能使能 - String shake1; // 振动阈值1 - String shake2; // 振动阈值2 - String antitheftEn; // 位移功能使能 - String liquidLevelEn; // 液位功能使能 - - String pressEn; // 压力采集使能 - String accThrld; // 加速度阈值1 - String accCnt; // 加速度阈值2 - String preRange; // 压力表量程,单位kPa,扩大100倍传输 - String preAlarmEn; // 压力报警使能 - String preK; // 压力修正系数k - String preB; // 压力修正系数b - String preH; // 压力高报阈值,单位kPa,扩大100倍传输 - String preL; // 压力低报阈值,单位kPa,扩大100倍传输 - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + - (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + - (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + - (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + - (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + - (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + - (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + - (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - if (getMessageBody().containsKey("WORKMODE")) { - workmode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - simcard = getMessageBody().getString("SIMCARD"); - imei = getMessageBody().getString("IMEI"); - } - - if (getMessageBody().containsKey("RSRP")) { - rsrp = getMessageBody().getString("RSRP"); - rsrq = getMessageBody().getString("RSRP"); - cellId = getMessageBody().getString("CELLID"); - rssi = getMessageBody().getString("RSSI"); - signalECL = getMessageBody().getString("SIGNALECL"); - sinr = getMessageBody().getString("SINR"); - pci = getMessageBody().getString("PCI"); - } - - if (getMessageBody().containsKey("GASL")) { - gasL = getMessageBody().getString("GASL"); - gasH = getMessageBody().getString("GASH"); - slope = getMessageBody().getString("SLOPE"); - tempL = getMessageBody().getString("TEMPL"); - tempH = getMessageBody().getString("TEMPH"); - bat = getMessageBody().getString("BAT"); - sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); - sampleCnt = getMessageBody().getString("SAMPLECNT"); - preheatTim = getMessageBody().getString("PREHEATTIM"); - } - - if (getMessageBody().containsKey("SHAKEEN")) { - shakeEn = getMessageBody().getString("SHAKEEN"); - shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); - shake1 = getMessageBody().getString("SHAKE1"); - shake2 = getMessageBody().getString("SHAKE2"); - antitheftEn = getMessageBody().getString("ANTITHEFTEN"); - liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); - } - - if (getMessageBody().containsKey("PRESSEN")) { - pressEn = getMessageBody().getString("PRESSEN"); - accThrld = getMessageBody().getString("ACCTHRLD"); - accCnt = getMessageBody().getString("ACCCNT"); - preRange = getMessageBody().getString("PRERANGE"); - preAlarmEn = getMessageBody().getString("PREALARMEN"); - preK = getMessageBody().getString("PREK"); - preB = getMessageBody().getString("PREB"); - preH = getMessageBody().getString("PREH"); - preL = getMessageBody().getString("PREL"); - } - } -} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java new file mode 100644 index 0000000..9ae4fbc --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.hsyd; + +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 com.casic.tube.frame.mhk.DataItemMHK; +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 MethaneDataFrameHSYD 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()); + obj.put("cell", ""); + + 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(((MethaneDataItemHSYD) dataItem).getVbat()).intValue(); + body.put("cell", cellVal / 3600); // 占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); + MethaneDataItemHSYD dataItem = new MethaneDataItemHSYD(); + + dataItem.setGasval(Double.parseDouble(dataObj.getString("GAS"))); + dataItem.setVbat(Integer.parseInt(dataObj.getString("BAT"))); + dataItem.setBatsta(dataObj.getString("BATSTA")); + dataItem.setTime(dataObj.getString("UPTIME")); + dataItem.setSin(Integer.parseInt(dataObj.getString("SIN"))); + dataItem.setRsrp(Integer.parseInt(dataObj.getString("RSRP"))); + dataItem.setSinr(Integer.parseInt(dataObj.getString("SINR"))); + + 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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java new file mode 100644 index 0000000..20bb899 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java @@ -0,0 +1,44 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemHSYD extends DataItem { + double gasval; + int vbat; + String batsta; + String time; + int sin; + int rsrp; + int sinr; + + @Override + public String toString() { + return "气体浓度值:" + gasval + "%LEL;" + + "电池电压值:" + vbat + "mv;" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gasval); + data.put("vbat", vbat); + data.put("ssState", batsta); // 电池状态 + // 信号质量 + String sig = "0"; + if (rsrp <= -90) { + sig = "1"; + } else if (rsrp <= -70) { + sig = "2"; + } else { + sig ="3"; + } + data.put("sig", sig); + 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 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java deleted file mode 100644 index 4789467..0000000 --- a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.casic.methane.frame.brs; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class MethaneInfoFrameBRS extends CasicFrame { - - String workmode; // 工作模式 - String model; // 型号 - String softVersion; // 软件版本 - String hwVersion; // 硬件版本 - String sensorType; // 传感器类型 - String simcard; // SIM卡号 - String imei; // IMEI号 - - String rsrp; // 信号接收功率 - String rsrq; // 信号接收质量 - String cellId; // 服务小区ID - String rssi; // 信号强度指示 - String signalECL; // 信号增强覆盖等级 - String sinr; // 信噪比 - String pci; // 服务小区物理小区识别码 - - String gasL; // 浓度低报阈值,单位为%LEL - String gasH; // 浓度高报阈值,单位为%LEL - String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 - String tempL; // 温度低限阈值,扩大100倍 - String tempH; // 温度高限阈值,扩大100倍 - String bat; // 电池电压,单位mV - String sampleIntvl; // 采样间隔,单位秒 - String sampleCnt; // 采样点数,达到采样点数上传数据 - String preheatTim; // 传感器预热时间,仅针对催化传感器有效 - - String shakeEn; // 振动功能使能 - String shakeSampleEn; // 振动采样功能使能 - String shake1; // 振动阈值1 - String shake2; // 振动阈值2 - String antitheftEn; // 位移功能使能 - String liquidLevelEn; // 液位功能使能 - - String pressEn; // 压力采集使能 - String accThrld; // 加速度阈值1 - String accCnt; // 加速度阈值2 - String preRange; // 压力表量程,单位kPa,扩大100倍传输 - String preAlarmEn; // 压力报警使能 - String preK; // 压力修正系数k - String preB; // 压力修正系数b - String preH; // 压力高报阈值,单位kPa,扩大100倍传输 - String preL; // 压力低报阈值,单位kPa,扩大100倍传输 - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + - (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + - (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + - (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + - (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + - (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + - (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + - (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - if (getMessageBody().containsKey("WORKMODE")) { - workmode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - simcard = getMessageBody().getString("SIMCARD"); - imei = getMessageBody().getString("IMEI"); - } - - if (getMessageBody().containsKey("RSRP")) { - rsrp = getMessageBody().getString("RSRP"); - rsrq = getMessageBody().getString("RSRP"); - cellId = getMessageBody().getString("CELLID"); - rssi = getMessageBody().getString("RSSI"); - signalECL = getMessageBody().getString("SIGNALECL"); - sinr = getMessageBody().getString("SINR"); - pci = getMessageBody().getString("PCI"); - } - - if (getMessageBody().containsKey("GASL")) { - gasL = getMessageBody().getString("GASL"); - gasH = getMessageBody().getString("GASH"); - slope = getMessageBody().getString("SLOPE"); - tempL = getMessageBody().getString("TEMPL"); - tempH = getMessageBody().getString("TEMPH"); - bat = getMessageBody().getString("BAT"); - sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); - sampleCnt = getMessageBody().getString("SAMPLECNT"); - preheatTim = getMessageBody().getString("PREHEATTIM"); - } - - if (getMessageBody().containsKey("SHAKEEN")) { - shakeEn = getMessageBody().getString("SHAKEEN"); - shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); - shake1 = getMessageBody().getString("SHAKE1"); - shake2 = getMessageBody().getString("SHAKE2"); - antitheftEn = getMessageBody().getString("ANTITHEFTEN"); - liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); - } - - if (getMessageBody().containsKey("PRESSEN")) { - pressEn = getMessageBody().getString("PRESSEN"); - accThrld = getMessageBody().getString("ACCTHRLD"); - accCnt = getMessageBody().getString("ACCCNT"); - preRange = getMessageBody().getString("PRERANGE"); - preAlarmEn = getMessageBody().getString("PREALARMEN"); - preK = getMessageBody().getString("PREK"); - preB = getMessageBody().getString("PREB"); - preH = getMessageBody().getString("PREH"); - preL = getMessageBody().getString("PREL"); - } - } -} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java new file mode 100644 index 0000000..9ae4fbc --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.hsyd; + +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 com.casic.tube.frame.mhk.DataItemMHK; +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 MethaneDataFrameHSYD 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()); + obj.put("cell", ""); + + 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(((MethaneDataItemHSYD) dataItem).getVbat()).intValue(); + body.put("cell", cellVal / 3600); // 占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); + MethaneDataItemHSYD dataItem = new MethaneDataItemHSYD(); + + dataItem.setGasval(Double.parseDouble(dataObj.getString("GAS"))); + dataItem.setVbat(Integer.parseInt(dataObj.getString("BAT"))); + dataItem.setBatsta(dataObj.getString("BATSTA")); + dataItem.setTime(dataObj.getString("UPTIME")); + dataItem.setSin(Integer.parseInt(dataObj.getString("SIN"))); + dataItem.setRsrp(Integer.parseInt(dataObj.getString("RSRP"))); + dataItem.setSinr(Integer.parseInt(dataObj.getString("SINR"))); + + 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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java new file mode 100644 index 0000000..20bb899 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java @@ -0,0 +1,44 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemHSYD extends DataItem { + double gasval; + int vbat; + String batsta; + String time; + int sin; + int rsrp; + int sinr; + + @Override + public String toString() { + return "气体浓度值:" + gasval + "%LEL;" + + "电池电压值:" + vbat + "mv;" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gasval); + data.put("vbat", vbat); + data.put("ssState", batsta); // 电池状态 + // 信号质量 + String sig = "0"; + if (rsrp <= -90) { + sig = "1"; + } else if (rsrp <= -70) { + sig = "2"; + } else { + sig ="3"; + } + data.put("sig", sig); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java new file mode 100644 index 0000000..406f524 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java @@ -0,0 +1,128 @@ +package com.casic.methane.frame.hsyd; + +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 MethaneEventFrameHSYD 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); + MethaneEventItemHSYD eventItem = new MethaneEventItemHSYD(); + + 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", "TubeOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemHSYD itemHSYD = (MethaneEventItemHSYD) eventItem; + switch (itemHSYD.getEventType()) { + case "01": + // 所有状态恢复正常 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelAllStateError"); + } + break; + + case "02": + // 设备故障 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelDeviceError"); + } else { + eventArr.add("DeviceError"); + } + break; + + case "03": + // 低电量关机 + eventArr.add("PowerOffAlarm"); + break; + + case "04": + // 水浸报警 判断报警和取消报警 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelWaterImmersionAlarm"); // 00 表示报警取消 + } else { + eventArr.add("WaterImmersionAlarm"); // 非00 表示报警 + } + break; + + case "05": + // 振动报警 无需判断取消报警 + eventArr.add("VibrationAlarm"); + break; + + case "06": + // 位移报警 需要同时推送位置 + eventArr.add(itemHSYD.toJSON()); + break; + + case "07": + // 泄漏报警低报 + eventArr.add(itemHSYD.toJSON()); + break; + case "08": + // 泄漏报警高报 + eventArr.add(itemHSYD.toJSON()); + break; + + case "09": + // 电池低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "12": + // 传感器故障 + eventArr.add("sensorState"); + 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 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java deleted file mode 100644 index 4789467..0000000 --- a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.casic.methane.frame.brs; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class MethaneInfoFrameBRS extends CasicFrame { - - String workmode; // 工作模式 - String model; // 型号 - String softVersion; // 软件版本 - String hwVersion; // 硬件版本 - String sensorType; // 传感器类型 - String simcard; // SIM卡号 - String imei; // IMEI号 - - String rsrp; // 信号接收功率 - String rsrq; // 信号接收质量 - String cellId; // 服务小区ID - String rssi; // 信号强度指示 - String signalECL; // 信号增强覆盖等级 - String sinr; // 信噪比 - String pci; // 服务小区物理小区识别码 - - String gasL; // 浓度低报阈值,单位为%LEL - String gasH; // 浓度高报阈值,单位为%LEL - String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 - String tempL; // 温度低限阈值,扩大100倍 - String tempH; // 温度高限阈值,扩大100倍 - String bat; // 电池电压,单位mV - String sampleIntvl; // 采样间隔,单位秒 - String sampleCnt; // 采样点数,达到采样点数上传数据 - String preheatTim; // 传感器预热时间,仅针对催化传感器有效 - - String shakeEn; // 振动功能使能 - String shakeSampleEn; // 振动采样功能使能 - String shake1; // 振动阈值1 - String shake2; // 振动阈值2 - String antitheftEn; // 位移功能使能 - String liquidLevelEn; // 液位功能使能 - - String pressEn; // 压力采集使能 - String accThrld; // 加速度阈值1 - String accCnt; // 加速度阈值2 - String preRange; // 压力表量程,单位kPa,扩大100倍传输 - String preAlarmEn; // 压力报警使能 - String preK; // 压力修正系数k - String preB; // 压力修正系数b - String preH; // 压力高报阈值,单位kPa,扩大100倍传输 - String preL; // 压力低报阈值,单位kPa,扩大100倍传输 - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + - (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + - (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + - (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + - (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + - (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + - (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + - (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - if (getMessageBody().containsKey("WORKMODE")) { - workmode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - simcard = getMessageBody().getString("SIMCARD"); - imei = getMessageBody().getString("IMEI"); - } - - if (getMessageBody().containsKey("RSRP")) { - rsrp = getMessageBody().getString("RSRP"); - rsrq = getMessageBody().getString("RSRP"); - cellId = getMessageBody().getString("CELLID"); - rssi = getMessageBody().getString("RSSI"); - signalECL = getMessageBody().getString("SIGNALECL"); - sinr = getMessageBody().getString("SINR"); - pci = getMessageBody().getString("PCI"); - } - - if (getMessageBody().containsKey("GASL")) { - gasL = getMessageBody().getString("GASL"); - gasH = getMessageBody().getString("GASH"); - slope = getMessageBody().getString("SLOPE"); - tempL = getMessageBody().getString("TEMPL"); - tempH = getMessageBody().getString("TEMPH"); - bat = getMessageBody().getString("BAT"); - sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); - sampleCnt = getMessageBody().getString("SAMPLECNT"); - preheatTim = getMessageBody().getString("PREHEATTIM"); - } - - if (getMessageBody().containsKey("SHAKEEN")) { - shakeEn = getMessageBody().getString("SHAKEEN"); - shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); - shake1 = getMessageBody().getString("SHAKE1"); - shake2 = getMessageBody().getString("SHAKE2"); - antitheftEn = getMessageBody().getString("ANTITHEFTEN"); - liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); - } - - if (getMessageBody().containsKey("PRESSEN")) { - pressEn = getMessageBody().getString("PRESSEN"); - accThrld = getMessageBody().getString("ACCTHRLD"); - accCnt = getMessageBody().getString("ACCCNT"); - preRange = getMessageBody().getString("PRERANGE"); - preAlarmEn = getMessageBody().getString("PREALARMEN"); - preK = getMessageBody().getString("PREK"); - preB = getMessageBody().getString("PREB"); - preH = getMessageBody().getString("PREH"); - preL = getMessageBody().getString("PREL"); - } - } -} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java new file mode 100644 index 0000000..9ae4fbc --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.hsyd; + +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 com.casic.tube.frame.mhk.DataItemMHK; +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 MethaneDataFrameHSYD 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()); + obj.put("cell", ""); + + 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(((MethaneDataItemHSYD) dataItem).getVbat()).intValue(); + body.put("cell", cellVal / 3600); // 占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); + MethaneDataItemHSYD dataItem = new MethaneDataItemHSYD(); + + dataItem.setGasval(Double.parseDouble(dataObj.getString("GAS"))); + dataItem.setVbat(Integer.parseInt(dataObj.getString("BAT"))); + dataItem.setBatsta(dataObj.getString("BATSTA")); + dataItem.setTime(dataObj.getString("UPTIME")); + dataItem.setSin(Integer.parseInt(dataObj.getString("SIN"))); + dataItem.setRsrp(Integer.parseInt(dataObj.getString("RSRP"))); + dataItem.setSinr(Integer.parseInt(dataObj.getString("SINR"))); + + 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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java new file mode 100644 index 0000000..20bb899 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java @@ -0,0 +1,44 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemHSYD extends DataItem { + double gasval; + int vbat; + String batsta; + String time; + int sin; + int rsrp; + int sinr; + + @Override + public String toString() { + return "气体浓度值:" + gasval + "%LEL;" + + "电池电压值:" + vbat + "mv;" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gasval); + data.put("vbat", vbat); + data.put("ssState", batsta); // 电池状态 + // 信号质量 + String sig = "0"; + if (rsrp <= -90) { + sig = "1"; + } else if (rsrp <= -70) { + sig = "2"; + } else { + sig ="3"; + } + data.put("sig", sig); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java new file mode 100644 index 0000000..406f524 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java @@ -0,0 +1,128 @@ +package com.casic.methane.frame.hsyd; + +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 MethaneEventFrameHSYD 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); + MethaneEventItemHSYD eventItem = new MethaneEventItemHSYD(); + + 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", "TubeOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemHSYD itemHSYD = (MethaneEventItemHSYD) eventItem; + switch (itemHSYD.getEventType()) { + case "01": + // 所有状态恢复正常 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelAllStateError"); + } + break; + + case "02": + // 设备故障 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelDeviceError"); + } else { + eventArr.add("DeviceError"); + } + break; + + case "03": + // 低电量关机 + eventArr.add("PowerOffAlarm"); + break; + + case "04": + // 水浸报警 判断报警和取消报警 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelWaterImmersionAlarm"); // 00 表示报警取消 + } else { + eventArr.add("WaterImmersionAlarm"); // 非00 表示报警 + } + break; + + case "05": + // 振动报警 无需判断取消报警 + eventArr.add("VibrationAlarm"); + break; + + case "06": + // 位移报警 需要同时推送位置 + eventArr.add(itemHSYD.toJSON()); + break; + + case "07": + // 泄漏报警低报 + eventArr.add(itemHSYD.toJSON()); + break; + case "08": + // 泄漏报警高报 + eventArr.add(itemHSYD.toJSON()); + break; + + case "09": + // 电池低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "12": + // 传感器故障 + eventArr.add("sensorState"); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java new file mode 100644 index 0000000..3ddeb6e --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java @@ -0,0 +1,40 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemHSYD extends EventItem { + String eventType; + String value; + String time; + + @Override + public JSONObject toJSON() { + JSONObject event = new JSONObject(); + + switch (getEventType()) { + case "06": + event.put("alarmType", "DisplacementAlarm"); + break; + case "07": + event.put("alarmType", "GasLeakLowAlarm"); + event.put("alarmValue", value); + break; + case "08": + event.put("alarmType", "GasLeakHighAlarm"); + 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 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java deleted file mode 100644 index 4789467..0000000 --- a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.casic.methane.frame.brs; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class MethaneInfoFrameBRS extends CasicFrame { - - String workmode; // 工作模式 - String model; // 型号 - String softVersion; // 软件版本 - String hwVersion; // 硬件版本 - String sensorType; // 传感器类型 - String simcard; // SIM卡号 - String imei; // IMEI号 - - String rsrp; // 信号接收功率 - String rsrq; // 信号接收质量 - String cellId; // 服务小区ID - String rssi; // 信号强度指示 - String signalECL; // 信号增强覆盖等级 - String sinr; // 信噪比 - String pci; // 服务小区物理小区识别码 - - String gasL; // 浓度低报阈值,单位为%LEL - String gasH; // 浓度高报阈值,单位为%LEL - String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 - String tempL; // 温度低限阈值,扩大100倍 - String tempH; // 温度高限阈值,扩大100倍 - String bat; // 电池电压,单位mV - String sampleIntvl; // 采样间隔,单位秒 - String sampleCnt; // 采样点数,达到采样点数上传数据 - String preheatTim; // 传感器预热时间,仅针对催化传感器有效 - - String shakeEn; // 振动功能使能 - String shakeSampleEn; // 振动采样功能使能 - String shake1; // 振动阈值1 - String shake2; // 振动阈值2 - String antitheftEn; // 位移功能使能 - String liquidLevelEn; // 液位功能使能 - - String pressEn; // 压力采集使能 - String accThrld; // 加速度阈值1 - String accCnt; // 加速度阈值2 - String preRange; // 压力表量程,单位kPa,扩大100倍传输 - String preAlarmEn; // 压力报警使能 - String preK; // 压力修正系数k - String preB; // 压力修正系数b - String preH; // 压力高报阈值,单位kPa,扩大100倍传输 - String preL; // 压力低报阈值,单位kPa,扩大100倍传输 - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + - (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + - (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + - (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + - (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + - (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + - (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + - (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - if (getMessageBody().containsKey("WORKMODE")) { - workmode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - simcard = getMessageBody().getString("SIMCARD"); - imei = getMessageBody().getString("IMEI"); - } - - if (getMessageBody().containsKey("RSRP")) { - rsrp = getMessageBody().getString("RSRP"); - rsrq = getMessageBody().getString("RSRP"); - cellId = getMessageBody().getString("CELLID"); - rssi = getMessageBody().getString("RSSI"); - signalECL = getMessageBody().getString("SIGNALECL"); - sinr = getMessageBody().getString("SINR"); - pci = getMessageBody().getString("PCI"); - } - - if (getMessageBody().containsKey("GASL")) { - gasL = getMessageBody().getString("GASL"); - gasH = getMessageBody().getString("GASH"); - slope = getMessageBody().getString("SLOPE"); - tempL = getMessageBody().getString("TEMPL"); - tempH = getMessageBody().getString("TEMPH"); - bat = getMessageBody().getString("BAT"); - sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); - sampleCnt = getMessageBody().getString("SAMPLECNT"); - preheatTim = getMessageBody().getString("PREHEATTIM"); - } - - if (getMessageBody().containsKey("SHAKEEN")) { - shakeEn = getMessageBody().getString("SHAKEEN"); - shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); - shake1 = getMessageBody().getString("SHAKE1"); - shake2 = getMessageBody().getString("SHAKE2"); - antitheftEn = getMessageBody().getString("ANTITHEFTEN"); - liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); - } - - if (getMessageBody().containsKey("PRESSEN")) { - pressEn = getMessageBody().getString("PRESSEN"); - accThrld = getMessageBody().getString("ACCTHRLD"); - accCnt = getMessageBody().getString("ACCCNT"); - preRange = getMessageBody().getString("PRERANGE"); - preAlarmEn = getMessageBody().getString("PREALARMEN"); - preK = getMessageBody().getString("PREK"); - preB = getMessageBody().getString("PREB"); - preH = getMessageBody().getString("PREH"); - preL = getMessageBody().getString("PREL"); - } - } -} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java new file mode 100644 index 0000000..9ae4fbc --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.hsyd; + +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 com.casic.tube.frame.mhk.DataItemMHK; +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 MethaneDataFrameHSYD 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()); + obj.put("cell", ""); + + 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(((MethaneDataItemHSYD) dataItem).getVbat()).intValue(); + body.put("cell", cellVal / 3600); // 占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); + MethaneDataItemHSYD dataItem = new MethaneDataItemHSYD(); + + dataItem.setGasval(Double.parseDouble(dataObj.getString("GAS"))); + dataItem.setVbat(Integer.parseInt(dataObj.getString("BAT"))); + dataItem.setBatsta(dataObj.getString("BATSTA")); + dataItem.setTime(dataObj.getString("UPTIME")); + dataItem.setSin(Integer.parseInt(dataObj.getString("SIN"))); + dataItem.setRsrp(Integer.parseInt(dataObj.getString("RSRP"))); + dataItem.setSinr(Integer.parseInt(dataObj.getString("SINR"))); + + 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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java new file mode 100644 index 0000000..20bb899 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java @@ -0,0 +1,44 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemHSYD extends DataItem { + double gasval; + int vbat; + String batsta; + String time; + int sin; + int rsrp; + int sinr; + + @Override + public String toString() { + return "气体浓度值:" + gasval + "%LEL;" + + "电池电压值:" + vbat + "mv;" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gasval); + data.put("vbat", vbat); + data.put("ssState", batsta); // 电池状态 + // 信号质量 + String sig = "0"; + if (rsrp <= -90) { + sig = "1"; + } else if (rsrp <= -70) { + sig = "2"; + } else { + sig ="3"; + } + data.put("sig", sig); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java new file mode 100644 index 0000000..406f524 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java @@ -0,0 +1,128 @@ +package com.casic.methane.frame.hsyd; + +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 MethaneEventFrameHSYD 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); + MethaneEventItemHSYD eventItem = new MethaneEventItemHSYD(); + + 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", "TubeOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemHSYD itemHSYD = (MethaneEventItemHSYD) eventItem; + switch (itemHSYD.getEventType()) { + case "01": + // 所有状态恢复正常 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelAllStateError"); + } + break; + + case "02": + // 设备故障 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelDeviceError"); + } else { + eventArr.add("DeviceError"); + } + break; + + case "03": + // 低电量关机 + eventArr.add("PowerOffAlarm"); + break; + + case "04": + // 水浸报警 判断报警和取消报警 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelWaterImmersionAlarm"); // 00 表示报警取消 + } else { + eventArr.add("WaterImmersionAlarm"); // 非00 表示报警 + } + break; + + case "05": + // 振动报警 无需判断取消报警 + eventArr.add("VibrationAlarm"); + break; + + case "06": + // 位移报警 需要同时推送位置 + eventArr.add(itemHSYD.toJSON()); + break; + + case "07": + // 泄漏报警低报 + eventArr.add(itemHSYD.toJSON()); + break; + case "08": + // 泄漏报警高报 + eventArr.add(itemHSYD.toJSON()); + break; + + case "09": + // 电池低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "12": + // 传感器故障 + eventArr.add("sensorState"); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java new file mode 100644 index 0000000..3ddeb6e --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java @@ -0,0 +1,40 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemHSYD extends EventItem { + String eventType; + String value; + String time; + + @Override + public JSONObject toJSON() { + JSONObject event = new JSONObject(); + + switch (getEventType()) { + case "06": + event.put("alarmType", "DisplacementAlarm"); + break; + case "07": + event.put("alarmType", "GasLeakLowAlarm"); + event.put("alarmValue", value); + break; + case "08": + event.put("alarmType", "GasLeakHighAlarm"); + event.put("alarmValue", value); + break; + } + + return event; + } + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/senitnel/frame/ncx/InfoFrameNCX.java b/src/main/java/com/casic/senitnel/frame/ncx/InfoFrameNCX.java deleted file mode 100644 index 343c4d6..0000000 --- a/src/main/java/com/casic/senitnel/frame/ncx/InfoFrameNCX.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.senitnel.frame.ncx; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.extern.slf4j.Slf4j; - -@EqualsAndHashCode(callSuper = true) -@Data -@Slf4j -public class InfoFrameNCX extends CasicFrame { - - String workMode; - String model; - String hwVersion; - String softVersion; - String sensorType; - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - "设备工作模式: " + workMode + " ; " + - "设备型号: " + model + " ; " + - "版本号: " + hwVersion + ", " + softVersion + "; " + - "传感器类型: " + sensorType + " ; " + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - workMode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - } -} diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index 497f6d4..379648a 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,19 +2,21 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.common.general.IMEIFrame; +import com.casic.common.general.info.InfoFrameBRS; +import com.casic.common.general.info.InfoFrameHSYD; +import com.casic.common.general.info.InfoFrameMHK; +import com.casic.common.general.info.InfoFrameNCX; import com.casic.methane.frame.brs.MethaneDataFrameBRS; import com.casic.methane.frame.brs.MethaneEventFrameBRS; -import com.casic.methane.frame.brs.MethaneInfoFrameBRS; +import com.casic.methane.frame.hsyd.MethaneDataFrameHSYD; +import com.casic.methane.frame.hsyd.MethaneEventFrameHSYD; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; -import com.casic.senitnel.frame.ncx.InfoFrameNCX; import com.casic.tube.frame.brs.DataFrameBRS; import com.casic.tube.frame.brs.EventFrameBRS; -import com.casic.tube.frame.brs.InfoFrameBRS; -import com.casic.common.general.IMEIFrame; import com.casic.tube.frame.mhk.DataFrameMHK; import com.casic.tube.frame.mhk.EventFrameMHK; -import com.casic.tube.frame.mhk.InfoFrameMHK; import com.casic.tube.frame.tp.DataFrameHTTP; import lombok.extern.slf4j.Slf4j; @@ -39,7 +41,7 @@ return new IMEIFrame(); case "07": - return buildInfoFrame(manufacturerCode, deviceType); + return buildInfoFrame(manufacturerCode); default: log.warn("上行消息类型不在范围内[" + messageType + "]"); @@ -55,6 +57,7 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "31": case "32": return buildMethaneDataFrame(manufacturerCode); @@ -71,24 +74,28 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "31": case "32": - return buildMethaneFrame(manufacturerCode); + return buildMethaneEventFrame(manufacturerCode); default: return null; } } - private static CasicFrame buildInfoFrame(String manufacturerCode, String deviceType) { - switch (deviceType) { - case "34": - return buildTubeInfoFrame(manufacturerCode); + private static CasicFrame buildInfoFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "14": + return new InfoFrameNCX(); - case "21": - return buildSentinelInfoFrame(manufacturerCode); + case "15": + return new InfoFrameBRS(); - case "32": - return buildMethaneInfoFrame(manufacturerCode); + case "16": + return new InfoFrameMHK(); + + case "22": + return new InfoFrameHSYD(); default: return null; @@ -122,6 +129,9 @@ case "17": // 航天拓扑 return new DataFrameHTTP(); + case "22": // 华视远大 + return new MethaneDataFrameHSYD(); + default: return null; } @@ -150,11 +160,14 @@ } } - private static CasicFrame buildMethaneFrame(String manufacturerCode) { + private static CasicFrame buildMethaneEventFrame(String manufacturerCode) { switch (manufacturerCode) { - case "15": + case "15": // 百瑞生 return new MethaneEventFrameBRS(); + case "22": // 华视远大 + return new MethaneEventFrameHSYD(); + default: return null; } @@ -169,40 +182,4 @@ return null; } } - - private static CasicFrame buildTubeInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new InfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildMethaneInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "15": - return new MethaneInfoFrameBRS(); - - case "16": - return new InfoFrameMHK(); - - default: - return null; - } - } - - private static CasicFrame buildSentinelInfoFrame(String manufacturerCode) { - switch (manufacturerCode) { - case "14": - return new InfoFrameNCX(); - - default: - return null; - } - } } diff --git a/src/main/java/com/casic/common/general/info/InfoFrameBRS.java b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java new file mode 100644 index 0000000..ec3031a --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameBRS.java @@ -0,0 +1,125 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameBRS extends CasicFrame { + + String workmode; // 工作模式 + String model; // 型号 + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + String sensorType; // 传感器类型 + String simcard; // SIM卡号 + String imei; // IMEI号 + + String rsrp; // 信号接收功率 + String rsrq; // 信号接收质量 + String cellId; // 服务小区ID + String rssi; // 信号强度指示 + String signalECL; // 信号增强覆盖等级 + String sinr; // 信噪比 + String pci; // 服务小区物理小区识别码 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 + String tempL; // 温度低限阈值,扩大100倍 + String tempH; // 温度高限阈值,扩大100倍 + String bat; // 电池电压,单位mV + String sampleIntvl; // 采样间隔,单位秒 + String sampleCnt; // 采样点数,达到采样点数上传数据 + String preheatTim; // 传感器预热时间,仅针对催化传感器有效 + + String shakeEn; // 振动功能使能 + String shakeSampleEn; // 振动采样功能使能 + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String antitheftEn; // 位移功能使能 + String liquidLevelEn; // 液位功能使能 + + String pressEn; // 压力采集使能 + String accThrld; // 加速度阈值1 + String accCnt; // 加速度阈值2 + String preRange; // 压力表量程,单位kPa,扩大100倍传输 + String preAlarmEn; // 压力报警使能 + String preK; // 压力修正系数k + String preB; // 压力修正系数b + String preH; // 压力高报阈值,单位kPa,扩大100倍传输 + String preL; // 压力低报阈值,单位kPa,扩大100倍传输 + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + + (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + + (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + + (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + + (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + + (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + + (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + if (getMessageBody().containsKey("WORKMODE")) { + workmode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + simcard = getMessageBody().getString("SIMCARD"); + imei = getMessageBody().getString("IMEI"); + } + + if (getMessageBody().containsKey("RSRP")) { + rsrp = getMessageBody().getString("RSRP"); + rsrq = getMessageBody().getString("RSRP"); + cellId = getMessageBody().getString("CELLID"); + rssi = getMessageBody().getString("RSSI"); + signalECL = getMessageBody().getString("SIGNALECL"); + sinr = getMessageBody().getString("SINR"); + pci = getMessageBody().getString("PCI"); + } + + if (getMessageBody().containsKey("GASL")) { + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + slope = getMessageBody().getString("SLOPE"); + tempL = getMessageBody().getString("TEMPL"); + tempH = getMessageBody().getString("TEMPH"); + bat = getMessageBody().getString("BAT"); + sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); + sampleCnt = getMessageBody().getString("SAMPLECNT"); + preheatTim = getMessageBody().getString("PREHEATTIM"); + } + + if (getMessageBody().containsKey("SHAKEEN")) { + shakeEn = getMessageBody().getString("SHAKEEN"); + shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + antitheftEn = getMessageBody().getString("ANTITHEFTEN"); + liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); + } + + if (getMessageBody().containsKey("PRESSEN")) { + pressEn = getMessageBody().getString("PRESSEN"); + accThrld = getMessageBody().getString("ACCTHRLD"); + accCnt = getMessageBody().getString("ACCCNT"); + preRange = getMessageBody().getString("PRERANGE"); + preAlarmEn = getMessageBody().getString("PREALARMEN"); + preK = getMessageBody().getString("PREK"); + preB = getMessageBody().getString("PREB"); + preH = getMessageBody().getString("PREH"); + preL = getMessageBody().getString("PREL"); + } + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java new file mode 100644 index 0000000..0938c98 --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameHSYD.java @@ -0,0 +1,53 @@ +package com.casic.common.general.info; + +import cn.hutool.core.util.StrUtil; +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameHSYD extends CasicFrame { + + String softVersion; // 软件版本 + String hwVersion; // 硬件版本 + + String spIntv; // 采样间隔 + String upIntv; // 上传间隔 + + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String shake1; // 振动阈值1 + String shake2; // 振动阈值2 + String shake3; // 振动阈值3 + + String bat; // 电池电压,单位mV + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + (StrUtil.isEmpty(softVersion) ? "" : "软件版本: " + softVersion + "; ") + + (StrUtil.isEmpty(hwVersion) ? "" : "硬件版本: " + hwVersion + "; ") + + (StrUtil.isEmpty(spIntv) ? "" : "采样间隔: " + spIntv + "; ") + + (StrUtil.isEmpty(upIntv) ? "" : "上报间隔: " + upIntv + "; ") + + (StrUtil.isEmpty(gasL) || StrUtil.isEmpty(gasH) ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + + (StrUtil.isEmpty(bat) ? "" : "电池电压: " + bat + " mv;") + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + spIntv = getMessageBody().getString("SPINTV"); + upIntv = getMessageBody().getString("UPINTV"); + gasL = getMessageBody().getString("GASL"); + gasH = getMessageBody().getString("GASH"); + shake1 = getMessageBody().getString("SHAKE1"); + shake2 = getMessageBody().getString("SHAKE2"); + shake3 = getMessageBody().getString("SHAKE3"); + bat = getMessageBody().getString("BAT"); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameMHK.java b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java new file mode 100644 index 0000000..1ebe4dd --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameMHK.java @@ -0,0 +1,49 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +@Data +@Slf4j +public class InfoFrameMHK extends CasicFrame { + + String sv; + String hv; + int al; + int ah; + int intv; + int up; + double lon; + double lat; + int prt; + int gal; + int lbt; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备采样周期: " + intv + " 分钟; " + + "设备上传周期: " + up + " 分钟; " + + "设备报警阈值: " + al + ", " + ah + "; " + + "设备安装位置: " + lon + ", " + lat + "; " + + "GPS位移告警距离: " + gal + " 米; " + + "电池低报阈值: " + lbt + " 毫伏; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + sv = getMessageBody().getString("SV"); + hv = getMessageBody().getString("HV"); + al = Integer.parseInt(getMessageBody().getString("AL")); + ah = Integer.parseInt(getMessageBody().getString("AH")); + intv = Integer.parseInt(getMessageBody().getString("INTV")); + up = Integer.parseInt(getMessageBody().getString("UP")); + lon = Double.parseDouble(getMessageBody().getString("LON")); + lat = Double.parseDouble(getMessageBody().getString("LAT")); + prt = Integer.parseInt(getMessageBody().getString("PRT")); + gal = Integer.parseInt(getMessageBody().getString("GAL")); + lbt = Integer.parseInt(getMessageBody().getString("LBV")); + } +} diff --git a/src/main/java/com/casic/common/general/info/InfoFrameNCX.java b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java new file mode 100644 index 0000000..473db0b --- /dev/null +++ b/src/main/java/com/casic/common/general/info/InfoFrameNCX.java @@ -0,0 +1,37 @@ +package com.casic.common.general.info; + +import com.casic.common.CasicFrame; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.extern.slf4j.Slf4j; + +@EqualsAndHashCode(callSuper = true) +@Data +@Slf4j +public class InfoFrameNCX extends CasicFrame { + + String workMode; + String model; + String hwVersion; + String softVersion; + String sensorType; + + @Override + public String toString() { + return "设备编号: " + getDeviceCode() + "; " + + "设备工作模式: " + workMode + " ; " + + "设备型号: " + model + " ; " + + "版本号: " + hwVersion + ", " + softVersion + "; " + + "传感器类型: " + sensorType + " ; " + + "上报时间: " + getUptime(); + } + + @Override + public void parseMessageBody() { + workMode = getMessageBody().getString("WORKMODE"); + model = getMessageBody().getString("MODEL"); + hwVersion = getMessageBody().getString("HWVERSION"); + softVersion = getMessageBody().getString("SOFTVERSION"); + sensorType = getMessageBody().getString("SENSORTYPE"); + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java deleted file mode 100644 index 4789467..0000000 --- a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.casic.methane.frame.brs; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class MethaneInfoFrameBRS extends CasicFrame { - - String workmode; // 工作模式 - String model; // 型号 - String softVersion; // 软件版本 - String hwVersion; // 硬件版本 - String sensorType; // 传感器类型 - String simcard; // SIM卡号 - String imei; // IMEI号 - - String rsrp; // 信号接收功率 - String rsrq; // 信号接收质量 - String cellId; // 服务小区ID - String rssi; // 信号强度指示 - String signalECL; // 信号增强覆盖等级 - String sinr; // 信噪比 - String pci; // 服务小区物理小区识别码 - - String gasL; // 浓度低报阈值,单位为%LEL - String gasH; // 浓度高报阈值,单位为%LEL - String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 - String tempL; // 温度低限阈值,扩大100倍 - String tempH; // 温度高限阈值,扩大100倍 - String bat; // 电池电压,单位mV - String sampleIntvl; // 采样间隔,单位秒 - String sampleCnt; // 采样点数,达到采样点数上传数据 - String preheatTim; // 传感器预热时间,仅针对催化传感器有效 - - String shakeEn; // 振动功能使能 - String shakeSampleEn; // 振动采样功能使能 - String shake1; // 振动阈值1 - String shake2; // 振动阈值2 - String antitheftEn; // 位移功能使能 - String liquidLevelEn; // 液位功能使能 - - String pressEn; // 压力采集使能 - String accThrld; // 加速度阈值1 - String accCnt; // 加速度阈值2 - String preRange; // 压力表量程,单位kPa,扩大100倍传输 - String preAlarmEn; // 压力报警使能 - String preK; // 压力修正系数k - String preB; // 压力修正系数b - String preH; // 压力高报阈值,单位kPa,扩大100倍传输 - String preL; // 压力低报阈值,单位kPa,扩大100倍传输 - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + - (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + - (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%LEL): " + Double.parseDouble(gasL) + ", " + Double.parseDouble(gasH) + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%LEL): " + Double.parseDouble(slope) + "; ") + - (bat == null || bat.isEmpty() ? "" : "电池电压: " + bat + " mv;") + - (antitheftEn == null || antitheftEn.isEmpty() ? "" : "位移功能: " + (antitheftEn.equals("1") ? "有效" : "无效") + "; ") + - (liquidLevelEn == null || liquidLevelEn.isEmpty() ? "" : "液位功能: " + (liquidLevelEn.equals("1") ? "有效" : "无效") + "; ") + - (pressEn == null || pressEn.isEmpty() ? "" : "压力采集功能: " + (pressEn.equals("1") ? "有效" : "无效") + "; ") + - (preL == null || preH == null || preL.isEmpty() || preH.isEmpty() ? "" : "压力报警阈值(Kpa): " + Double.parseDouble(preL) * 0.01 + ", " + Double.parseDouble(preH) * 0.01 + "; ") + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - if (getMessageBody().containsKey("WORKMODE")) { - workmode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - simcard = getMessageBody().getString("SIMCARD"); - imei = getMessageBody().getString("IMEI"); - } - - if (getMessageBody().containsKey("RSRP")) { - rsrp = getMessageBody().getString("RSRP"); - rsrq = getMessageBody().getString("RSRP"); - cellId = getMessageBody().getString("CELLID"); - rssi = getMessageBody().getString("RSSI"); - signalECL = getMessageBody().getString("SIGNALECL"); - sinr = getMessageBody().getString("SINR"); - pci = getMessageBody().getString("PCI"); - } - - if (getMessageBody().containsKey("GASL")) { - gasL = getMessageBody().getString("GASL"); - gasH = getMessageBody().getString("GASH"); - slope = getMessageBody().getString("SLOPE"); - tempL = getMessageBody().getString("TEMPL"); - tempH = getMessageBody().getString("TEMPH"); - bat = getMessageBody().getString("BAT"); - sampleIntvl = getMessageBody().getString("SAMPLEINTVL"); - sampleCnt = getMessageBody().getString("SAMPLECNT"); - preheatTim = getMessageBody().getString("PREHEATTIM"); - } - - if (getMessageBody().containsKey("SHAKEEN")) { - shakeEn = getMessageBody().getString("SHAKEEN"); - shakeSampleEn = getMessageBody().getString("SHAKESAMPLEEN"); - shake1 = getMessageBody().getString("SHAKE1"); - shake2 = getMessageBody().getString("SHAKE2"); - antitheftEn = getMessageBody().getString("ANTITHEFTEN"); - liquidLevelEn = getMessageBody().getString("LIQUIDLEVELEN"); - } - - if (getMessageBody().containsKey("PRESSEN")) { - pressEn = getMessageBody().getString("PRESSEN"); - accThrld = getMessageBody().getString("ACCTHRLD"); - accCnt = getMessageBody().getString("ACCCNT"); - preRange = getMessageBody().getString("PRERANGE"); - preAlarmEn = getMessageBody().getString("PREALARMEN"); - preK = getMessageBody().getString("PREK"); - preB = getMessageBody().getString("PREB"); - preH = getMessageBody().getString("PREH"); - preL = getMessageBody().getString("PREL"); - } - } -} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java new file mode 100644 index 0000000..9ae4fbc --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataFrameHSYD.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.hsyd; + +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 com.casic.tube.frame.mhk.DataItemMHK; +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 MethaneDataFrameHSYD 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()); + obj.put("cell", ""); + + 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(((MethaneDataItemHSYD) dataItem).getVbat()).intValue(); + body.put("cell", cellVal / 3600); // 占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); + MethaneDataItemHSYD dataItem = new MethaneDataItemHSYD(); + + dataItem.setGasval(Double.parseDouble(dataObj.getString("GAS"))); + dataItem.setVbat(Integer.parseInt(dataObj.getString("BAT"))); + dataItem.setBatsta(dataObj.getString("BATSTA")); + dataItem.setTime(dataObj.getString("UPTIME")); + dataItem.setSin(Integer.parseInt(dataObj.getString("SIN"))); + dataItem.setRsrp(Integer.parseInt(dataObj.getString("RSRP"))); + dataItem.setSinr(Integer.parseInt(dataObj.getString("SINR"))); + + 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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)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(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getGasval())); + data.setCell(NumberUtil.decimalFormat("0.00", ((MethaneDataItemHSYD)dataItem).getVbat() / 3600.0)); + data.setUptime(LocalDateTime.parse(((MethaneDataItemHSYD)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java new file mode 100644 index 0000000..20bb899 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneDataItemHSYD.java @@ -0,0 +1,44 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemHSYD extends DataItem { + double gasval; + int vbat; + String batsta; + String time; + int sin; + int rsrp; + int sinr; + + @Override + public String toString() { + return "气体浓度值:" + gasval + "%LEL;" + + "电池电压值:" + vbat + "mv;" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gasval", gasval); + data.put("vbat", vbat); + data.put("ssState", batsta); // 电池状态 + // 信号质量 + String sig = "0"; + if (rsrp <= -90) { + sig = "1"; + } else if (rsrp <= -70) { + sig = "2"; + } else { + sig ="3"; + } + data.put("sig", sig); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java new file mode 100644 index 0000000..406f524 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventFrameHSYD.java @@ -0,0 +1,128 @@ +package com.casic.methane.frame.hsyd; + +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 MethaneEventFrameHSYD 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); + MethaneEventItemHSYD eventItem = new MethaneEventItemHSYD(); + + 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", "TubeOtherEvent"); + body.put("logTime", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); + JSONArray eventArr = new JSONArray(); + for (EventItem eventItem : eventItemList) { + MethaneEventItemHSYD itemHSYD = (MethaneEventItemHSYD) eventItem; + switch (itemHSYD.getEventType()) { + case "01": + // 所有状态恢复正常 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelAllStateError"); + } + break; + + case "02": + // 设备故障 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelDeviceError"); + } else { + eventArr.add("DeviceError"); + } + break; + + case "03": + // 低电量关机 + eventArr.add("PowerOffAlarm"); + break; + + case "04": + // 水浸报警 判断报警和取消报警 + if (itemHSYD.getValue().equals("00")) { + eventArr.add("CancelWaterImmersionAlarm"); // 00 表示报警取消 + } else { + eventArr.add("WaterImmersionAlarm"); // 非00 表示报警 + } + break; + + case "05": + // 振动报警 无需判断取消报警 + eventArr.add("VibrationAlarm"); + break; + + case "06": + // 位移报警 需要同时推送位置 + eventArr.add(itemHSYD.toJSON()); + break; + + case "07": + // 泄漏报警低报 + eventArr.add(itemHSYD.toJSON()); + break; + case "08": + // 泄漏报警高报 + eventArr.add(itemHSYD.toJSON()); + break; + + case "09": + // 电池低电量报警 + eventArr.add("LowBatAlarm"); + break; + + case "12": + // 传感器故障 + eventArr.add("sensorState"); + break; + + default: + break; + } + } + body.put("eventType", eventArr); + + obj.put("mBody", body); + + return obj; + } +} diff --git a/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java new file mode 100644 index 0000000..3ddeb6e --- /dev/null +++ b/src/main/java/com/casic/methane/frame/hsyd/MethaneEventItemHSYD.java @@ -0,0 +1,40 @@ +package com.casic.methane.frame.hsyd; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemHSYD extends EventItem { + String eventType; + String value; + String time; + + @Override + public JSONObject toJSON() { + JSONObject event = new JSONObject(); + + switch (getEventType()) { + case "06": + event.put("alarmType", "DisplacementAlarm"); + break; + case "07": + event.put("alarmType", "GasLeakLowAlarm"); + event.put("alarmValue", value); + break; + case "08": + event.put("alarmType", "GasLeakHighAlarm"); + event.put("alarmValue", value); + break; + } + + return event; + } + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/senitnel/frame/ncx/InfoFrameNCX.java b/src/main/java/com/casic/senitnel/frame/ncx/InfoFrameNCX.java deleted file mode 100644 index 343c4d6..0000000 --- a/src/main/java/com/casic/senitnel/frame/ncx/InfoFrameNCX.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.casic.senitnel.frame.ncx; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.extern.slf4j.Slf4j; - -@EqualsAndHashCode(callSuper = true) -@Data -@Slf4j -public class InfoFrameNCX extends CasicFrame { - - String workMode; - String model; - String hwVersion; - String softVersion; - String sensorType; - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - "设备工作模式: " + workMode + " ; " + - "设备型号: " + model + " ; " + - "版本号: " + hwVersion + ", " + softVersion + "; " + - "传感器类型: " + sensorType + " ; " + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - workMode = getMessageBody().getString("WORKMODE"); - model = getMessageBody().getString("MODEL"); - hwVersion = getMessageBody().getString("HWVERSION"); - softVersion = getMessageBody().getString("SOFTVERSION"); - sensorType = getMessageBody().getString("SENSORTYPE"); - } -} diff --git a/src/main/java/com/casic/tube/frame/mhk/InfoFrameMHK.java b/src/main/java/com/casic/tube/frame/mhk/InfoFrameMHK.java deleted file mode 100644 index b8ac79c..0000000 --- a/src/main/java/com/casic/tube/frame/mhk/InfoFrameMHK.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.casic.tube.frame.mhk; - -import com.casic.common.CasicFrame; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; - -@Data -@Slf4j -public class InfoFrameMHK extends CasicFrame { - - String sv; - String hv; - int al; - int ah; - int intv; - int up; - double lon; - double lat; - int prt; - int gal; - int lbt; - - @Override - public String toString() { - return "设备编号: " + getDeviceCode() + "; " + - "设备采样周期: " + intv + " 分钟; " + - "设备上传周期: " + up + " 分钟; " + - "设备报警阈值: " + al + ", " + ah + "; " + - "设备安装位置: " + lon + ", " + lat + "; " + - "GPS位移告警距离: " + gal + " 米; " + - "电池低报阈值: " + lbt + " 毫伏; " + - "上报时间: " + getUptime(); - } - - @Override - public void parseMessageBody() { - sv = getMessageBody().getString("SV"); - hv = getMessageBody().getString("HV"); - al = Integer.parseInt(getMessageBody().getString("AL")); - ah = Integer.parseInt(getMessageBody().getString("AH")); - intv = Integer.parseInt(getMessageBody().getString("INTV")); - up = Integer.parseInt(getMessageBody().getString("UP")); - lon = Double.parseDouble(getMessageBody().getString("LON")); - lat = Double.parseDouble(getMessageBody().getString("LAT")); - prt = Integer.parseInt(getMessageBody().getString("PRT")); - gal = Integer.parseInt(getMessageBody().getString("GAL")); - lbt = Integer.parseInt(getMessageBody().getString("LBV")); - } -}