diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java new file mode 100644 index 0000000..fe99e52 --- /dev/null +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -0,0 +1,155 @@ +package com.casic.methane.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.common.CasicFrameBuildFactory; +import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; +import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.model.DeviceWellView; +import com.casic.dao.service.IDataGasService; +import com.casic.dao.service.IDataGasliquidGasService; +import com.casic.dao.service.IDeviceWellViewService; +import com.casic.util.DataPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +@Slf4j +public class MethaneFrameServiceImpl implements IMethaneFrameService { + + @Resource + private CasicProtocol protocol; + + @Resource + IDataGasService dataService; + + @Resource + IDataGasliquidGasService lgDataService; + + @Resource + IDeviceWellViewService deviceService; + + @Resource + DataPushConfig pushConfig; + + public CasicFrame dataParse(String frame) { + // 1. 判断帧结构 + boolean frameValid = protocol.checkFrame(frame); + if (frameValid) { + // 2. 获取帧结构中的关键字段信息 + String deviceId = protocol.getDeviceId(frame); + String deviceType = protocol.getDeviceType(frame); + String messageType = protocol.getMessageType(frame); + String messageBody = protocol.getMessageBody(frame).toUpperCase(); + String uptime = protocol.getUptime(frame); + + String manufacturerCode = protocol.getManufacturerCode(frame); + CasicFrame gasFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType); + + if (gasFrame != null) { + gasFrame.setDeviceCode(deviceId); + gasFrame.setUptime(uptime); + gasFrame.setMessageType(messageType); + gasFrame.setDeviceType(deviceType); + + // 心跳类的消息不解析MessageBody + if (!gasFrame.getMessageType().equals("00")) { + gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); + gasFrame.parseMessageBody(); + } + + log.info("收到设备消息:{}", gasFrame); + return gasFrame; + } + } else { + log.error("消息帧解析异常"); + } + + return null; + } + + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 设备编号前2位 + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return protocol.buildReplyFrameStr(reply); + } + + @Override + public String doBuildCommand(CasicFrame cmd) { + return protocol.buildFrameStr(cmd); + } + + @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return protocol.buildFrameStr(cmdFrame); + } + + @Override + public void afterAction(CasicFrame frame) { + // 数据消息帧 进行存库操作 + if (frame instanceof DataFrame) { + DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(frame.getDeviceCode()); + String wellCode = ""; + if (devWellView != null) { + wellCode = devWellView.getWellCode(); + } + List dataList = ((DataFrame) frame).toDataModelList(); + if (dataList != null) { + for (Serializable item : dataList) { + if (item.getClass().getSimpleName().equalsIgnoreCase("DataGas0")) { + DataGas data = (DataGas) item; + data.setWellCode(wellCode); + dataService.save(data); + } else if (item.getClass().getSimpleName().equalsIgnoreCase("DataGasliquidGas")) { + DataGasliquidGas data = (DataGasliquidGas) item; + data.setWellCode(wellCode); + lgDataService.save(data); + } + } + } + } + } + + @Override + public void pushToApi(CasicFrame frame) { + HttpRequest request = HttpUtil.createPost(pushConfig.getUrl()); + request.contentType("application/json"); + request.body(frame.toJSON().toJSONString()); + request.timeout(5 * 1000); + + try (HttpResponse response = request.execute()) { + log.info("向接口推送数据[url={}][{}]", pushConfig.getUrl(), response.getStatus()); + } catch (Exception ex) { + log.info("向接口推送数据失败[url={}]: {}", pushConfig.getUrl(), ex.getMessage()); + } + } +} diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java new file mode 100644 index 0000000..fe99e52 --- /dev/null +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -0,0 +1,155 @@ +package com.casic.methane.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.common.CasicFrameBuildFactory; +import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; +import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.model.DeviceWellView; +import com.casic.dao.service.IDataGasService; +import com.casic.dao.service.IDataGasliquidGasService; +import com.casic.dao.service.IDeviceWellViewService; +import com.casic.util.DataPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +@Slf4j +public class MethaneFrameServiceImpl implements IMethaneFrameService { + + @Resource + private CasicProtocol protocol; + + @Resource + IDataGasService dataService; + + @Resource + IDataGasliquidGasService lgDataService; + + @Resource + IDeviceWellViewService deviceService; + + @Resource + DataPushConfig pushConfig; + + public CasicFrame dataParse(String frame) { + // 1. 判断帧结构 + boolean frameValid = protocol.checkFrame(frame); + if (frameValid) { + // 2. 获取帧结构中的关键字段信息 + String deviceId = protocol.getDeviceId(frame); + String deviceType = protocol.getDeviceType(frame); + String messageType = protocol.getMessageType(frame); + String messageBody = protocol.getMessageBody(frame).toUpperCase(); + String uptime = protocol.getUptime(frame); + + String manufacturerCode = protocol.getManufacturerCode(frame); + CasicFrame gasFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType); + + if (gasFrame != null) { + gasFrame.setDeviceCode(deviceId); + gasFrame.setUptime(uptime); + gasFrame.setMessageType(messageType); + gasFrame.setDeviceType(deviceType); + + // 心跳类的消息不解析MessageBody + if (!gasFrame.getMessageType().equals("00")) { + gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); + gasFrame.parseMessageBody(); + } + + log.info("收到设备消息:{}", gasFrame); + return gasFrame; + } + } else { + log.error("消息帧解析异常"); + } + + return null; + } + + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 设备编号前2位 + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return protocol.buildReplyFrameStr(reply); + } + + @Override + public String doBuildCommand(CasicFrame cmd) { + return protocol.buildFrameStr(cmd); + } + + @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return protocol.buildFrameStr(cmdFrame); + } + + @Override + public void afterAction(CasicFrame frame) { + // 数据消息帧 进行存库操作 + if (frame instanceof DataFrame) { + DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(frame.getDeviceCode()); + String wellCode = ""; + if (devWellView != null) { + wellCode = devWellView.getWellCode(); + } + List dataList = ((DataFrame) frame).toDataModelList(); + if (dataList != null) { + for (Serializable item : dataList) { + if (item.getClass().getSimpleName().equalsIgnoreCase("DataGas0")) { + DataGas data = (DataGas) item; + data.setWellCode(wellCode); + dataService.save(data); + } else if (item.getClass().getSimpleName().equalsIgnoreCase("DataGasliquidGas")) { + DataGasliquidGas data = (DataGasliquidGas) item; + data.setWellCode(wellCode); + lgDataService.save(data); + } + } + } + } + } + + @Override + public void pushToApi(CasicFrame frame) { + HttpRequest request = HttpUtil.createPost(pushConfig.getUrl()); + request.contentType("application/json"); + request.body(frame.toJSON().toJSONString()); + request.timeout(5 * 1000); + + try (HttpResponse response = request.execute()) { + log.info("向接口推送数据[url={}][{}]", pushConfig.getUrl(), response.getStatus()); + } catch (Exception ex) { + log.info("向接口推送数据失败[url={}]: {}", pushConfig.getUrl(), ex.getMessage()); + } + } +} diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java index d51520c..05f5f52 100644 --- a/src/main/java/com/casic/tube/controller/TubeDataController.java +++ b/src/main/java/com/casic/tube/controller/TubeDataController.java @@ -1,13 +1,18 @@ package com.casic.tube.controller; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import com.casic.common.general.ConfigFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; import com.casic.dao.service.IBusDeviceService; import com.casic.tube.service.ITubeFrameService; import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,11 +34,17 @@ @Resource private IBusDeviceService deviceService; + @Resource + IBusConfigService busConfigService; + @RequestMapping("/tube/data/recv") public Object dataRecv(@RequestBody Map map) { JSONObject retObj = new JSONObject(); log.info(JSONObject.toJSONString(map)); + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); if (recvObj.containsKey("payload")) { JSONObject payload = recvObj.getJSONObject("payload"); @@ -59,6 +70,36 @@ // 存库 frameService.afterAction(frame); + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + retObj.put("code", 200); retObj.put("success", true); } @@ -81,18 +122,8 @@ } String devCode = (String) map.get("devCode"); - CasicFrame cmdFrame = new ConfigFrame(); - cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵) - cmdFrame.setDeviceCode((String) map.get("devCode")); - cmdFrame.setSequence("01"); - cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 - - JSONObject messageBody = new JSONObject(); - messageBody.put("datas", map.get("cmdList")); - cmdFrame.setMessageBody(messageBody); - - String frameStr = frameService.doBuildCommand(cmdFrame); - log.info("下发指令: {}", JSON.toJSONString(frameStr)); + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); // TODO-LIST // 不直接下发到AEP平台 暂时存入数据库 待设备上数之后通过回复的方式下发给设备 diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java new file mode 100644 index 0000000..fe99e52 --- /dev/null +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -0,0 +1,155 @@ +package com.casic.methane.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.common.CasicFrameBuildFactory; +import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; +import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.model.DeviceWellView; +import com.casic.dao.service.IDataGasService; +import com.casic.dao.service.IDataGasliquidGasService; +import com.casic.dao.service.IDeviceWellViewService; +import com.casic.util.DataPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +@Slf4j +public class MethaneFrameServiceImpl implements IMethaneFrameService { + + @Resource + private CasicProtocol protocol; + + @Resource + IDataGasService dataService; + + @Resource + IDataGasliquidGasService lgDataService; + + @Resource + IDeviceWellViewService deviceService; + + @Resource + DataPushConfig pushConfig; + + public CasicFrame dataParse(String frame) { + // 1. 判断帧结构 + boolean frameValid = protocol.checkFrame(frame); + if (frameValid) { + // 2. 获取帧结构中的关键字段信息 + String deviceId = protocol.getDeviceId(frame); + String deviceType = protocol.getDeviceType(frame); + String messageType = protocol.getMessageType(frame); + String messageBody = protocol.getMessageBody(frame).toUpperCase(); + String uptime = protocol.getUptime(frame); + + String manufacturerCode = protocol.getManufacturerCode(frame); + CasicFrame gasFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType); + + if (gasFrame != null) { + gasFrame.setDeviceCode(deviceId); + gasFrame.setUptime(uptime); + gasFrame.setMessageType(messageType); + gasFrame.setDeviceType(deviceType); + + // 心跳类的消息不解析MessageBody + if (!gasFrame.getMessageType().equals("00")) { + gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); + gasFrame.parseMessageBody(); + } + + log.info("收到设备消息:{}", gasFrame); + return gasFrame; + } + } else { + log.error("消息帧解析异常"); + } + + return null; + } + + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 设备编号前2位 + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return protocol.buildReplyFrameStr(reply); + } + + @Override + public String doBuildCommand(CasicFrame cmd) { + return protocol.buildFrameStr(cmd); + } + + @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return protocol.buildFrameStr(cmdFrame); + } + + @Override + public void afterAction(CasicFrame frame) { + // 数据消息帧 进行存库操作 + if (frame instanceof DataFrame) { + DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(frame.getDeviceCode()); + String wellCode = ""; + if (devWellView != null) { + wellCode = devWellView.getWellCode(); + } + List dataList = ((DataFrame) frame).toDataModelList(); + if (dataList != null) { + for (Serializable item : dataList) { + if (item.getClass().getSimpleName().equalsIgnoreCase("DataGas0")) { + DataGas data = (DataGas) item; + data.setWellCode(wellCode); + dataService.save(data); + } else if (item.getClass().getSimpleName().equalsIgnoreCase("DataGasliquidGas")) { + DataGasliquidGas data = (DataGasliquidGas) item; + data.setWellCode(wellCode); + lgDataService.save(data); + } + } + } + } + } + + @Override + public void pushToApi(CasicFrame frame) { + HttpRequest request = HttpUtil.createPost(pushConfig.getUrl()); + request.contentType("application/json"); + request.body(frame.toJSON().toJSONString()); + request.timeout(5 * 1000); + + try (HttpResponse response = request.execute()) { + log.info("向接口推送数据[url={}][{}]", pushConfig.getUrl(), response.getStatus()); + } catch (Exception ex) { + log.info("向接口推送数据失败[url={}]: {}", pushConfig.getUrl(), ex.getMessage()); + } + } +} diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java index d51520c..05f5f52 100644 --- a/src/main/java/com/casic/tube/controller/TubeDataController.java +++ b/src/main/java/com/casic/tube/controller/TubeDataController.java @@ -1,13 +1,18 @@ package com.casic.tube.controller; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import com.casic.common.general.ConfigFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; import com.casic.dao.service.IBusDeviceService; import com.casic.tube.service.ITubeFrameService; import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,11 +34,17 @@ @Resource private IBusDeviceService deviceService; + @Resource + IBusConfigService busConfigService; + @RequestMapping("/tube/data/recv") public Object dataRecv(@RequestBody Map map) { JSONObject retObj = new JSONObject(); log.info(JSONObject.toJSONString(map)); + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); if (recvObj.containsKey("payload")) { JSONObject payload = recvObj.getJSONObject("payload"); @@ -59,6 +70,36 @@ // 存库 frameService.afterAction(frame); + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + retObj.put("code", 200); retObj.put("success", true); } @@ -81,18 +122,8 @@ } String devCode = (String) map.get("devCode"); - CasicFrame cmdFrame = new ConfigFrame(); - cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵) - cmdFrame.setDeviceCode((String) map.get("devCode")); - cmdFrame.setSequence("01"); - cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 - - JSONObject messageBody = new JSONObject(); - messageBody.put("datas", map.get("cmdList")); - cmdFrame.setMessageBody(messageBody); - - String frameStr = frameService.doBuildCommand(cmdFrame); - log.info("下发指令: {}", JSON.toJSONString(frameStr)); + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); // TODO-LIST // 不直接下发到AEP平台 暂时存入数据库 待设备上数之后通过回复的方式下发给设备 diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java index 8c9872d..7d61339 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java @@ -55,10 +55,10 @@ JSONObject dataObj = dataArray.getJSONObject(i); DataItemBRS dataItem = new DataItemBRS(); - dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")) * 0.01)); + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); dataItem.setBat(dataObj.getString("BAT")); dataItem.setSig(dataObj.getString("SIG")); - dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); dataItem.setSsState(dataObj.getString("SSSTATE")); dataItem.setDevStat(dataObj.getString("DEVSTAT")); dataItem.setTime(dataObj.getString("UPTIME")); diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java new file mode 100644 index 0000000..fe99e52 --- /dev/null +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -0,0 +1,155 @@ +package com.casic.methane.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.common.CasicFrameBuildFactory; +import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; +import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.model.DeviceWellView; +import com.casic.dao.service.IDataGasService; +import com.casic.dao.service.IDataGasliquidGasService; +import com.casic.dao.service.IDeviceWellViewService; +import com.casic.util.DataPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +@Slf4j +public class MethaneFrameServiceImpl implements IMethaneFrameService { + + @Resource + private CasicProtocol protocol; + + @Resource + IDataGasService dataService; + + @Resource + IDataGasliquidGasService lgDataService; + + @Resource + IDeviceWellViewService deviceService; + + @Resource + DataPushConfig pushConfig; + + public CasicFrame dataParse(String frame) { + // 1. 判断帧结构 + boolean frameValid = protocol.checkFrame(frame); + if (frameValid) { + // 2. 获取帧结构中的关键字段信息 + String deviceId = protocol.getDeviceId(frame); + String deviceType = protocol.getDeviceType(frame); + String messageType = protocol.getMessageType(frame); + String messageBody = protocol.getMessageBody(frame).toUpperCase(); + String uptime = protocol.getUptime(frame); + + String manufacturerCode = protocol.getManufacturerCode(frame); + CasicFrame gasFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType); + + if (gasFrame != null) { + gasFrame.setDeviceCode(deviceId); + gasFrame.setUptime(uptime); + gasFrame.setMessageType(messageType); + gasFrame.setDeviceType(deviceType); + + // 心跳类的消息不解析MessageBody + if (!gasFrame.getMessageType().equals("00")) { + gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); + gasFrame.parseMessageBody(); + } + + log.info("收到设备消息:{}", gasFrame); + return gasFrame; + } + } else { + log.error("消息帧解析异常"); + } + + return null; + } + + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 设备编号前2位 + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return protocol.buildReplyFrameStr(reply); + } + + @Override + public String doBuildCommand(CasicFrame cmd) { + return protocol.buildFrameStr(cmd); + } + + @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return protocol.buildFrameStr(cmdFrame); + } + + @Override + public void afterAction(CasicFrame frame) { + // 数据消息帧 进行存库操作 + if (frame instanceof DataFrame) { + DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(frame.getDeviceCode()); + String wellCode = ""; + if (devWellView != null) { + wellCode = devWellView.getWellCode(); + } + List dataList = ((DataFrame) frame).toDataModelList(); + if (dataList != null) { + for (Serializable item : dataList) { + if (item.getClass().getSimpleName().equalsIgnoreCase("DataGas0")) { + DataGas data = (DataGas) item; + data.setWellCode(wellCode); + dataService.save(data); + } else if (item.getClass().getSimpleName().equalsIgnoreCase("DataGasliquidGas")) { + DataGasliquidGas data = (DataGasliquidGas) item; + data.setWellCode(wellCode); + lgDataService.save(data); + } + } + } + } + } + + @Override + public void pushToApi(CasicFrame frame) { + HttpRequest request = HttpUtil.createPost(pushConfig.getUrl()); + request.contentType("application/json"); + request.body(frame.toJSON().toJSONString()); + request.timeout(5 * 1000); + + try (HttpResponse response = request.execute()) { + log.info("向接口推送数据[url={}][{}]", pushConfig.getUrl(), response.getStatus()); + } catch (Exception ex) { + log.info("向接口推送数据失败[url={}]: {}", pushConfig.getUrl(), ex.getMessage()); + } + } +} diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java index d51520c..05f5f52 100644 --- a/src/main/java/com/casic/tube/controller/TubeDataController.java +++ b/src/main/java/com/casic/tube/controller/TubeDataController.java @@ -1,13 +1,18 @@ package com.casic.tube.controller; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import com.casic.common.general.ConfigFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; import com.casic.dao.service.IBusDeviceService; import com.casic.tube.service.ITubeFrameService; import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,11 +34,17 @@ @Resource private IBusDeviceService deviceService; + @Resource + IBusConfigService busConfigService; + @RequestMapping("/tube/data/recv") public Object dataRecv(@RequestBody Map map) { JSONObject retObj = new JSONObject(); log.info(JSONObject.toJSONString(map)); + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); if (recvObj.containsKey("payload")) { JSONObject payload = recvObj.getJSONObject("payload"); @@ -59,6 +70,36 @@ // 存库 frameService.afterAction(frame); + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + retObj.put("code", 200); retObj.put("success", true); } @@ -81,18 +122,8 @@ } String devCode = (String) map.get("devCode"); - CasicFrame cmdFrame = new ConfigFrame(); - cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵) - cmdFrame.setDeviceCode((String) map.get("devCode")); - cmdFrame.setSequence("01"); - cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 - - JSONObject messageBody = new JSONObject(); - messageBody.put("datas", map.get("cmdList")); - cmdFrame.setMessageBody(messageBody); - - String frameStr = frameService.doBuildCommand(cmdFrame); - log.info("下发指令: {}", JSON.toJSONString(frameStr)); + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); // TODO-LIST // 不直接下发到AEP平台 暂时存入数据库 待设备上数之后通过回复的方式下发给设备 diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java index 8c9872d..7d61339 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java @@ -55,10 +55,10 @@ JSONObject dataObj = dataArray.getJSONObject(i); DataItemBRS dataItem = new DataItemBRS(); - dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")) * 0.01)); + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); dataItem.setBat(dataObj.getString("BAT")); dataItem.setSig(dataObj.getString("SIG")); - dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); dataItem.setSsState(dataObj.getString("SSSTATE")); dataItem.setDevStat(dataObj.getString("DEVSTAT")); dataItem.setTime(dataObj.getString("UPTIME")); diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java index e3d4663..6f68aab 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java @@ -17,6 +17,7 @@ @Override public String toString() { return "气体浓度值:" + gas + "%LEL;" + + "温度值:" + temp + "℃;" + "电池电压值:" + bat + "mv;" + "采样时间:" + time; } diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java new file mode 100644 index 0000000..fe99e52 --- /dev/null +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -0,0 +1,155 @@ +package com.casic.methane.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.common.CasicFrameBuildFactory; +import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; +import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.model.DeviceWellView; +import com.casic.dao.service.IDataGasService; +import com.casic.dao.service.IDataGasliquidGasService; +import com.casic.dao.service.IDeviceWellViewService; +import com.casic.util.DataPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +@Slf4j +public class MethaneFrameServiceImpl implements IMethaneFrameService { + + @Resource + private CasicProtocol protocol; + + @Resource + IDataGasService dataService; + + @Resource + IDataGasliquidGasService lgDataService; + + @Resource + IDeviceWellViewService deviceService; + + @Resource + DataPushConfig pushConfig; + + public CasicFrame dataParse(String frame) { + // 1. 判断帧结构 + boolean frameValid = protocol.checkFrame(frame); + if (frameValid) { + // 2. 获取帧结构中的关键字段信息 + String deviceId = protocol.getDeviceId(frame); + String deviceType = protocol.getDeviceType(frame); + String messageType = protocol.getMessageType(frame); + String messageBody = protocol.getMessageBody(frame).toUpperCase(); + String uptime = protocol.getUptime(frame); + + String manufacturerCode = protocol.getManufacturerCode(frame); + CasicFrame gasFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType); + + if (gasFrame != null) { + gasFrame.setDeviceCode(deviceId); + gasFrame.setUptime(uptime); + gasFrame.setMessageType(messageType); + gasFrame.setDeviceType(deviceType); + + // 心跳类的消息不解析MessageBody + if (!gasFrame.getMessageType().equals("00")) { + gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); + gasFrame.parseMessageBody(); + } + + log.info("收到设备消息:{}", gasFrame); + return gasFrame; + } + } else { + log.error("消息帧解析异常"); + } + + return null; + } + + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 设备编号前2位 + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return protocol.buildReplyFrameStr(reply); + } + + @Override + public String doBuildCommand(CasicFrame cmd) { + return protocol.buildFrameStr(cmd); + } + + @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return protocol.buildFrameStr(cmdFrame); + } + + @Override + public void afterAction(CasicFrame frame) { + // 数据消息帧 进行存库操作 + if (frame instanceof DataFrame) { + DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(frame.getDeviceCode()); + String wellCode = ""; + if (devWellView != null) { + wellCode = devWellView.getWellCode(); + } + List dataList = ((DataFrame) frame).toDataModelList(); + if (dataList != null) { + for (Serializable item : dataList) { + if (item.getClass().getSimpleName().equalsIgnoreCase("DataGas0")) { + DataGas data = (DataGas) item; + data.setWellCode(wellCode); + dataService.save(data); + } else if (item.getClass().getSimpleName().equalsIgnoreCase("DataGasliquidGas")) { + DataGasliquidGas data = (DataGasliquidGas) item; + data.setWellCode(wellCode); + lgDataService.save(data); + } + } + } + } + } + + @Override + public void pushToApi(CasicFrame frame) { + HttpRequest request = HttpUtil.createPost(pushConfig.getUrl()); + request.contentType("application/json"); + request.body(frame.toJSON().toJSONString()); + request.timeout(5 * 1000); + + try (HttpResponse response = request.execute()) { + log.info("向接口推送数据[url={}][{}]", pushConfig.getUrl(), response.getStatus()); + } catch (Exception ex) { + log.info("向接口推送数据失败[url={}]: {}", pushConfig.getUrl(), ex.getMessage()); + } + } +} diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java index d51520c..05f5f52 100644 --- a/src/main/java/com/casic/tube/controller/TubeDataController.java +++ b/src/main/java/com/casic/tube/controller/TubeDataController.java @@ -1,13 +1,18 @@ package com.casic.tube.controller; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import com.casic.common.general.ConfigFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; import com.casic.dao.service.IBusDeviceService; import com.casic.tube.service.ITubeFrameService; import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,11 +34,17 @@ @Resource private IBusDeviceService deviceService; + @Resource + IBusConfigService busConfigService; + @RequestMapping("/tube/data/recv") public Object dataRecv(@RequestBody Map map) { JSONObject retObj = new JSONObject(); log.info(JSONObject.toJSONString(map)); + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); if (recvObj.containsKey("payload")) { JSONObject payload = recvObj.getJSONObject("payload"); @@ -59,6 +70,36 @@ // 存库 frameService.afterAction(frame); + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + retObj.put("code", 200); retObj.put("success", true); } @@ -81,18 +122,8 @@ } String devCode = (String) map.get("devCode"); - CasicFrame cmdFrame = new ConfigFrame(); - cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵) - cmdFrame.setDeviceCode((String) map.get("devCode")); - cmdFrame.setSequence("01"); - cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 - - JSONObject messageBody = new JSONObject(); - messageBody.put("datas", map.get("cmdList")); - cmdFrame.setMessageBody(messageBody); - - String frameStr = frameService.doBuildCommand(cmdFrame); - log.info("下发指令: {}", JSON.toJSONString(frameStr)); + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); // TODO-LIST // 不直接下发到AEP平台 暂时存入数据库 待设备上数之后通过回复的方式下发给设备 diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java index 8c9872d..7d61339 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java @@ -55,10 +55,10 @@ JSONObject dataObj = dataArray.getJSONObject(i); DataItemBRS dataItem = new DataItemBRS(); - dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")) * 0.01)); + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); dataItem.setBat(dataObj.getString("BAT")); dataItem.setSig(dataObj.getString("SIG")); - dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); dataItem.setSsState(dataObj.getString("SSSTATE")); dataItem.setDevStat(dataObj.getString("DEVSTAT")); dataItem.setTime(dataObj.getString("UPTIME")); diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java index e3d4663..6f68aab 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java @@ -17,6 +17,7 @@ @Override public String toString() { return "气体浓度值:" + gas + "%LEL;" + + "温度值:" + temp + "℃;" + "电池电压值:" + bat + "mv;" + "采样时间:" + time; } diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java index 4f6f591..cb43d5c 100644 --- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java @@ -24,9 +24,9 @@ String sinr; // 信噪比 String pci; // 服务小区物理小区识别码 - String gasL; // 浓度低报阈值,单位为%VOL,实际传输时扩大100倍 - String gasH; // 浓度高报阈值,单位为%VOL,实际传输时扩大100倍 - String slope; // 浓度梯度阈值,单位为%VOL,如果设备检测到浓度并报警后,后续每上涨slope%VOL才会生成一次报警 + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 String tempL; // 温度低限阈值,扩大100倍 String tempH; // 温度高限阈值,扩大100倍 String bat; // 电池电压,单位mV @@ -57,8 +57,8 @@ (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%VOL): " + Double.parseDouble(gasL) * 0.01 + ", " + Double.parseDouble(gasH) * 0.01 + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%VOL): " + Double.parseDouble(slope) * 0.01 + "; ") + + (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") ? "有效" : "无效") + "; ") + diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java new file mode 100644 index 0000000..fe99e52 --- /dev/null +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -0,0 +1,155 @@ +package com.casic.methane.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.common.CasicFrameBuildFactory; +import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; +import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.model.DeviceWellView; +import com.casic.dao.service.IDataGasService; +import com.casic.dao.service.IDataGasliquidGasService; +import com.casic.dao.service.IDeviceWellViewService; +import com.casic.util.DataPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +@Slf4j +public class MethaneFrameServiceImpl implements IMethaneFrameService { + + @Resource + private CasicProtocol protocol; + + @Resource + IDataGasService dataService; + + @Resource + IDataGasliquidGasService lgDataService; + + @Resource + IDeviceWellViewService deviceService; + + @Resource + DataPushConfig pushConfig; + + public CasicFrame dataParse(String frame) { + // 1. 判断帧结构 + boolean frameValid = protocol.checkFrame(frame); + if (frameValid) { + // 2. 获取帧结构中的关键字段信息 + String deviceId = protocol.getDeviceId(frame); + String deviceType = protocol.getDeviceType(frame); + String messageType = protocol.getMessageType(frame); + String messageBody = protocol.getMessageBody(frame).toUpperCase(); + String uptime = protocol.getUptime(frame); + + String manufacturerCode = protocol.getManufacturerCode(frame); + CasicFrame gasFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType); + + if (gasFrame != null) { + gasFrame.setDeviceCode(deviceId); + gasFrame.setUptime(uptime); + gasFrame.setMessageType(messageType); + gasFrame.setDeviceType(deviceType); + + // 心跳类的消息不解析MessageBody + if (!gasFrame.getMessageType().equals("00")) { + gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); + gasFrame.parseMessageBody(); + } + + log.info("收到设备消息:{}", gasFrame); + return gasFrame; + } + } else { + log.error("消息帧解析异常"); + } + + return null; + } + + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 设备编号前2位 + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return protocol.buildReplyFrameStr(reply); + } + + @Override + public String doBuildCommand(CasicFrame cmd) { + return protocol.buildFrameStr(cmd); + } + + @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return protocol.buildFrameStr(cmdFrame); + } + + @Override + public void afterAction(CasicFrame frame) { + // 数据消息帧 进行存库操作 + if (frame instanceof DataFrame) { + DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(frame.getDeviceCode()); + String wellCode = ""; + if (devWellView != null) { + wellCode = devWellView.getWellCode(); + } + List dataList = ((DataFrame) frame).toDataModelList(); + if (dataList != null) { + for (Serializable item : dataList) { + if (item.getClass().getSimpleName().equalsIgnoreCase("DataGas0")) { + DataGas data = (DataGas) item; + data.setWellCode(wellCode); + dataService.save(data); + } else if (item.getClass().getSimpleName().equalsIgnoreCase("DataGasliquidGas")) { + DataGasliquidGas data = (DataGasliquidGas) item; + data.setWellCode(wellCode); + lgDataService.save(data); + } + } + } + } + } + + @Override + public void pushToApi(CasicFrame frame) { + HttpRequest request = HttpUtil.createPost(pushConfig.getUrl()); + request.contentType("application/json"); + request.body(frame.toJSON().toJSONString()); + request.timeout(5 * 1000); + + try (HttpResponse response = request.execute()) { + log.info("向接口推送数据[url={}][{}]", pushConfig.getUrl(), response.getStatus()); + } catch (Exception ex) { + log.info("向接口推送数据失败[url={}]: {}", pushConfig.getUrl(), ex.getMessage()); + } + } +} diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java index d51520c..05f5f52 100644 --- a/src/main/java/com/casic/tube/controller/TubeDataController.java +++ b/src/main/java/com/casic/tube/controller/TubeDataController.java @@ -1,13 +1,18 @@ package com.casic.tube.controller; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import com.casic.common.general.ConfigFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; import com.casic.dao.service.IBusDeviceService; import com.casic.tube.service.ITubeFrameService; import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,11 +34,17 @@ @Resource private IBusDeviceService deviceService; + @Resource + IBusConfigService busConfigService; + @RequestMapping("/tube/data/recv") public Object dataRecv(@RequestBody Map map) { JSONObject retObj = new JSONObject(); log.info(JSONObject.toJSONString(map)); + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); if (recvObj.containsKey("payload")) { JSONObject payload = recvObj.getJSONObject("payload"); @@ -59,6 +70,36 @@ // 存库 frameService.afterAction(frame); + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + retObj.put("code", 200); retObj.put("success", true); } @@ -81,18 +122,8 @@ } String devCode = (String) map.get("devCode"); - CasicFrame cmdFrame = new ConfigFrame(); - cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵) - cmdFrame.setDeviceCode((String) map.get("devCode")); - cmdFrame.setSequence("01"); - cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 - - JSONObject messageBody = new JSONObject(); - messageBody.put("datas", map.get("cmdList")); - cmdFrame.setMessageBody(messageBody); - - String frameStr = frameService.doBuildCommand(cmdFrame); - log.info("下发指令: {}", JSON.toJSONString(frameStr)); + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); // TODO-LIST // 不直接下发到AEP平台 暂时存入数据库 待设备上数之后通过回复的方式下发给设备 diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java index 8c9872d..7d61339 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java @@ -55,10 +55,10 @@ JSONObject dataObj = dataArray.getJSONObject(i); DataItemBRS dataItem = new DataItemBRS(); - dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")) * 0.01)); + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); dataItem.setBat(dataObj.getString("BAT")); dataItem.setSig(dataObj.getString("SIG")); - dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); dataItem.setSsState(dataObj.getString("SSSTATE")); dataItem.setDevStat(dataObj.getString("DEVSTAT")); dataItem.setTime(dataObj.getString("UPTIME")); diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java index e3d4663..6f68aab 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java @@ -17,6 +17,7 @@ @Override public String toString() { return "气体浓度值:" + gas + "%LEL;" + + "温度值:" + temp + "℃;" + "电池电压值:" + bat + "mv;" + "采样时间:" + time; } diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java index 4f6f591..cb43d5c 100644 --- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java @@ -24,9 +24,9 @@ String sinr; // 信噪比 String pci; // 服务小区物理小区识别码 - String gasL; // 浓度低报阈值,单位为%VOL,实际传输时扩大100倍 - String gasH; // 浓度高报阈值,单位为%VOL,实际传输时扩大100倍 - String slope; // 浓度梯度阈值,单位为%VOL,如果设备检测到浓度并报警后,后续每上涨slope%VOL才会生成一次报警 + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 String tempL; // 温度低限阈值,扩大100倍 String tempH; // 温度高限阈值,扩大100倍 String bat; // 电池电压,单位mV @@ -57,8 +57,8 @@ (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%VOL): " + Double.parseDouble(gasL) * 0.01 + ", " + Double.parseDouble(gasH) * 0.01 + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%VOL): " + Double.parseDouble(slope) * 0.01 + "; ") + + (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") ? "有效" : "无效") + "; ") + diff --git a/src/main/java/com/casic/tube/service/ITubeFrameService.java b/src/main/java/com/casic/tube/service/ITubeFrameService.java index a7dbb56..a0c2b67 100644 --- a/src/main/java/com/casic/tube/service/ITubeFrameService.java +++ b/src/main/java/com/casic/tube/service/ITubeFrameService.java @@ -6,8 +6,12 @@ CasicFrame dataParse(String frame); + String replyMessage(String deviceCode, String sequence); + String doBuildCommand(CasicFrame cmd); + String doBuildCommand(String deviceCode, String cmdList); + void afterAction(CasicFrame frame); void pushToApi(CasicFrame frame); diff --git a/src/main/java/com/casic/common/CasicFrame.java b/src/main/java/com/casic/common/CasicFrame.java index 3f3424d..2175800 100644 --- a/src/main/java/com/casic/common/CasicFrame.java +++ b/src/main/java/com/casic/common/CasicFrame.java @@ -19,6 +19,10 @@ String uptime; JSONObject messageBody; + public String getDevTypeName() { + return ""; + } + public void parseMessageBody() { } diff --git a/src/main/java/com/casic/common/CasicFrameBuildFactory.java b/src/main/java/com/casic/common/CasicFrameBuildFactory.java index a2a5e8e..328c635 100644 --- a/src/main/java/com/casic/common/CasicFrameBuildFactory.java +++ b/src/main/java/com/casic/common/CasicFrameBuildFactory.java @@ -2,6 +2,9 @@ import com.casic.common.general.ConfigResponseFrame; import com.casic.common.general.HeartFrame; +import com.casic.methane.frame.brs.MethaneDataFrameBRS; +import com.casic.methane.frame.brs.MethaneEventFrameBRS; +import com.casic.methane.frame.brs.MethaneInfoFrameBRS; import com.casic.senitnel.frame.ncx.DataFrameNCX; import com.casic.senitnel.frame.ncx.EventFrameNCX; import com.casic.senitnel.frame.ncx.InfoFrameNCX; @@ -52,6 +55,9 @@ case "21": return buildSentinelDataFrame(manufacturerCode); + case "32": + return buildMethaneDataFrame(manufacturerCode); + default: return null; } @@ -65,6 +71,9 @@ case "21": return buildSentinelEventFrame(manufacturerCode); + case "32": + return buildTubeMethaneFrame(manufacturerCode); + default: return null; } @@ -78,6 +87,9 @@ case "21": return buildSentinelInfoFrame(manufacturerCode); + case "32": + return buildMethaneInfoFrame(manufacturerCode); + default: return null; } @@ -99,6 +111,22 @@ } } + private static CasicFrame buildMethaneDataFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": // 百瑞生 + return new MethaneDataFrameBRS(); + + case "16": // 麦哈克 + return new DataFrameMHK(); + + case "17": // 航天拓扑 + return new DataFrameHTTP(); + + default: + return null; + } + } + private static CasicFrame buildSentinelDataFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -122,6 +150,19 @@ } } + private static CasicFrame buildTubeMethaneFrame(String manufacturerCode) { + switch (manufacturerCode) { + case "15": + return new MethaneEventFrameBRS(); + + case "16": + return new EventFrameMHK(); + + default: + return null; + } + } + private static CasicFrame buildSentinelEventFrame(String manufacturerCode) { switch (manufacturerCode) { case "14": // 诺成新 @@ -145,6 +186,19 @@ } } + 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": diff --git a/src/main/java/com/casic/dao/mapper/DataGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasMapper.java new file mode 100644 index 0000000..a5c0c3b --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java new file mode 100644 index 0000000..68fdb60 --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/DataGasliquidGasMapper.java @@ -0,0 +1,18 @@ +package com.casic.dao.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.casic.dao.model.DataGasliquidGas; +import org.apache.ibatis.annotations.Mapper; + +/** + *

+ * 报警数据 Mapper 接口 + *

+ * + * @author cz + * @since 2023-11-20 + */ +@Mapper +public interface DataGasliquidGasMapper extends BaseMapper { + +} diff --git a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java index 1d73134..5de998b 100644 --- a/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java +++ b/src/main/java/com/casic/dao/mapper/DeviceWellViewMapper.java @@ -5,6 +5,8 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** *

* 报警数据 Mapper 接口 @@ -17,4 +19,5 @@ public interface DeviceWellViewMapper extends BaseMapper { DeviceWellView getOneByDevCode(String devCode); + List getByDevCode(String devCode); } diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml new file mode 100644 index 0000000..b99f85a --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml new file mode 100644 index 0000000..fba4e9f --- /dev/null +++ b/src/main/java/com/casic/dao/mapper/mapping/DataGasliquidGasMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + id, DEVCODE, WELL_CODE, STRENGTH, UPTIME, LOGTIME + + + + ${paramStr} + + + + TO_TIMESTAMP(${paramStr},'yyyy-MM-dd hh24:mi:ss')::timestamp without time zone + + + + TO_DATE(${paramStr},'yyyy-mm-dd hh24:mi') + + + diff --git a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml index 58d5b87..5230ef2 100644 --- a/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml +++ b/src/main/java/com/casic/dao/mapper/mapping/DeviceWellViewMapper.xml @@ -26,4 +26,13 @@ devCode = #{devCode} + + diff --git a/src/main/java/com/casic/dao/model/DataGas.java b/src/main/java/com/casic/dao/model/DataGas.java new file mode 100644 index 0000000..8ee7892 --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGas.java @@ -0,0 +1,96 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gas") +public class DataGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 接收信号强度等级 + */ + @TableField("PCI") + private String pci; + + /** + * 接收信号参考质量 服务小 区的 RSRP 值 + */ + @TableField("RSRP") + private String rsrp; + + /** + * 信噪比 + */ + @TableField("SNR") + private String snr; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/model/DataGasliquidGas.java b/src/main/java/com/casic/dao/model/DataGasliquidGas.java new file mode 100644 index 0000000..04bce5d --- /dev/null +++ b/src/main/java/com/casic/dao/model/DataGasliquidGas.java @@ -0,0 +1,78 @@ +package com.casic.dao.model; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + *

+ * 第三方厂家管盯数据 + *

+ * + * @author tanyue + * @since 2024-07-01 + */ +@Data +@TableName("data_gasliquid_gas") +public class DataGasliquidGas implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + @TableId("ID") + private Long id; + + /** + * 设备编号 + */ + @TableField("DEVCODE") + private String devcode; + + /** + * 点位编号 + */ + @TableField("WELL_CODE") + private String wellCode; + + + /** + * 气体浓度采样值 + */ + @TableField("STRENGTH") + private String strength; + + /** + * 设备电池电压值(毫伏) + */ + @TableField("CELL") + private String cell; + + /** + * 描述 + */ + @TableField("DESCN") + private String descn; + + /** + * 采集时间 + */ + @TableField("UPTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime uptime; + + /** + * 上传时间 默认为当前时间 + */ + @TableField("LOGTIME") + @JSONField(format = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime logtime; + + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasService.java b/src/main/java/com/casic/dao/service/IDataGasService.java new file mode 100644 index 0000000..6b6eb7e --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGas; + +public interface IDataGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java new file mode 100644 index 0000000..fff2707 --- /dev/null +++ b/src/main/java/com/casic/dao/service/IDataGasliquidGasService.java @@ -0,0 +1,8 @@ +package com.casic.dao.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.casic.dao.model.DataGasliquidGas; + +public interface IDataGasliquidGasService extends IService { + +} diff --git a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java index b851f3e..d810fae 100644 --- a/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/BusConfigServiceImpl.java @@ -52,6 +52,7 @@ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("DEVICE_ID", deviceId); queryWrapper.eq("STATUS", "0"); + queryWrapper.orderByDesc("WRITETIME"); List busConfigList = baseMapper.selectList(queryWrapper); if (ObjectUtil.isNotEmpty(busConfigList)) { return busConfigList.get(0); diff --git a/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java new file mode 100644 index 0000000..0f085fc --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasMapper; +import com.casic.dao.model.DataGas; +import com.casic.dao.service.IDataGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasServiceImpl extends ServiceImpl implements IDataGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java new file mode 100644 index 0000000..f50571d --- /dev/null +++ b/src/main/java/com/casic/dao/service/impl/DataGasliquidGasServiceImpl.java @@ -0,0 +1,11 @@ +package com.casic.dao.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.casic.dao.mapper.DataGasliquidGasMapper; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.service.IDataGasliquidGasService; +import org.springframework.stereotype.Service; + +@Service +public class DataGasliquidGasServiceImpl extends ServiceImpl implements IDataGasliquidGasService { +} diff --git a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java index f30d824..02e8883 100644 --- a/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java +++ b/src/main/java/com/casic/dao/service/impl/DeviceWellViewServiceImpl.java @@ -6,10 +6,16 @@ import com.casic.dao.service.IDeviceWellViewService; import org.springframework.stereotype.Service; +import java.util.List; + @Service public class DeviceWellViewServiceImpl extends ServiceImpl implements IDeviceWellViewService { @Override public DeviceWellView getDeviceWellViewByDevCode(String devCode) { - return baseMapper.getOneByDevCode(devCode); + List viewList = baseMapper.getByDevCode(devCode); + if (viewList.isEmpty()) { + return null; + } + return viewList.get(0); } } diff --git a/src/main/java/com/casic/methane/controller/MethaneDataController.java b/src/main/java/com/casic/methane/controller/MethaneDataController.java new file mode 100644 index 0000000..f78ef84 --- /dev/null +++ b/src/main/java/com/casic/methane/controller/MethaneDataController.java @@ -0,0 +1,129 @@ +package com.casic.methane.controller; + +import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; +import com.casic.dao.service.IBusDeviceService; +import com.casic.methane.service.IMethaneFrameService; +import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.Base64; +import java.util.Map; + +@Slf4j +@RestController +public class MethaneDataController { + + @Resource + private IMethaneFrameService frameService; + + @Resource + private IBusDeviceService deviceService; + + @Resource + IBusConfigService busConfigService; + + @RequestMapping("/methane/data/recv") + public Object dataRecv(@RequestBody Map map) { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); + if (recvObj.containsKey("payload")) { + JSONObject payload = recvObj.getJSONObject("payload"); + String value = payload.getString("APPdata"); + + if (value.isEmpty()) { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } else { + byte[] baseBytes = Base64.getDecoder().decode(value); + String frameStr = new String(baseBytes); + + // 根据协议进行解析 + CasicFrame frame = frameService.dataParse(frameStr); + + // 异步推送 + ThreadUtil.execAsync(() -> { + log.info("异步推送数据到接口:{}", frame.toJSON().toJSONString()); + frameService.pushToApi(frame); + }); + + // 存库 + frameService.afterAction(frame); + + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + + retObj.put("code", 200); + retObj.put("success", true); + } + } else { + retObj.put("resp", "payload not matched"); + retObj.put("code", 200); + retObj.put("success", false); + } + + return retObj; + } + + @RequestMapping("/methane/config/send") + public Object configSend(@RequestBody Map map) throws Exception { + JSONObject retObj = new JSONObject(); + log.info(JSONObject.toJSONString(map)); + + if (!map.containsKey("devCode")) { + return new ReturnDTO<>(500, "设备编号不能为空"); + } + String devCode = (String) map.get("devCode"); + + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); + + retObj.put("code", 200); + retObj.put("success", true); + return retObj; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java new file mode 100644 index 0000000..6e0b29c --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataFrameBRS.java @@ -0,0 +1,115 @@ +package com.casic.methane.frame.brs; + +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataFrame; +import com.casic.common.general.DataItem; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +@Data +@Slf4j +public class MethaneDataFrameBRS extends DataFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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(((MethaneDataItemBRS) dataItem).getBat()).intValue(); + obj.put("cell", cellVal / 36); // 占3600mv的百分比 + } + body.put("datas", dataArr); + + obj.put("mBody", body); + + return obj; + } + + @Override + public void parseMessageBody() { + JSONArray dataArray = getMessageBody().getJSONArray("DATAS"); + dataItemList = new ArrayList<>(); + for (int i = 0; i < dataArray.size(); i++) { + JSONObject dataObj = dataArray.getJSONObject(i); + MethaneDataItemBRS dataItem = new MethaneDataItemBRS(); + + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); + dataItem.setBat(dataObj.getString("BAT")); + dataItem.setSig(dataObj.getString("SIG")); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); + dataItem.setSsState(dataObj.getString("SSSTATE")); + dataItem.setDevStat(dataObj.getString("DEVSTAT")); + dataItem.setTime(dataObj.getString("UPTIME")); + + dataItemList.add(dataItem); + } + } + + @Override + public List toDataModelList() { + List dataList = new ArrayList<>(); + for (DataItem dataItem : dataItemList) { + if (getDeviceType().equals("31")) { + DataGas gasData = new DataGas(); + setGasData(gasData, dataItem); + + dataList.add(gasData); + } else if (getDeviceType().equals("32")) { + DataGasliquidGas lgGasData = new DataGasliquidGas(); + setLGGasData(lgGasData, dataItem); + + dataList.add(lgGasData); + } + } + + return dataList; + } + + private void setGasData(DataGas data, DataItem dataItem) { + data.setDevcode(getDeviceCode()); + data.setStrength(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)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(((MethaneDataItemBRS)dataItem).getGas()); + data.setCell(((MethaneDataItemBRS)dataItem).getBat()); + data.setUptime(LocalDateTime.parse(((MethaneDataItemBRS)dataItem).getTime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 采集时间 + data.setLogtime(LocalDateTime.parse(getUptime(), DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 上报时间 + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java new file mode 100644 index 0000000..8d63f0a --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneDataItemBRS.java @@ -0,0 +1,33 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.DataItem; +import lombok.Data; + +@Data +public class MethaneDataItemBRS extends DataItem { + String sig; // 信号强度:0表示无信号,1表示信号弱,2表示信号中等,3表示信号强 + String temp; // 温度值 + String ssState; // 传感器状态:0表示正常,39表示传感器通讯异常 + String bat; // 电池电压 单位mv + String gas; // 浓度,单位%LEL + String devStat; // 设备状态,0表示正常,其他值表示异常 + String time; // 采集时间 + + @Override + public String toString() { + return "气体浓度值:" + gas + "%LEL;" + + "电池电压值:" + bat + "mv;" + + "温度值:" + temp + "℃" + + "采样时间:" + time; + } + + @Override + public JSONObject toJSON() { + JSONObject data = new JSONObject(); + data.put("gas", gas); + data.put("uptime", getTime()); + + return data; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java new file mode 100644 index 0000000..a6e0455 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventFrameBRS.java @@ -0,0 +1,41 @@ +package com.casic.methane.frame.brs; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.general.EventFrame; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; + +@Data +@Slf4j +public class MethaneEventFrameBRS extends EventFrame { + + @Override + public String getDevTypeName() { + return getDeviceType().equals("31") ? "Methane" : "LG"; + } + + @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); + MethaneEventItemBRS eventItem = new MethaneEventItemBRS(); + + eventItem.setEventType(dataObj.getString("EVENTTYPE")); + eventItem.setValue(dataObj.getString("VALUE")); + eventItem.setTime(dataObj.getString("UPTIME")); + + eventItemList.add(eventItem); + } + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java new file mode 100644 index 0000000..9f888f7 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneEventItemBRS.java @@ -0,0 +1,18 @@ +package com.casic.methane.frame.brs; + +import com.casic.common.general.EventItem; +import lombok.Data; + +@Data +public class MethaneEventItemBRS extends EventItem { + String eventType; + String value; + String time; + + @Override + public String toString() { + return "报警类型:" + eventType + ";" + + "报警数值:" + value + ";" + + "报警时间:" + time; + } +} diff --git a/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java new file mode 100644 index 0000000..4789467 --- /dev/null +++ b/src/main/java/com/casic/methane/frame/brs/MethaneInfoFrameBRS.java @@ -0,0 +1,125 @@ +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/service/IMethaneFrameService.java b/src/main/java/com/casic/methane/service/IMethaneFrameService.java new file mode 100644 index 0000000..e1cfef0 --- /dev/null +++ b/src/main/java/com/casic/methane/service/IMethaneFrameService.java @@ -0,0 +1,18 @@ +package com.casic.methane.service; + +import com.casic.common.CasicFrame; + +public interface IMethaneFrameService { + + CasicFrame dataParse(String frame); + + String replyMessage(String deviceCode, String sequence); + + String doBuildCommand(CasicFrame cmd); + + String doBuildCommand(String deviceCode, String cmdList); + + void afterAction(CasicFrame frame); + + void pushToApi(CasicFrame frame); +} diff --git a/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java new file mode 100644 index 0000000..fe99e52 --- /dev/null +++ b/src/main/java/com/casic/methane/service/MethaneFrameServiceImpl.java @@ -0,0 +1,155 @@ +package com.casic.methane.service; + +import cn.hutool.http.HttpRequest; +import cn.hutool.http.HttpResponse; +import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.casic.common.CasicFrame; +import com.casic.common.CasicFrameBuildFactory; +import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; +import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; +import com.casic.dao.model.DataGas; +import com.casic.dao.model.DataGasliquidGas; +import com.casic.dao.model.DeviceWellView; +import com.casic.dao.service.IDataGasService; +import com.casic.dao.service.IDataGasliquidGasService; +import com.casic.dao.service.IDeviceWellViewService; +import com.casic.util.DataPushConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.List; + + +@Service +@Slf4j +public class MethaneFrameServiceImpl implements IMethaneFrameService { + + @Resource + private CasicProtocol protocol; + + @Resource + IDataGasService dataService; + + @Resource + IDataGasliquidGasService lgDataService; + + @Resource + IDeviceWellViewService deviceService; + + @Resource + DataPushConfig pushConfig; + + public CasicFrame dataParse(String frame) { + // 1. 判断帧结构 + boolean frameValid = protocol.checkFrame(frame); + if (frameValid) { + // 2. 获取帧结构中的关键字段信息 + String deviceId = protocol.getDeviceId(frame); + String deviceType = protocol.getDeviceType(frame); + String messageType = protocol.getMessageType(frame); + String messageBody = protocol.getMessageBody(frame).toUpperCase(); + String uptime = protocol.getUptime(frame); + + String manufacturerCode = protocol.getManufacturerCode(frame); + CasicFrame gasFrame = CasicFrameBuildFactory.buildCasicFrame(messageType, manufacturerCode, deviceType); + + if (gasFrame != null) { + gasFrame.setDeviceCode(deviceId); + gasFrame.setUptime(uptime); + gasFrame.setMessageType(messageType); + gasFrame.setDeviceType(deviceType); + + // 心跳类的消息不解析MessageBody + if (!gasFrame.getMessageType().equals("00")) { + gasFrame.setMessageBody(protocol.parseMessageBody(messageBody)); + gasFrame.parseMessageBody(); + } + + log.info("收到设备消息:{}", gasFrame); + return gasFrame; + } + } else { + log.error("消息帧解析异常"); + } + + return null; + } + + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 设备编号前2位 + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return protocol.buildReplyFrameStr(reply); + } + + @Override + public String doBuildCommand(CasicFrame cmd) { + return protocol.buildFrameStr(cmd); + } + + @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return protocol.buildFrameStr(cmdFrame); + } + + @Override + public void afterAction(CasicFrame frame) { + // 数据消息帧 进行存库操作 + if (frame instanceof DataFrame) { + DeviceWellView devWellView = deviceService.getDeviceWellViewByDevCode(frame.getDeviceCode()); + String wellCode = ""; + if (devWellView != null) { + wellCode = devWellView.getWellCode(); + } + List dataList = ((DataFrame) frame).toDataModelList(); + if (dataList != null) { + for (Serializable item : dataList) { + if (item.getClass().getSimpleName().equalsIgnoreCase("DataGas0")) { + DataGas data = (DataGas) item; + data.setWellCode(wellCode); + dataService.save(data); + } else if (item.getClass().getSimpleName().equalsIgnoreCase("DataGasliquidGas")) { + DataGasliquidGas data = (DataGasliquidGas) item; + data.setWellCode(wellCode); + lgDataService.save(data); + } + } + } + } + } + + @Override + public void pushToApi(CasicFrame frame) { + HttpRequest request = HttpUtil.createPost(pushConfig.getUrl()); + request.contentType("application/json"); + request.body(frame.toJSON().toJSONString()); + request.timeout(5 * 1000); + + try (HttpResponse response = request.execute()) { + log.info("向接口推送数据[url={}][{}]", pushConfig.getUrl(), response.getStatus()); + } catch (Exception ex) { + log.info("向接口推送数据失败[url={}]: {}", pushConfig.getUrl(), ex.getMessage()); + } + } +} diff --git a/src/main/java/com/casic/tube/controller/TubeDataController.java b/src/main/java/com/casic/tube/controller/TubeDataController.java index d51520c..05f5f52 100644 --- a/src/main/java/com/casic/tube/controller/TubeDataController.java +++ b/src/main/java/com/casic/tube/controller/TubeDataController.java @@ -1,13 +1,18 @@ package com.casic.tube.controller; import cn.hutool.core.thread.ThreadUtil; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import com.casic.common.general.ConfigFrame; +import com.casic.dao.model.BusConfig; +import com.casic.dao.model.BusDevice; +import com.casic.dao.service.IBusConfigService; import com.casic.dao.service.IBusDeviceService; import com.casic.tube.service.ITubeFrameService; import com.casic.util.ReturnDTO; +import com.casic.util.aep.AepCommandSend; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -29,11 +34,17 @@ @Resource private IBusDeviceService deviceService; + @Resource + IBusConfigService busConfigService; + @RequestMapping("/tube/data/recv") public Object dataRecv(@RequestBody Map map) { JSONObject retObj = new JSONObject(); log.info(JSONObject.toJSONString(map)); + String deviceId = (String) map.get("deviceId"); + String productId = (String) map.get("productId"); + JSONObject recvObj = (JSONObject) JSONObject.toJSON(map); if (recvObj.containsKey("payload")) { JSONObject payload = recvObj.getJSONObject("payload"); @@ -59,6 +70,36 @@ // 存库 frameService.afterAction(frame); + String devCode = frame.getDeviceCode(); + + // 回复和参数配置 + BusDevice device = deviceService.getDeviceByCode(devCode); + if (ObjectUtil.isNotNull(device)) { + AepCommandSend aepCommandSend = new AepCommandSend(deviceId, productId); + aepCommandSend.setMasterApiKey(device.getMasterApiKey()); + aepCommandSend.setAppKey(device.getNbAppKey()); + aepCommandSend.setAppSecret(device.getNbAppSecret()); + + // 查询数据库中是否有配置参数 + BusConfig busConfig = busConfigService.getConfigTobeSend(device.getId()); + if (ObjectUtil.isNotNull(busConfig)) { + String configCmdStr = frameService.doBuildCommand(devCode, busConfig.getFrameContent()); + try { + int code = aepCommandSend.handleAndReply(configCmdStr); + log.info("下发参数配置[retCode={}]: {}", code, JSON.toJSONString(configCmdStr)); + + if (code == 0) { + busConfigService.updateConfigState(device.getId(), "1"); + } else { + busConfigService.updateConfigState(device.getId(), "2"); + } + } catch (Exception ex) { + log.error("向设备下发参数配置异常:[message={}], {}", ex.getMessage(), configCmdStr); + busConfigService.updateConfigState(device.getId(), "2"); + } + } + } + retObj.put("code", 200); retObj.put("success", true); } @@ -81,18 +122,8 @@ } String devCode = (String) map.get("devCode"); - CasicFrame cmdFrame = new ConfigFrame(); - cmdFrame.setDeviceType("34"); // 设备类型为 管线浓度监测设备-管盯(管线哨兵) - cmdFrame.setDeviceCode((String) map.get("devCode")); - cmdFrame.setSequence("01"); - cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 - - JSONObject messageBody = new JSONObject(); - messageBody.put("datas", map.get("cmdList")); - cmdFrame.setMessageBody(messageBody); - - String frameStr = frameService.doBuildCommand(cmdFrame); - log.info("下发指令: {}", JSON.toJSONString(frameStr)); + // 存入数据库 + busConfigService.saveOrUpdateConfig(devCode, new JSONObject(map).getJSONArray("cmdList")); // TODO-LIST // 不直接下发到AEP平台 暂时存入数据库 待设备上数之后通过回复的方式下发给设备 diff --git a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java index 8c9872d..7d61339 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataFrameBRS.java @@ -55,10 +55,10 @@ JSONObject dataObj = dataArray.getJSONObject(i); DataItemBRS dataItem = new DataItemBRS(); - dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")) * 0.01)); + dataItem.setGas(String.valueOf(Double.parseDouble(dataObj.getString("GAS")))); dataItem.setBat(dataObj.getString("BAT")); dataItem.setSig(dataObj.getString("SIG")); - dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")))); + dataItem.setTemp(String.valueOf(Double.parseDouble(dataObj.getString("TEMP")) * 0.01)); dataItem.setSsState(dataObj.getString("SSSTATE")); dataItem.setDevStat(dataObj.getString("DEVSTAT")); dataItem.setTime(dataObj.getString("UPTIME")); diff --git a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java index e3d4663..6f68aab 100644 --- a/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/DataItemBRS.java @@ -17,6 +17,7 @@ @Override public String toString() { return "气体浓度值:" + gas + "%LEL;" + + "温度值:" + temp + "℃;" + "电池电压值:" + bat + "mv;" + "采样时间:" + time; } diff --git a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java index 4f6f591..cb43d5c 100644 --- a/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java +++ b/src/main/java/com/casic/tube/frame/brs/InfoFrameBRS.java @@ -24,9 +24,9 @@ String sinr; // 信噪比 String pci; // 服务小区物理小区识别码 - String gasL; // 浓度低报阈值,单位为%VOL,实际传输时扩大100倍 - String gasH; // 浓度高报阈值,单位为%VOL,实际传输时扩大100倍 - String slope; // 浓度梯度阈值,单位为%VOL,如果设备检测到浓度并报警后,后续每上涨slope%VOL才会生成一次报警 + String gasL; // 浓度低报阈值,单位为%LEL + String gasH; // 浓度高报阈值,单位为%LEL + String slope; // 浓度梯度阈值,单位为%LEL,如果设备检测到浓度并报警后,后续每上涨slope%LEL才会生成一次报警 String tempL; // 温度低限阈值,扩大100倍 String tempH; // 温度高限阈值,扩大100倍 String bat; // 电池电压,单位mV @@ -57,8 +57,8 @@ (softVersion == null || softVersion.isEmpty() ? "" : "软件版本: " + softVersion + "; ") + (simcard == null || simcard.isEmpty() ? "" : "SIM卡号: " + simcard + "; ") + (rsrp == null || rsrp.isEmpty() ? "" : ("信号接收功率: " + rsrp) + "; ") + - (gasL == null || gasH == null || gasL.isEmpty() || gasH.isEmpty() ? "" : "浓度报警阈值(%VOL): " + Double.parseDouble(gasL) * 0.01 + ", " + Double.parseDouble(gasH) * 0.01 + "; ") + - (slope == null || slope.isEmpty() ? "" : "浓度梯度阈值(%VOL): " + Double.parseDouble(slope) * 0.01 + "; ") + + (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") ? "有效" : "无效") + "; ") + diff --git a/src/main/java/com/casic/tube/service/ITubeFrameService.java b/src/main/java/com/casic/tube/service/ITubeFrameService.java index a7dbb56..a0c2b67 100644 --- a/src/main/java/com/casic/tube/service/ITubeFrameService.java +++ b/src/main/java/com/casic/tube/service/ITubeFrameService.java @@ -6,8 +6,12 @@ CasicFrame dataParse(String frame); + String replyMessage(String deviceCode, String sequence); + String doBuildCommand(CasicFrame cmd); + String doBuildCommand(String deviceCode, String cmdList); + void afterAction(CasicFrame frame); void pushToApi(CasicFrame frame); diff --git a/src/main/java/com/casic/tube/service/TubeFrameServiceImpl.java b/src/main/java/com/casic/tube/service/TubeFrameServiceImpl.java index 79cd022..c6f1060 100644 --- a/src/main/java/com/casic/tube/service/TubeFrameServiceImpl.java +++ b/src/main/java/com/casic/tube/service/TubeFrameServiceImpl.java @@ -3,10 +3,14 @@ import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import cn.hutool.http.HttpUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.casic.common.CasicFrame; import com.casic.common.CasicFrameBuildFactory; import com.casic.common.CasicProtocol; +import com.casic.common.general.ConfigFrame; import com.casic.common.general.DataFrame; +import com.casic.common.general.ReplyFrame; import com.casic.dao.model.DataTubeOther; import com.casic.dao.model.DeviceWellView; import com.casic.dao.service.IDataTubeOtherService; @@ -17,6 +21,8 @@ import javax.annotation.Resource; import java.io.Serializable; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.List; @@ -71,12 +77,37 @@ return null; } + public String replyMessage(String deviceCode, String sequence) { + CasicFrame reply = new ReplyFrame(); + reply.setDeviceType("21"); // 设备类型为 燃气监测桩(防第三方破坏) + reply.setDeviceCode(deviceCode); + reply.setSequence(sequence); + reply.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + return tubeProtocol.buildReplyFrameStr(reply); + } + @Override public String doBuildCommand(CasicFrame cmd) { return tubeProtocol.buildFrameStr(cmd); } @Override + public String doBuildCommand(String deviceCode, String cmdList) { + CasicFrame cmdFrame = new ConfigFrame(); + cmdFrame.setDeviceType(deviceCode.substring(0, 2)); // 设备类型为 燃气监测桩(防第三方破坏) + cmdFrame.setDeviceCode(deviceCode); + cmdFrame.setSequence("01"); + cmdFrame.setUptime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"))); // 当前时刻 + + JSONObject messageBody = new JSONObject(); + messageBody.put("datas", JSONArray.parseArray(cmdList)); + cmdFrame.setMessageBody(messageBody); + + return tubeProtocol.buildFrameStr(cmdFrame); + } + + @Override public void afterAction(CasicFrame frame) { // 数据消息帧 进行存库操作 if (frame instanceof DataFrame) {