wuzeyu
2024-05-06 dba2b8fa7830de783b698d22671d63bdf2de9521
Merge remote-tracking branch 'origin/master'
34个文件已修改
68个文件已添加
4718 ■■■■■ 已修改文件
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Data.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_02_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_10_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_21_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_35_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_36_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_37_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_38_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_39_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3A_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3B_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3C_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3D_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_65_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_66_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_67_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_68_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_69_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_6A_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_6B_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_6C_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_71_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_81_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_83_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_84_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_91_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_92_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_93_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_97_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_98_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_C0_Down.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/说明.txt 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/CodeV202404.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/CommonV202404.java 223 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DataAlarmVo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DataStateVo.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DataV202404.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DriverV202404.java 155 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/OnLineV202404.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ParseParamsForDownV202404.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ParseParamsForUpV202404.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/PrefixedDataAvailableV202404.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ProtocolConstantV206V202404.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd10Vo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd15Vo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd16Vo.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd50Vo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd55Vo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd56Vo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd5BVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd5CVo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd65Vo.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd97Vo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd98Vo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_02_Down.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_02_Up.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_10_Down.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_10_Up.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_15_Down.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_15_Up.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_16_Down.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_50_Down.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_50_Up.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_55_Down.java 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_55_Up.java 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_56_Down.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_56_Up.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5B_Down.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5B_Up.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5C_Down.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5C_Up.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_65_Down.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_65_Up.java 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_80_Down.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_80_Up.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_81_Down.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_81_Up.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_8A_Down.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_8A_Up.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_97_Down.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_97_Up.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_98_Down.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_98_Up.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlCreate.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd02Vo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd10Vo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd15Vo.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd50Vo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd55Vo.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd56Vo.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd5BVo.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd5CVo.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd65Vo.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd80Vo.java 204 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd81Vo.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd8AVo.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd97Vo.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd98Vo.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/说明.txt 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ByteUtil.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/DateTime.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/Data.java
@@ -13,12 +13,12 @@
    private static final long serialVersionUID = 20160805192500101L;
    public String rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
    private String commandId ;//命令ID,可能为null
    private String rtuAddr ;//终端地址
    private String protocol ;//数据所对应的协议名称
    private String code ;//数据所对应的功能码:
    private Object subData ;//对应各个功能码的具体数据
    private String hex ;//上报数据的十六进制
    public String commandId ;//命令ID,可能为null
    public String rtuAddr ;//终端地址
    public String protocol ;//数据所对应的协议名称
    public String code ;//数据所对应的功能码:
    public Object subData ;//对应各个功能码的具体数据
    public String hex ;//上报数据的十六进制
    public String toString() {
        StringBuilder sb = new StringBuilder() ;
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_02_Down.java
@@ -19,7 +19,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_10_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_21_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_35_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_36_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_37_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_38_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_39_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3A_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3B_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3C_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_3D_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_65_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_66_Down.java
@@ -29,7 +29,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_67_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_68_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_69_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_6A_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_6B_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_6C_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_71_Down.java
@@ -23,7 +23,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_81_Down.java
@@ -23,7 +23,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_83_Down.java
@@ -23,7 +23,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_84_Down.java
@@ -23,7 +23,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_91_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_92_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_93_Down.java
@@ -27,7 +27,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_97_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_98_Down.java
@@ -28,7 +28,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/parse/Cd_C0_Down.java
@@ -23,7 +23,7 @@
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.rtuResultSendWebUrl = para.rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址(电信平台设备IMEI)
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V1_0_0/˵Ã÷.txt
@@ -4,4 +4,9 @@
但实现的部分可以用来测试测控一体阀(与段志强一起测试过)。
目前情况下,这版本协议实现不能应用于实际项目中,如果必须实现,
还需要结合硬件协议具体实现内容再实现通信中间件的协议解析与构造部分,
还需要实现上行数据处理任务树部分。
还需要实现上行数据处理任务树部分。
靳总版测控一体阀与王江海版测控一体阀不能在同一个中间件运行,
因为两个版本的协议协议头都一样,没法区分开来,如果两种设备
都要应用,需要部署两个通信中间件。
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/CodeV202404.java
New file
@@ -0,0 +1,101 @@
package com.dy.common.mw.protocol.p206V202404;
public class CodeV202404 {
    //功能码为字符串,十六进制数据
    public static final String cd_02 = "02" ;//链路检测
    public static final String cd_10 = "10" ;//设置设备终端地址
    public static final String cd_8A = "8A" ;//设备登录
    public static final String cd_50 = "50" ; //查询设备终端地址
    public static final String cd_80 = "80" ; //设备终端工作上报
    public static final String cd_81 = "81" ; //设备终端随机自报
    public static final String cd_5B = "5B" ; //查询设备终端实时值
    public static final String cd_65 = "65" ; //查询设备终端用户用水记录
    public static final String cd_97 = "97" ; //清除设备终端用户用水记录
    public static final String cd_15 = "15" ; //远程用户充值
    public static final String cd_55 = "55" ; //查询设备终端充值记录
    public static final String cd_98 = "98" ; //清空设备终端充值记录
    public static final String cd_16 = "16" ; //设置设备终端剩余水量和剩余金额报警值
    public static final String cd_56 = "56" ; //查询设备终端剩余水量和剩余金额报警值
    public static final String cd_5C = "5C" ; //查询设备终端的日记录
    public static final String cd_99 = "99" ; //清空设备终端日记录
    public static final String cd_22 = "22" ; //设置机井年最大开采量和水位下限
    public static final String cd_68 = "68" ; //查询机井年最大开采量和水位下限
    public static final String cd_30 = "30" ; //设置设备终端用水有效
    public static final String cd_31 = "31" ; //设置设备终端用水无效
    public static final String cd_92 = "92" ; //平台远程开启水泵/阀门
    public static final String cd_93 = "93" ; //平台远程关闭水泵/阀门
    public static final String cd_A2 = "A2" ; //APP远程开启水泵/阀门
    public static final String cd_A3 = "A3" ; //APP远程关闭水泵/阀门
    public static final String cd_83 = "83" ; //遥测终端定点上报
    public static final String cd_84 = "84" ; //刷卡开泵/阀上报
    public static final String cd_85 = "85" ; //刷卡关泵/阀上报
    public static final String cd_9A = "9A" ; //清除年用水量和年用电量
    public static final String cd_26 = "26" ; //设置设备终端年用水量
    public static final String cd_21 = "21" ; //设置设备终端IP地址
    public static final String cd_86 = "86" ; //查询设备终端IP地址
    public static final String cd_23 = "23" ; //设置设备终端域名
    public static final String cd_87 = "87" ; //查询设备终端域名
    public static final String cd_88 = "88" ; //查询设备终端注册号
    public static final String cd_24 = "24" ; //设置设备终端注册号
    public static final String cd_25 = "25" ; //设置设备终端重新注册
    public static final String cd_9B = "9B" ; //清除设备终端注册号
    public static final String cd_9C = "9C" ; //黑名单远程强制关闭水泵/阀门
    public static final String cd_C2 = "C2" ; //开关水泵/阀门成功/失败上报
    public static String getCodeName(String code) {
        String name = (code.equals(cd_02) ? "链路检测" :
            (code.equals(cd_10) ? "设置设备终端地址" :
            (code.equals(cd_8A) ? "设备登录" :
            (code.equals(cd_50) ? "查询设备终端地址" :
            (code.equals(cd_80) ? "设备终端工作上报" :
            (code.equals(cd_81) ? "设备终端随机自报" :
            (code.equals(cd_5B) ? "查询设备终端实时值" :
            (code.equals(cd_65) ? "查询设备终端用户用水记录" :
            (code.equals(cd_97) ? "清除设备终端用户用水记录" :
            (code.equals(cd_15) ? "远程用户充值" :
            (code.equals(cd_55) ? "查询设备终端充值记录" :
            (code.equals(cd_98) ? "清空设备终端充值记录" :
            (code.equals(cd_16) ? "设置设备终端剩余水量和剩余金额报警值" :
            (code.equals(cd_56) ? "查询设备终端剩余水量和剩余金额报警值" :
            (code.equals(cd_5C) ? "查询设备终端的日记录" :
            (code.equals(cd_99) ? "清空设备终端日记录" :
            (code.equals(cd_22) ? "设置机井年最大开采量和水位下限" :
            (code.equals(cd_68) ? "查询机井年最大开采量和水位下限" :
            (code.equals(cd_30) ? "设置设备终端用水有效" :
            (code.equals(cd_31) ? "设置设备终端用水无效" :
            (code.equals(cd_92) ? "平台远程开启水泵/阀门" :
            (code.equals(cd_93) ? "平台远程关闭水泵/阀门" :
            (code.equals(cd_A2) ? "APP远程开启水泵/阀门" :
            (code.equals(cd_A3) ? "APP远程关闭水泵/阀门" :
            (code.equals(cd_83) ? "遥测终端定点上报" :
            (code.equals(cd_84) ? "刷卡开泵/阀上报" :
            (code.equals(cd_85) ? "刷卡关泵/阀上报" :
            (code.equals(cd_9A) ? "清除年用水量和年用电量" :
            (code.equals(cd_26) ? "设置设备终端年用水量" :
            (code.equals(cd_21) ? "设置设备终端IP地址" :
            (code.equals(cd_86) ? "查询设备终端IP地址" :
            (code.equals(cd_23) ? "设置设备终端域名" :
            (code.equals(cd_87) ? "查询设备终端域名" :
            (code.equals(cd_88) ? "查询设备终端注册号" :
            (code.equals(cd_24) ? "设置设备终端注册号" :
            (code.equals(cd_25) ? "设置设备终端重新注册" :
            (code.equals(cd_9B) ? "清除设备终端注册号" :
            (code.equals(cd_9C) ? "黑名单远程强制关闭水泵/阀门" :
            (code.equals(cd_C2) ? "开关水泵/阀门成功/失败上报" :
            ""))))))))))))))))))))))))))))))))))))))) ;
        return name ;
    }
    /**
     * æ˜¯å¦ä¸ºæœ‰æ•ˆåŠŸèƒ½ç 
     * @param code åŠŸèƒ½ç 
     * @return æœ‰æ•ˆtrue,无效false
     */
    public static boolean isValid(String code){
        String name = getCodeName(code) ;
        if(name != null && !name.equals("")){
            return true ;
        }
        return false ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/CommonV202404.java
New file
@@ -0,0 +1,223 @@
package com.dy.common.mw.protocol.p206V202404;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import com.dy.common.util.CRC8_for_2_0;
public class CommonV202404 {
    /**
     * æ£€æŸ¥å¤´
     * @param bs ä¸Šè¡Œå­—节数组
     * @return true是,false否
     * @throws Exception  å¼‚常
     */
    public Boolean isThisProtocolHead(byte[] bs) throws Exception{
        if(bs == null){
            return null ;
        }else if(bs.length >= (ProtocolConstantV206V202404.ctrlIndex - 1)
                && bs[0] == ProtocolConstantV206V202404.P_Head_Byte){
            if(bs[2] == ProtocolConstantV206V202404.P_Head_Byte){
                return true ;
            }else if((byte)(bs[2] & 0xF8) == ProtocolConstantV206V202404.P_Head_Byte){
                //如果控制域、地址域、用户数据域(应用层)的字节总数大于255,则通过扩展第二个开始字符0x68的低3位作为长L的高位扩展
                //0xF8二进制: 11111000
                return true ;
            }else{
                return false ;
            }
        }else{
            return false ;
        }
    }
    /**
     * æ£€æŸ¥å¤´
     * @param bs ä¸Šè¡Œå­—节数组
     * @throws Exception å¼‚常
     */
    public void checkHead(byte[] bs) throws Exception{
        if(bs.length < ProtocolConstantV206V202404.lenHead2Code
                || bs[0] != ProtocolConstantV206V202404.P_Head_Byte){
            throw new Exception("上行数据帧头不正确!") ;
        }else{
            if(bs.length >= ProtocolConstantV206V202404.lenHead2Code){
                if(bs[2] != ProtocolConstantV206V202404.P_Head_Byte
                    && (byte)(bs[2] & 0xF8) != ProtocolConstantV206V202404.P_Head_Byte){
                    throw new Exception("上行数据帧头不正确!") ;
                }
            }else{
                throw new Exception("上行数据帧头不正确!") ;
            }
        }
    }
    /**
     * æ£€æŸ¥å°¾
     * @param bs ä¸Šè¡Œå­—节数组
     * @throws Exception å¼‚常
     */
    public void checkTail(byte[] bs) throws Exception{
        if(bs.length < 1 || bs[bs.length - 1] != ProtocolConstantV206V202404.P_Tail_Byte){
            throw new Exception("上行数据尾不正确!") ;
        }
    }
    /**
     * åˆ†æžå¸§é•¿åº¦
     * @param bs ä¸Šè¡Œå­—节数组
     * @return æ•°æ®é•¿åº¦
     * @throws Exception å¼‚常
     */
    public int parseFrameLen(byte[] bs)throws Exception{
        if(bs[2] != ProtocolConstantV206V202404.P_Head_Byte
                && (byte)(bs[2] & 0xF8) != ProtocolConstantV206V202404.P_Head_Byte){
            int lenH = bs[2] & 0x07 ;
            int lenL = ByteUtilUnsigned.byte2Byte(bs, ProtocolConstantV206V202404.dataLenIndex) ;
            return (lenH * 100) + (lenL + ProtocolConstantV206V202404.lenHead2ctrl + ProtocolConstantV206V202404.lenTail) ;
        }else{
            int len = ByteUtilUnsigned.byte2Byte(bs, ProtocolConstantV206V202404.dataLenIndex) ;
            return len + ProtocolConstantV206V202404.lenHead2ctrl + ProtocolConstantV206V202404.lenTail ;
        }
    }
    /**
     * åˆ†æžç”¨æˆ·æ•°æ®åŸŸå­—节数
     * @param bs ä¸Šè¡Œå­—节数组
     * @return æ•°æ®é•¿åº¦
     * @throws Exception å¼‚常
     */
    public int parseDataLen(byte[] bs)throws Exception{
        return parseFrameLen(bs) ;
    }
    /**
     * åˆ†æžRtu地址
     * @param bs ä¸Šè¡Œå­—节数组
     * @return æŽ§åˆ¶å™¨åœ°å€
     * @throws Exception å¼‚常
     */
    public String parseRtuAddr(byte[] bs)throws Exception{
        String rtuAddrBCD = "" + ByteUtil.BCD2Long_BE(bs, ProtocolConstantV206V202404.rtuAddr1Index_start, ProtocolConstantV206V202404.rtuAddr1Index_end) ;
        String rtuAddrStr = "" + ByteUtilUnsigned.bytes2Short_LE(bs, ProtocolConstantV206V202404.rtuAddr2Index_start) ;
        while(rtuAddrStr.length() < 5){
            rtuAddrStr = "0" + rtuAddrStr ;
        }
        return rtuAddrBCD + rtuAddrStr ;
    }
    /**
     * åˆ†æžRtu地址
     * @param bs ä¸Šè¡Œå­—节数组
     * @param index å¯å§‹ä½
     * @return æŽ§åˆ¶å™¨åœ°å€
     * @throws Exception å¼‚常
     */
    public String parseRtuAddr(byte[] bs, int index)throws Exception{
        String rtuAddrBCD = "" + ByteUtil.BCD2Long_BE(bs, index, index + ProtocolConstantV206V202404.rtuAddr1Index_end - ProtocolConstantV206V202404.rtuAddr1Index_start) ;//地址是大端模式
        String rtuAddrStr = "" + ByteUtilUnsigned.bytes2Short_LE(bs, index + 1 + ProtocolConstantV206V202404.rtuAddr1Index_end - ProtocolConstantV206V202404.rtuAddr1Index_start) ;
        while(rtuAddrStr.length() < 5){
            rtuAddrStr = "0" + rtuAddrStr ;
        }
        return rtuAddrBCD + rtuAddrStr ;
    }
    /**
     * åˆ†æžåŠŸèƒ½ç 
     * @param bs ä¸Šè¡Œå­—节数组
     * @return åŠŸèƒ½ç 
     */
    public String parseCode(byte[] bs){
        return ByteUtil.bytes2Hex(bs, false, ProtocolConstantV206V202404.codeIndex, 1) ;
    }
    /**
     * æ ¡éªŒå’Œæ£€æŸ¥
     * @param bs  ä¸Šè¡Œå­—节数组
     * @return é€šè¿‡null,未通过返回原因
     * @throws Exception å¼‚常
     */
    public String checkCrc_str(byte[] bs) throws Exception {
        byte crcCompute = (byte)new CRC8_for_2_0().CRC8(bs, ProtocolConstantV206V202404.ctrlIndex, bs.length - 3) ;
        byte crcInBs = bs[bs.length - 2] ;
        if(crcCompute == crcInBs){
            return null ;
        }else{
            return "计算CRC是:" + crcCompute + ",上传CRC是" + crcInBs ;
        }
    }
    /*
    æž„造控制域
    D7                  D6                  D5~D4            D3~D0
    ä¼ è¾“方向位 DIR        æ‹†åˆ†æ ‡å¿—位 DIV       å¸§è®¡æ•°ä½ FCB       åŠŸèƒ½ç 
    1、传输方向位(DIR)
       DIR=0:表示此帧文是由中心站发出的下行报文。
       DIR=1:表示此帧文是由终端站发出的上行报文。
       æ¯å¸§æŠ¥æ–‡çš„通信过程中是不变的。
    2、拆分标志位(DIV)
       DIV=1:表示此报文已被拆分为若干帧,接收后需要拼接。此时控制域后增加一个字节,为拆分帧记数DIVS,采用BIN倒计数(255-1),1表示最后一帧数据。启动站发送时自动加上发送,从动站返帧时对应加上确认。
       DIV=0:表示此帧报文为单帧。
    3、帧计数位(FCB):
       FCB表示每个站连续的发送/确认或请求/响应服务的变化位。FCB位用来防止信息传输的丢失和重复。
       å¯åŠ¨ç«™å‘åŒä¸€ä»ŽåŠ¨ç«™ä¼ è¾“æ–°çš„å‘é€/确认或请求/响应传输报务时,启动站将设置FCB值,若超时未到从站的报文,或接收出现差错,则启动站将FCB减1,重复原来的发送/确认或请求/响应服务,直到FCB减为0,表示本次传输服务失败。
       ä»ŽåŠ¨ç«™æ”¶åˆ°å¯åŠ¨ç«™FCB值不为0的报文并按照要求确认或响应时,应返回相应的FCB值。
    */
    public byte createCtrl(byte dir, byte funcCode){
        byte b = dir;//DIR = 1(0x80),表示此帧报文是由终端发出的上行报文;
        b = (byte)(b | funcCode) ;
        //DIV = 1(0x40),表示此报文已被拆分为若干帧
        //FCB = 1(0x08),表示只发一次
        b = (byte)(b |0x08) ;
        //DIR = 0 ä¸‹è¡Œï¼Œåˆ™åŠŸèƒ½ç é‡‡ç”¨0
        return b ;
    }
    /**
     * å¾—到关开阀类型名称
     * @param type å­—节
     * @return åç§°
     */
    public static String openCloseValveType(byte type){
        return switch (type) {
            case 1 -> "刷卡开阀";
            case 2 -> "刷卡关阀";
            case 3 -> "中心站开阀";
            case 4 -> "中心站关阀";
            case 5 -> "欠费关阀";
            case 6 -> "流量计故障关阀";
            case 7 -> "紧急关阀";
            case 8 -> "用户远程开阀";
            case 9 -> "用户远程关阀";
            case 16 -> "管道无水自动关阀";
            default -> "未知";
        };
    }
    /*
     * åˆ†æžç‰ˆæœ¬å·
     * @param bs  ä¸Šè¡Œå­—节数组
     * @return ç‰ˆæœ¬å·
     * @throws Exception å¼‚常
    public String parseVersion(byte[] bs)throws Exception{
        short ver = ByteUtilUnsigned.byte2Byte(bs, ProtocolConstantV206V202404.versionIndex) ;
        char[] cs = ("" + ver).toCharArray() ;
        StringBuilder vs = new StringBuilder() ;
        for(byte i = 0 ; i < cs.length; i++){
            if(i == 0){
                vs.append(cs[i]) ;
            }else{
                vs.append(".").append(cs[i]) ;
            }
        }
        return vs.toString() ;
    }
    */
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DataAlarmVo.java
New file
@@ -0,0 +1,28 @@
package com.dy.common.mw.protocol.p206V202404;
import lombok.Data;
@Data
public class DataAlarmVo {
    public Byte batteryVolt ;// è“„电池电压
    public Byte loss ;//漏损
    public Byte meter ;//仪表
    public Byte valve ;//阀门
    public String toString(){
        StringBuilder str = new StringBuilder() ;
        str.append("      æŠ¥è­¦:\n");
        str.append("         è“„电池电压:");
        str.append(batteryVolt==null?"":(batteryVolt==1?"报警":"正常"));
        str.append("\n");
        str.append("         æ¼æŸï¼š");
        str.append(loss==null?"":(loss==1?"报警":"正常"));
        str.append("\n");
        str.append("         ä»ªè¡¨ï¼š");
        str.append(meter==null?"":(meter==1?"报警":"正常"));
        str.append("\n");
        str.append("         é˜€é—¨ï¼š");
        str.append(valve==null?"":(valve==1?"报警":"正常"));
        return str.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DataStateVo.java
New file
@@ -0,0 +1,24 @@
package com.dy.common.mw.protocol.p206V202404;
import lombok.Data;
@Data
public class DataStateVo  {
    public Byte icCard;// IC卡功能
    public Byte working;//工作状态
    public Byte valve ;//阀门
    public String toString(){
        StringBuilder str = new StringBuilder() ;
        str.append("      çŠ¶æ€:\n");
        str.append("         IC å¡åŠŸèƒ½ï¼š");
        str.append(icCard ==null?"":(icCard ==1?"有效":"无效"));
        str.append("\n");
        str.append("         å·¥ä½œçŠ¶æ€ï¼š");
        str.append(working ==null?"":(working ==1?"启动":"停止"));
        str.append("\n");
        str.append("         é˜€é—¨çŠ¶æ€ï¼š");
        str.append(valve==null?"":(valve==1?"打开":"关闭"));
        return str.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DataV202404.java
New file
@@ -0,0 +1,25 @@
package com.dy.common.mw.protocol.p206V202404;
import lombok.Data;
@Data
public class DataV202404 implements java.io.Serializable{
    private static final long serialVersionUID = 202404280919001L;
    public String rtuAddr ;//RtuAddr
    public Object subData ;
    public String dt ;//通信中间件产生收报时间(yyyy-MM-dd hh:mm:ss)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("   æŽ§åˆ¶å™¨åœ°å€ : " + (rtuAddr==null?"":rtuAddr) + "\n") ;
        sb.append("   ç»ˆç«¯æ•°æ®:\n") ;
        if(subData != null){
            sb.append(subData.toString()) ;
        }
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/DriverV202404.java
New file
@@ -0,0 +1,155 @@
package com.dy.common.mw.protocol.p206V202404;
import com.dy.common.mw.protocol.*;
import com.dy.common.util.DateTime;
import java.net.URI;
import java.net.URL;
@AnnotationDriver(name= ProtocolConstantV206V202404.protocolName)
public class DriverV202404 extends Driver {
    private static String scanRootPackage = "com.dy.common.mw.protocol.p206V202404." ;
    //在Driver中是单例,随Driver的单例对象在单线程中运行
    private ParseParamsForUpV202404 upCpParams ;
    private ParseParamsForDownV202404 downCpParams ;
    private Boolean reportOrResponse_trueOrFalse = null ;
    private String rtuAddrInData = null ;
    public DriverV202404(){
        upCpParams = new ParseParamsForUpV202404() ;
        downCpParams = new ParseParamsForDownV202404() ;
    }
    /**
     * æ‰«æè¯†åˆ«åŠŸèƒ½ç æ³¨è§£ç±»
     */
    @Override
    public void scanAnnotationCode() throws Exception{
        if(!scanRootPackage.endsWith(".")){
            scanRootPackage += "." ;
        }
        URL url = this.getClass().getResource("/" + scanRootPackage.replace('.', '/'));
        URI uri = new URI(url.toString());
        super.doScanAnnotationCode(this, ProtocolConstantV206V202404.protocolName, uri, scanRootPackage) ;
    }
    /**
     * è§£æžä¸Šè¡Œæ•°æ®
     * @param isLowPower æ˜¯å¦åœ¨ä½ŽåŠŸè€—çŽ¯å¢ƒä¸‹è¿è¡Œ
     * @param rtuAddr
     * @param upBuffer
     * @param callback
     * @param upHex
     * @return
     */
    @Override
    public MidResult[] parseData(Boolean isLowPower, String rtuAddr, byte[] upBuffer, String upHex, DriverParserDataCallback callback, Object... params) {
        reportOrResponse_trueOrFalse = null ;
        boolean isFail = false ;
        String upCode = null ;
        try{
            CommonV202404 cp = new CommonV202404() ;
            cp.checkHead(upBuffer) ;
            cp.checkTail(upBuffer) ;
            String crcStr = cp.checkCrc_str(upBuffer) ;
            if(crcStr != null){
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,上行数据CRC检查失败," + crcStr, null))} ;
            }
            rtuAddr = cp.parseRtuAddr(upBuffer) ;
            upCode = cp.parseCode(upBuffer) ;
            if(upCode == null){
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,未能从上行数据中解析出功能码!", null))} ;
            }
            //Integer dataLen = cp.parseFrameLen(upBuffer) ;
            Data upData = new Data() ;
            upData.setRtuAddr(rtuAddr) ;
            upData.setProtocol(ProtocolConstantV206V202404.protocolName);
            upData.setCode(upCode) ;
            upData.setHex(upHex) ;
            DataV202404 dV1_0_1 = new DataV202404() ;
            //dV1_0_1.version = cp.parseVersion(upBuffer) ;
            dV1_0_1.rtuAddr = rtuAddr ;
            dV1_0_1.dt = DateTime.yyyy_MM_dd_HH_mm_ss() ;
            upData.setSubData(dV1_0_1) ;
            this.upCpParams.clear();
            this.upCpParams.setValue(ProtocolConstantV206V202404.protocolName,
                    rtuAddr,
                    upCode,
                    upHex,
                    upBuffer,
                    upData);
            CodeParse codeParse = this.getUpCodeParser(upCode) ;
            if(codeParse == null){
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,未能得到上行数据功能码" + upCode + "处理类!", null))} ;
            }else{
                return codeParse.parse(isLowPower, this.upCpParams, new CodeParseCallback(){
                    @Override
                    public void callback(Boolean flag) {
                        reportOrResponse_trueOrFalse = flag ;
                        rtuAddrInData = dV1_0_1.getRtuAddr() ;
                    }
                });
            }
        } catch (Exception e) {
            isFail = true ;
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr, "严重错误,分析Rtu数据出错!数据为:" + upHex + (e.getMessage() == null?"":(",出错信息:" + e.getMessage())), e))} ;
        } finally{
            callback.callback(rtuAddr, upCode, upHex, reportOrResponse_trueOrFalse, isFail, rtuAddrInData);
        }
    }
    /**
     * æž„造下行数据(命令)
     * @param isLowPower æ˜¯å¦åœ¨ä½ŽåŠŸè€—çŽ¯å¢ƒä¸‹è¿è¡Œ
     * @param command å‘½ä»¤
     * @return
     */
    @Override
    public MidResult[] createCommand(Boolean isLowPower, Command command, Object... params) {
        String RtuResultSendWebUrl = command.getRtuResultSendWebUrl() ;
        if(RtuResultSendWebUrl == null || RtuResultSendWebUrl.trim().equals("")){
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, null, "严重错误,命令中rtu返回命令结果发向目的地web URL为空,不能构建任何命令!", null))} ;
        }
        String rtuAddr = command.getRtuAddr() ;
        if(rtuAddr == null || rtuAddr.trim().equals("")){
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, null, "严重错误,命令中Rtu地址为空,不能构建任何命令!", null))} ;
        }
        try {
            String commandCode = command.getCode() ;
            this.downCpParams.clear();
            this.downCpParams.setValue(
                    RtuResultSendWebUrl,
                    ProtocolConstantV206V202404.protocolName,
                    rtuAddr,
                    command.getId(),
                    commandCode,
                    command.getParam(),
                    command.getAttachment());
            if(commandCode == null){
                return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr,  "严重错误,命令中功能码为空,不能构建任何命令!", null))} ;
            }else{
                CodeParse codeParse = this.getDownCodeParser(commandCode) ;
                if(codeParse == null){
                    return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr,  "严重错误,未能得到下行数据功能码" + commandCode + "处理类!", null))} ;
                }else{
                    return codeParse.parse(isLowPower, this.downCpParams, null);
                }
            }
        } catch (Exception e) {
            return new MidResult[]{(new MidResultError(ProtocolConstantV206V202404.protocolName, rtuAddr,  "严重错误,构造下行数据出错!命令为:" + command.toString(), e))} ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/OnLineV202404.java
New file
@@ -0,0 +1,39 @@
package com.dy.common.mw.protocol.p206V202404;
import com.dy.common.mw.protocol.AnnotationOnLine;
import com.dy.common.mw.protocol.OnLine;
@AnnotationOnLine(
        protocolName = ProtocolConstantV206V202404.protocolName,
        priority = ProtocolConstantV206V202404.priority)
@SuppressWarnings("unused")
public class OnLineV202404 implements OnLine{
    /**
     * å¯¹ä¸Šçº¿æ•°æ®è¿›è¡Œåˆ†æž
     * @param upBuf ä¸Šè¡Œæ•°æ®
     * @return
     */
    @Override
    public OnLineResult parse(byte[] upBuf)throws Exception {
        OnLineResult olr = new OnLineResult() ;
        CommonV202404 cp = new CommonV202404() ;
        Boolean flag = cp.isThisProtocolHead(upBuf) ;
        if(flag == null){
            //出错
            olr.result = OnLine.OnLineAction_fail ;
            olr.rtuAddr = null ;
        }else if(!flag.booleanValue()){
            //不是本协议数据
            olr.result = OnLine.OnLineAction_success_noMe ;
            olr.rtuAddr = null ;
        }else{
            //是本协议数据
            olr.result = OnLine.OnLineAction_success ;
            olr.rtuAddr = cp.parseRtuAddr(upBuf) ;
            olr.protocolName = ProtocolConstantV206V202404.protocolName ;
        }
        return olr;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ParseParamsForDownV202404.java
New file
@@ -0,0 +1,43 @@
package com.dy.common.mw.protocol.p206V202404;
import com.dy.common.mw.protocol.CodeParseParams;
public class ParseParamsForDownV202404 implements CodeParseParams{
    public String rtuResultSendWebUrl ;//rtu返回命令结果 å‘向目的地web URL
    public String protocolName ;
    public String rtuAddr ;//控制器地址
    public String commandId ;
    public String commandCode ;
    public Object param ;
    public Object attachment ;
    public ParseParamsForDownV202404(){}
    public void clear(){
        this.protocolName = null ;
        this.rtuAddr = null ;
        this.commandId = null ;
        this.commandCode = null ;
        this.param = null ;
        this.attachment = null ;
    }
    public void setValue(
            String rtuResultSendWebUrl,
            String protocolName,
            String rtuAddr,
            String commandId,
            String commandCode,
            Object param,
            Object attachment ){
        this.rtuResultSendWebUrl = rtuResultSendWebUrl ;
        this.protocolName = protocolName ;
        this.rtuAddr = rtuAddr ;
        this.commandId = commandId ;
        this.commandCode = commandCode ;
        this.param = param ;
        this.attachment = attachment ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ParseParamsForUpV202404.java
New file
@@ -0,0 +1,39 @@
package com.dy.common.mw.protocol.p206V202404;
import com.dy.common.mw.protocol.CodeParseParams;
import com.dy.common.mw.protocol.Data;
public class ParseParamsForUpV202404 implements CodeParseParams{
    public String protocolName ;//协议名称
    public String rtuAddr ;//控制器址
    public String upCode ;//上行报文数据中的功能码
    public String upHex ;//行报文数据十六进制形式
    public byte[] upBuffer ;//行报文数据字节数组
    public Data data ;//解析后的数据
    public ParseParamsForUpV202404(){}
    public void clear(){
        this.protocolName = null ;
        this.rtuAddr = null ;
        this.upCode = null ;
        this.upHex = null ;
        this.upBuffer = null ;
        this.data = null ;
    }
    public void setValue(String protocolName,
            String rtuAddr,
            String upCode,
            String upHex,
            byte[] upBuffer,
            Data data){
        this.protocolName = protocolName ;
        this.rtuAddr = rtuAddr ;
        this.upCode = upCode ;
        this.upHex = upHex ;
        this.upBuffer = upBuffer ;
        this.data = data ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/PrefixedDataAvailableV202404.java
New file
@@ -0,0 +1,130 @@
package com.dy.common.mw.protocol.p206V202404;
import com.dy.common.mw.channel.tcp.PrefixedDataAvailableStatus;
import com.dy.common.mw.protocol.AnnotationPrefixedDataAvailable;
import com.dy.common.mw.protocol.PrefixedDataAvailable;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.mina.core.buffer.BufferDataException;
import org.apache.mina.core.buffer.IoBuffer;
@AnnotationPrefixedDataAvailable(
        protocolName = ProtocolConstantV206V202404.protocolName,
        priority = ProtocolConstantV206V202404.priority,
        onLineDataMinLength = ProtocolConstantV206V202404.onLineDataMinLength,
        headMinLength = ProtocolConstantV206V202404.headMinLength)
@SuppressWarnings("unused")
public class PrefixedDataAvailableV202404 implements PrefixedDataAvailable {
    private static final Logger log = LogManager.getLogger(PrefixedDataAvailableV202404.class) ;
    private static final String protocolName = ProtocolConstantV206V202404.protocolName ;
    /**
     * åˆ†æžä¸Šçº¿æ•°æ®(网络连接后第一包数据)是否可获得
     * @param in IoBuffer
     * @param remain ä¸€å®šæ—¶å¤§äºŽ0的数据
     * @param minDataLength æœ€å°æ•°æ®é•¿åº¦
     * @param maxDataLength æœ€å¤§æ•°æ®é•¿åº¦ï¼Œè¾¾åˆ°æˆ–超过此长度,认为是垃圾数据。例如:数据头部是正确的,但合法数据结尾总不出现,认为此数据垃圾数据
     * @return ä¸æ˜¯æœ¬åè®®æ•°æ®æ—¶è¿”回空
     * @throws Exception å¼‚常
     */
    public PrefixedDataAvailableStatus forOnLine(IoBuffer in,
            int remain,
            int minDataLength, //对应ProtocolConstantV2_0.onLineDataMinLength
            int maxDataLength //对应ProtocolConstant.errorMaxLength
            ) throws Exception {
        int oldPosition = in.position() ;
        byte[] preByte = new byte[remain];
        in.get(preByte) ;
        //in.position(0) ;//错误用法,如果发生粘包数据,将会死循环
        in.position(oldPosition) ;
        return this.doForData(preByte, minDataLength, maxDataLength) ;
    }
    /**
     * åˆ†æžä¸Šçº¿åŽ(网络连接后非第一包数据)是否可获得
     * @param in IoBuffer
     * @param remain  å‰©ä½™
     * @param minDataLength æœ€å°æ•°æ®é•¿åº¦
     * @param maxDataLength æœ€å¤§æ•°æ®é•¿åº¦
     * @return PrefixedDataAvailableStatus
     * @throws Exception å¼‚常
     */
    @Override
    public PrefixedDataAvailableStatus forUpData(IoBuffer in,
            int remain,
            int minDataLength,
            int maxDataLength) throws Exception {
        int oldPosition = in.position() ;
        byte[] preByte = new byte[remain];
        in.get(preByte) ;
        //in.position(0) ;//错误用法,如果发生粘包数据,将会死循环
        in.position(oldPosition) ;
        return this.doForData(preByte, minDataLength, maxDataLength) ;
    }
    /**
     * è¿›è¡Œåˆ¤æ–­
     * @param preByte byte[]
     * @param minDataLength æœ€å°æ•°æ®é•¿åº¦
     * @param maxDataLength æœ€å¤§æ•°æ®é•¿åº¦
     * @return PrefixedDataAvailableStatus
     * @throws Exception å¼‚常
     */
    private PrefixedDataAvailableStatus doForData(byte[] preByte, int minDataLength, int maxDataLength) throws Exception{
        int remain = preByte.length ;
        if (remain < minDataLength) {
            log.warn("基于协议(" + protocolName + ")判断数据头部发生断包现象。") ;
            return new PrefixedDataAvailableStatus().breaked() ;
        }
        if(remain >= maxDataLength){
            //超出了最大长度限制,例如:数据头部是正确的,但合法数据结尾总不出现,认为此数据垃圾数据
            return new PrefixedDataAvailableStatus().rubbish(remain) ;
        }
        CommonV202404 parseCommon = new CommonV202404();
        boolean isThisProtocolData = parseCommon.isThisProtocolHead(preByte) ;
        if(!isThisProtocolData){
            //不是本协议数据
            return null ;
        }
        Integer frameLen = parseCommon.parseFrameLen(preByte) ;
        if(frameLen == null){
            String headHex = ByteUtil.bytes2Hex(preByte, true) ;
            throw new BufferDataException("收到数据之帧前部:" + headHex + ",但严重错误,在进行断包与粘包检查时,未能得到数据帧的长度。");
        }
        if (frameLen <= 0 || frameLen > maxDataLength) {
            String headHex = ByteUtil.bytes2Hex(preByte, true) ;
            throw new BufferDataException("收到数据之帧前部:" + headHex + ",但严重错误,在进行断包与粘包检查时,数据帧的长度(" + frameLen + ")超出合法范围。");
        }
        if(remain == frameLen){
            //不断不粘
            return new PrefixedDataAvailableStatus().completed(frameLen) ;
        }else if(remain > frameLen){
            String headHex = ByteUtil.bytes2Hex(preByte, true) ;
            log.warn("收到数据之帧前部:" + headHex + ",但发生粘包现象。") ;
            return new PrefixedDataAvailableStatus().adjoined(frameLen) ;
        }else{
            // remain < dataLen
            String headHex = ByteUtil.bytes2Hex(preByte, true) ;
            log.warn("收到数据之帧前部:" + headHex + ",但发生断包现象。") ;
            return new PrefixedDataAvailableStatus().breaked() ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/ProtocolConstantV206V202404.java
New file
@@ -0,0 +1,50 @@
package com.dy.common.mw.protocol.p206V202404;
public class ProtocolConstantV206V202404 {
    public static final String version = "202404" ;
    /**
     * æ³¨è§£ç›¸å…³
     */
    public static final String protocolName = "p206V202404" ;
    public static final int priority = 1 ;//优先级
    /**
     * RTU上线数据(上线后第一包数据)最小长度,设置该属性以备进行完整性检查,
     * å³æ–­åŒ…检查,使尽可能收全上线数据(取值范围1-100)
     */
    public static final int onLineDataMinLength = 13 ;//采用心跳上行数据长度
    /**
     * RTU上报数据的头部最小长度,上报数据中,取这个最小长度的部分数据中,
     * è¦ä¸€å®šåŒ…含数据帧长度,以备取出数据帧长度来,进行完整性检查,
     * å³æ–­åŒ…与粘包检查(取值范围0-100,其中取值为0时,表示headMinLength数据无作用,由协议实现来控制)
     */
    public static final int headMinLength = 3 ;
    //帧起始
    public static final byte P_Head_Byte = (byte)0x68 ;
    public static final byte P_Tail_Byte = (byte)0x16 ;
    //00H时遥测终端在兼容工作状态;01H时遥测终端在自报工作状态;02H时遥测终端在查询/应答工作状态;03H时遥测终端在调试/维修状态。
    public static final byte P_Default_mode = (byte)0x00 ;//默认工作模式
    public static final String P_Head_Hex = "68" ;
    public static final String P_Tail_Hex = "16" ;
    public static final byte lenHead2ctrl = 3 ; //从头到控制域(不包括)字节数组长度
    public static final byte lenHead2Code = 13 ; //从头到功能码(包括)字节数组长度
    public static final byte lenTail = 2 ; //帧尾部字节数组长度
    /**
     * æ‰€åœ¨å­—节数组的位置(下标)
     */
    public static final int dataLenIndex = 1 ;//帧长度所在 å­—节数组下标
    public static final int ctrlIndex = 3 ;//控制域所在字节数组下标
    public static final int rtuAddr1Index_start = 4 ;//控制器地址 å­—节数组开始下标
    public static final int rtuAddr1Index_end = 9 ;//控制器地址 å­—节数组开始下标
    public static final int rtuAddr2Index_start = 10 ;//控制器地址 å­—节数组截止下标
    public static final int rtuAddr2Index_end = 11 ;//控制器地址 å­—节数组截止下标
    public static final int codeIndex = 12 ;//功能码字节数组下标
    public static final int dataIndex = 13 ;//具体数据字节数组下标
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd10Vo.java
New file
@@ -0,0 +1,10 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd10Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public String rtuNewAddr ;//控制器新地址
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd15Vo.java
New file
@@ -0,0 +1,14 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd15Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public String icCardAddr ;//IC卡地址(8位数字或字母)
    public String icCardNo ;//用户卡序列号(16位数字)(6字节BCD,2字节HEX)
    public Double chargeMoney ;//单位:元  2位小数点(最大值 99999999.99)
    public Double chargeWater ;//单位:m3  2位小数点(最大值 99999999.99)
    public String flowNo ;//流水号(12位数字)
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd16Vo.java
New file
@@ -0,0 +1,11 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd16Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public Integer waterAlarm ;//剩余水量报警值,单位:m3。整数,取值范围0~65535
    public Integer moneyAlarm ;//剩余金额报警值,单位:元。整数,取值范围0~65535
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd50Vo.java
New file
@@ -0,0 +1,9 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd50Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd55Vo.java
New file
@@ -0,0 +1,10 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd55Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public Integer page ;//分页(取值范围1、2、3、4、5、6、7、8、9)
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd56Vo.java
New file
@@ -0,0 +1,9 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd56Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd5BVo.java
New file
@@ -0,0 +1,9 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd5BVo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd5CVo.java
New file
@@ -0,0 +1,10 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd5CVo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public Integer page ;//分页(取值范围1、2、3、4、5、6、7、8、9)
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd65Vo.java
New file
@@ -0,0 +1,10 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd65Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public Integer page ;//分页,取值范围(1、2、3、4、5、6、7、8、9)
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd97Vo.java
New file
@@ -0,0 +1,9 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd97Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/downVos/ComCd98Vo.java
New file
@@ -0,0 +1,9 @@
package com.dy.common.mw.protocol.p206V202404.downVos;
import lombok.Data;
@Data
public class ComCd98Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_02_Down.java
New file
@@ -0,0 +1,83 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd02Vo;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_02
})
public class Cd_02_Down implements CodeParse {
    //private static Logger log = LogManager.getLogger(Cd_02_Down.class);
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = false ;//是否有应答
        midRs.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = true ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            DataCd02Vo cdData = (DataCd02Vo)para.param ;
            byte[] bs = new byte[3] ;
            bs[0] = (byte)(Integer.parseInt(cdData.controllerType, 16));
            bs[1] = cdData.projectNo.byteValue() ;
            bs[2] = (byte)(Integer.parseInt(cdData.getStatus(), 16));
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
    public static void main(String[] args) throws Exception{
        ParseParamsForDownV202404 p = new ParseParamsForDownV202404() ;
        p.commandCode = "02" ;
        p.rtuAddr = "9672950001";
        Cd_02_Down obj = new Cd_02_Down() ;
        byte[] bs = obj.doParse(p) ;
        String hex1 = ByteUtil.bytes2Hex(bs,true) ;
        String hex2 = ByteUtil.bytes2Hex(bs,false) ;
        System.out.println(hex1);
        System.out.println(hex2);
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_02_Up.java
New file
@@ -0,0 +1,92 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd02Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_02
})
@SuppressWarnings("unused")
public class Cd_02_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_02_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = true ;
        String confirmComCode = para.upCode ;
        ParseParamsForDownV202404 downCpParams  = new ParseParamsForDownV202404() ;
        downCpParams.setValue(
                null,
                ProtocolConstantV206V202404.protocolName,
                para.rtuAddr,
                Command.defaultId,
                confirmComCode,
                para.data.subData==null?null:(((DataV202404)para.data.subData).subData),
                null);
        //构造应答
        byte[] data = new Cd_02_Down().doParse(downCpParams) ;
        MidResultToRtu confirmCommand = new MidResultToRtu() ;
        confirmCommand.protocolName = para.protocolName ;//协议名称
        confirmCommand.rtuAddr = para.rtuAddr ;//Rtu地址
        confirmCommand.commandId = Command.defaultId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        confirmCommand.downCode = confirmComCode ;//下行命令功能码;
        confirmCommand.downBuffer = data ;//下行命令数据
        confirmCommand.downBufHex = ByteUtil.bytes2Hex(data, true) ;//下行命令数据十六进制形式
        confirmCommand.hasResponse = false ;//是否有应答
        confirmCommand.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发2次),如果不设置,命令缓存器进行补充设置
        confirmCommand.isCachForOffLine = false ;//RTU不在线,命令是否缓存
        confirmCommand.isSendFirst = true ;//确认命令,优先发送
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            confirmCommand.isQuickSend = true ;
        }
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs, confirmCommand} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd02Vo cdData = new DataCd02Vo() ;
        dV1.subData = cdData ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, ProtocolConstantV206V202404.dataIndex, 1) ;
        cdData.projectNo = 0 + bs[ProtocolConstantV206V202404.dataIndex + 1];
        cdData.status = ByteUtil.bytes2Hex(bs, false, ProtocolConstantV206V202404.dataIndex + 2, 1) ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_10_Down.java
New file
@@ -0,0 +1,87 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd10Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_10
})
public class Cd_10_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd10Vo cvo = JSON.parseObject(json, ComCd10Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd10Vo为null") ;
            }
            byte[] bs = new byte[17] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            index ++ ;
            GlCreate.createRtuAddr(cvo.rtuNewAddr, bs, index);
            index += 8 ;
            GlCreate.createPw(bs, index);
            index ++ ;
            GlCreate.createS2D(bs, index) ;
            index += 4 ;
            bs[index] = 0 ; //时延
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_10_Up.java
New file
@@ -0,0 +1,69 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd10Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_10
})
@SuppressWarnings("unused")
public class Cd_10_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_10_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd10Vo cdData = new DataCd10Vo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        cdData.rtuNewAddr = new CommonV202404().parseRtuAddr(bs, index) ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_15_Down.java
New file
@@ -0,0 +1,145 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd10Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd15Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.NumUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_15
})
public class Cd_15_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd15Vo cvo = JSON.parseObject(json, ComCd15Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd15Vo为null") ;
            }
            if(cvo.icCardAddr.length() != 8){
                throw new Exception("IC卡地址必须是8位数字或字母") ;
            }
           if(!NumUtil.isPlusIntNumber(cvo.flowNo)){
                throw new Exception("流水号必须是12位数字") ;
            }
            if(cvo.flowNo.length() != 12){
                throw new Exception("流水号必须是12位数字") ;
            }
            byte[] bs = new byte[17] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            index ++ ;
            GlCreate.createIcCardAddr(cvo.icCardAddr, bs, index);
            index += 4 ; ;
            GlCreate.createIcCardNo(cvo.icCardNo, bs, index);
            index += 8 ;
            if(cvo.chargeMoney != null){
                String chargeMoney = "" + (Double.valueOf(cvo.chargeMoney * 100)).longValue() ;
                byte[] bTemp = ByteUtil.string2BCD_LE(chargeMoney) ;
                int bTempLen = bTemp.length ;
                int count = 0 ;
                for(int i = 0 ; i < bTempLen; i++){
                    bs[index++] = bTemp[i] ;
                    count ++ ;
                    if(count >= 5){
                        break ;
                    }
                }
                for(; count < 5; count++){
                    bs[index++] = 0 ;
                }
            }else{
                for(int i = 0 ; i < 5; i++){
                    bs[index++] = 0 ;
                }
            }
            if(cvo.chargeMoney != null){
                String chargeMoney = "" + (Double.valueOf(cvo.chargeWater * 100)).longValue() ;
                byte[] bTemp = ByteUtil.string2BCD_LE(chargeMoney) ;
                int bTempLen = bTemp.length ;
                int count = 0 ;
                for(int i = 0 ; i < bTempLen; i++){
                    bs[index++] = bTemp[i] ;
                    count ++ ;
                    if(count >= 5){
                        break ;
                    }
                }
                for(; count < 5; count++){
                    bs[index++] = 0 ;
                }
            }else{
                for(int i = 0 ; i < 5; i++){
                    bs[index++] = 0 ;
                }
            }
            ByteUtil.string2BCD_BE(bs, cvo.flowNo, index) ;
            index += 6 ;
            GlCreate.createPw(bs, index);
            index ++ ;
            GlCreate.createS2D(bs, index) ;
            index += 4 ;
            bs[index] = 0 ; //时延
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_15_Up.java
New file
@@ -0,0 +1,75 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd15Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd50Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_15
})
@SuppressWarnings("unused")
public class Cd_15_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_15_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;//主动上报
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd15Vo cdData = new DataCd15Vo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        byte result = bs[index];
        if(result == 1){
            cdData.success = true ;
        }else{
            cdData.success = false ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_16_Down.java
New file
@@ -0,0 +1,100 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd16Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import com.dy.common.util.NumUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_16
})
public class Cd_16_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd16Vo cvo = JSON.parseObject(json, ComCd16Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd16Vo为null") ;
            }
            if(cvo.moneyAlarm < 0 || cvo.moneyAlarm > 65535){
                throw new Exception("剩余金额报警值必须是0~65535范围内的整数") ;
            }
            if(cvo.waterAlarm < 0 || cvo.waterAlarm > 65535){
                throw new Exception("剩余水量报警值必须是0~65535范围内的整数") ;
            }
            byte[] bs = new byte[13] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            index ++ ;
            ByteUtilUnsigned.short2Bytes_BE(bs, cvo.waterAlarm, index);
            index ++ ;
            ByteUtilUnsigned.short2Bytes_BE(bs, cvo.moneyAlarm, index);
            index ++ ;
            GlCreate.createPw(bs, index);
            index ++ ;
            GlCreate.createS2D(bs, index) ;
            index += 4 ;
            bs[index] = 0 ; //时延
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_50_Down.java
New file
@@ -0,0 +1,76 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd10Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd50Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_50
})
public class Cd_50_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd50Vo cvo = JSON.parseObject(json, ComCd50Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd10Vo为null") ;
            }
            byte[] bs = new byte[2] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_50_Up.java
New file
@@ -0,0 +1,69 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd50Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_50
})
@SuppressWarnings("unused")
public class Cd_50_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_50_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;//主动上报
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd50Vo cdData = new DataCd50Vo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        cdData.rtuAddr = new CommonV202404().parseRtuAddr(bs, index) ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_55_Down.java
New file
@@ -0,0 +1,82 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd55Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd65Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_55
})
public class Cd_55_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd55Vo cvo = JSON.parseObject(json, ComCd55Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd55Vo为null") ;
            }
            if(cvo.page < 1 || cvo.page > 8){
                throw new Exception("ComCd55Vo的page取值不正确,正确取值范围是(1~9)") ;
            }
            byte[] bs = new byte[3] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            index ++ ;
            bs[index] = cvo.page.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_55_Up.java
New file
@@ -0,0 +1,136 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd55Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_55
})
@SuppressWarnings("unused")
public class Cd_55_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_55_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        Integer projectNo = 0 + bs[index];
        index++ ;
        byte hasRecord = bs[index];
        if(hasRecord == 1){
            //有记录
            List<DataCd55Vo> list = new ArrayList<>() ;
            DataCd55Vo vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ;
            while(vo != null){
                index += 39 ;
                list.add(vo) ;
                vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ;
            }
            dV1.subData = list ;
        }else{
            //无记录
        }
    }
    private DataCd55Vo doParseData(byte[] bs, int index, int bsLen, String controllerType,Integer projectNo) throws Exception{
        //每条数据占39字节
        if(bsLen - index > 35){
            DataCd55Vo cdData = new DataCd55Vo() ;
            cdData.controllerType = controllerType ;
            cdData.projectNo = projectNo ;
            cdData.icCardAddr = ByteUtil.bytes2Hex(bs, false, index, 4) ;
            index += 4 ;
            cdData.icCardNo  = GlParse.parseIcCardNo(bs, index, 6, 2) ;
            index += 8 ;
            int chargeMoney = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
            cdData.chargeMoney = chargeMoney/100.0D;
            index += 5 ;
            int chargeWater = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
            cdData.chargeWater = chargeWater/100.0D;
            index += 5 ;
            cdData.flowNo = ByteUtil.BCD2String_BE(bs, index, index + 5) ;
            index += 6 ;
            byte flag = bs[index] ;
            if(flag == 1){
                cdData.success = true ;
            }else{
                cdData.success = false ;
            }
            index += 1 ;
            String ss = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String mm = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String HH = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String dd = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String MM = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String yy = ByteUtil.BCD2String_BE(bs, index, index) ;
            cdData.dt = "20" + yy + "-" + MM + "-" + dd + " " + HH + ":" + mm  + ":" + ss ;
            return cdData ;
        }else{
            return null ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_56_Down.java
New file
@@ -0,0 +1,76 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd55Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd56Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_56
})
public class Cd_56_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd56Vo cvo = JSON.parseObject(json, ComCd56Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd56Vo为null") ;
            }
            byte[] bs = new byte[2] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_56_Up.java
New file
@@ -0,0 +1,74 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd50Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd56Vo;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_56
})
@SuppressWarnings("unused")
public class Cd_56_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_56_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;//主动上报
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd56Vo cdData = new DataCd56Vo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        cdData.waterAlarm = ByteUtilUnsigned.bytes2Short_BE(bs, index) ;
        index += 2 ;
        cdData.moneyAlarm = ByteUtilUnsigned.bytes2Short_BE(bs, index) ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5B_Down.java
New file
@@ -0,0 +1,76 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd50Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd5BVo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_5B
})
public class Cd_5B_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd5BVo cvo = JSON.parseObject(json, ComCd5BVo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd5BVo为null") ;
            }
            byte[] bs = new byte[2] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5B_Up.java
New file
@@ -0,0 +1,65 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd50Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd5BVo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_5B
})
@SuppressWarnings("unused")
public class Cd_5B_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_5B_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd5BVo cdData = new DataCd5BVo() ;
        dV1.subData = cdData ;
        GlParse.parseCd80And5B(bs, cdData);
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5C_Down.java
New file
@@ -0,0 +1,81 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd55Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_5C
})
public class Cd_5C_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd55Vo cvo = JSON.parseObject(json, ComCd55Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd55Vo为null") ;
            }
            if(cvo.page < 1 || cvo.page > 8){
                throw new Exception("ComCd55Vo的page取值不正确,正确取值范围是(1~9)") ;
            }
            byte[] bs = new byte[3] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            index ++ ;
            bs[index] = cvo.page.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_5C_Up.java
New file
@@ -0,0 +1,118 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd5CVo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_5C
})
@SuppressWarnings("unused")
public class Cd_5C_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_5C_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        Integer projectNo = 0 + bs[index];
        index++ ;
        byte hasRecord = bs[index];
        if(hasRecord == 1){
            //有记录
            List<DataCd5CVo> list = new ArrayList<>() ;
            DataCd5CVo vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ;
            while(vo != null){
                index += 39 ;
                list.add(vo) ;
                vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ;
            }
            dV1.subData = list ;
        }else{
            //无记录
        }
    }
    private DataCd5CVo doParseData(byte[] bs, int index, int bsLen, String controllerType,Integer projectNo) throws Exception{
        //每条数据占39字节
        if(bsLen - index > 16){
            DataCd5CVo cdData = new DataCd5CVo() ;
            cdData.controllerType = controllerType ;
            cdData.projectNo = projectNo ;
            String HH = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String dd = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String MM = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String yy = ByteUtil.BCD2String_BE(bs, index, index) ;
            cdData.dt = "20" + yy + "-" + MM + "-" + dd + " " + HH  ;
            int meterAmountDay = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
            cdData.meterAmountDay = meterAmountDay/100.0D;
            index += 4 ;
            int farmerAmountDay = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
            cdData.farmerAmountDay = farmerAmountDay/100.0D;
            index += 4 ;
            int lossAmountDay = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
            cdData.lossAmountDay = lossAmountDay/100.0D;
            return cdData ;
        }else{
            return null ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_65_Down.java
New file
@@ -0,0 +1,83 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd5BVo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd65Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.DateTime;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_65
})
public class Cd_65_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd65Vo cvo = JSON.parseObject(json, ComCd65Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd65Vo为null") ;
            }
            if(cvo.page < 1 || cvo.page > 9){
                throw new Exception("ComCd65Vo的page取值不正确,正确取值范围是(1~9)") ;
            }
            byte[] bs = new byte[3] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            index ++ ;
            bs[index] = cvo.page.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_65_Up.java
New file
@@ -0,0 +1,143 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd5BVo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd65Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_65
})
@SuppressWarnings("unused")
public class Cd_65_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_65_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        String controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        Integer projectNo = 0 + bs[index];
        index++ ;
        byte hasRecord = bs[index];
        if(hasRecord == 1){
            //有记录
            List<DataCd65Vo> list = new ArrayList<>() ;
            DataCd65Vo vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ;
            while(vo != null){
                index += 39 ;
                list.add(vo) ;
                vo = this.doParseData(bs, index, bsLen, controllerType, projectNo) ;
            }
            dV1.subData = list ;
        }else{
            //无记录
        }
    }
    private DataCd65Vo doParseData(byte[] bs, int index, int bsLen, String controllerType,Integer projectNo) throws Exception{
        //每条数据占39字节
        if(bsLen - index > 39){
            DataCd65Vo cdData = new DataCd65Vo() ;
            cdData.controllerType = controllerType ;
            cdData.projectNo = projectNo ;
            cdData.icCardAddr = ByteUtil.bytes2Hex(bs, false, index, 4) ;
            index += 4 ;
            cdData.icCardNo  = GlParse.parseIcCardNo(bs, index, 6, 2) ;
            index += 8 ;
            int moneyRemain = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
            cdData.moneyRemain = moneyRemain/100.0D;
            index += 5 ;
            int waterRemain = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
            cdData.waterRemain = waterRemain/100.0D;
            index += 5 ;
            int thisEle = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
            cdData.thisEle = thisEle/100.0D;
            index += 4 ;
            int thisWater = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
            cdData.thisWater = thisWater/100.0D;
            index += 4 ;
            String mm = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String HH = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String dd = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            String MM = ByteUtil.BCD2String_BE(bs, index, index) ;
            cdData.rtuStartDt = MM + "-" + dd + " " + HH + ":" + mm ;
            index++ ;
            mm = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            HH = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            dd = ByteUtil.BCD2String_BE(bs, index, index) ;
            index++ ;
            MM = ByteUtil.BCD2String_BE(bs, index, index) ;
            cdData.rtuEndDt = MM + "-" + dd + " " + HH + ":" + mm ;
            index++ ;
            cdData.useWaterType = bs[index];
            return cdData ;
        }else{
            return null ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_80_Down.java
New file
@@ -0,0 +1,68 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd8AVo;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_80
})
public class Cd_80_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = false ;//是否有应答
        midRs.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = true ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            DataCd80Vo cdData = (DataCd80Vo)para.param ;
            byte[] bs = new byte[2] ;
            bs[0] = (byte)(Integer.parseInt(cdData.getControllerType(), 16));
            bs[1] = cdData.projectNo.byteValue() ;
            GlCreate.createTp(bs, 3) ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_80_Up.java
New file
@@ -0,0 +1,93 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd8AVo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_80
})
@SuppressWarnings("unused")
public class Cd_80_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_80_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = true ;//主动上报
        String confirmComCode = para.upCode ;
        ParseParamsForDownV202404 downCpParams  = new ParseParamsForDownV202404() ;
        downCpParams.setValue(
                null,
                ProtocolConstantV206V202404.protocolName,
                para.rtuAddr,
                Command.defaultId,
                confirmComCode,
                para.data.subData==null?null:(((DataV202404)para.data.subData).subData),
                null);
        //构造应答
        byte[] data = new Cd_80_Down().doParse(downCpParams) ;
        MidResultToRtu confirmCommand = new MidResultToRtu() ;
        confirmCommand.protocolName = para.protocolName ;//协议名称
        confirmCommand.rtuAddr = para.rtuAddr ;//Rtu地址
        confirmCommand.commandId = Command.defaultId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        confirmCommand.downCode = confirmComCode ;//下行命令功能码;
        confirmCommand.downBuffer = data ;//下行命令数据
        confirmCommand.downBufHex = ByteUtil.bytes2Hex(data, true) ;//下行命令数据十六进制形式
        confirmCommand.hasResponse = false ;//是否有应答
        confirmCommand.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发2次),如果不设置,命令缓存器进行补充设置
        confirmCommand.isCachForOffLine = false ;//RTU不在线,命令是否缓存
        confirmCommand.isSendFirst = true ;//确认命令,优先发送
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            confirmCommand.isQuickSend = true ;
        }
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs, confirmCommand} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd80Vo cdData = new DataCd80Vo() ;
        dV1.subData = cdData ;
        GlParse.parseCd80And5B(bs, cdData);
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_81_Down.java
New file
@@ -0,0 +1,68 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd81Vo;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_81
})
public class Cd_81_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = false ;//是否有应答
        midRs.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = true ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            DataCd81Vo cdData = (DataCd81Vo)para.param ;
            byte[] bs = new byte[2] ;
            bs[0] = (byte)(Integer.parseInt(cdData.getControllerType(), 16));
            bs[1] = cdData.projectNo.byteValue() ;
            GlCreate.createTp(bs, 3) ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_81_Up.java
New file
@@ -0,0 +1,100 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd81Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_81
})
@SuppressWarnings("unused")
public class Cd_81_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_81_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = true ;//主动上报
        String confirmComCode = para.upCode ;
        ParseParamsForDownV202404 downCpParams  = new ParseParamsForDownV202404() ;
        downCpParams.setValue(
                null,
                ProtocolConstantV206V202404.protocolName,
                para.rtuAddr,
                Command.defaultId,
                confirmComCode,
                para.data.subData==null?null:(((DataV202404)para.data.subData).subData),
                null);
        //构造应答
        byte[] data = new Cd_81_Down().doParse(downCpParams) ;
        MidResultToRtu confirmCommand = new MidResultToRtu() ;
        confirmCommand.protocolName = para.protocolName ;//协议名称
        confirmCommand.rtuAddr = para.rtuAddr ;//Rtu地址
        confirmCommand.commandId = Command.defaultId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        confirmCommand.downCode = confirmComCode ;//下行命令功能码;
        confirmCommand.downBuffer = data ;//下行命令数据
        confirmCommand.downBufHex = ByteUtil.bytes2Hex(data, true) ;//下行命令数据十六进制形式
        confirmCommand.hasResponse = false ;//是否有应答
        confirmCommand.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发2次),如果不设置,命令缓存器进行补充设置
        confirmCommand.isCachForOffLine = false ;//RTU不在线,命令是否缓存
        confirmCommand.isSendFirst = true ;//确认命令,优先发送
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            confirmCommand.isQuickSend = true ;
        }
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs, confirmCommand} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd81Vo cdData = new DataCd81Vo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        GlParse.parseAlarmAndState(bs, index, cdData) ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_8A_Down.java
New file
@@ -0,0 +1,67 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd8AVo;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_8A
})
public class Cd_8A_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = false ;//是否有应答
        midRs.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = true ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            DataCd8AVo cdData = (DataCd8AVo)para.param ;
            byte[] bs = new byte[8] ;
            bs[0] = (byte)(Integer.parseInt(cdData.getControllerType(), 16));
            bs[1] = cdData.projectNo.byteValue() ;
            GlCreate.createTp(bs, 3) ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_8A_Up.java
New file
@@ -0,0 +1,115 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd8AVo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_8A
})
@SuppressWarnings("unused")
public class Cd_8A_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_8A_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = true ;
        String confirmComCode = para.upCode ;
        ParseParamsForDownV202404 downCpParams  = new ParseParamsForDownV202404() ;
        downCpParams.setValue(
                null,
                ProtocolConstantV206V202404.protocolName,
                para.rtuAddr,
                Command.defaultId,
                confirmComCode,
                para.data.subData==null?null:(((DataV202404)para.data.subData).subData),
                null);
        //构造应答
        byte[] data = new Cd_8A_Down().doParse(downCpParams) ;
        MidResultToRtu confirmCommand = new MidResultToRtu() ;
        confirmCommand.protocolName = para.protocolName ;//协议名称
        confirmCommand.rtuAddr = para.rtuAddr ;//Rtu地址
        confirmCommand.commandId = Command.defaultId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        confirmCommand.downCode = confirmComCode ;//下行命令功能码;
        confirmCommand.downBuffer = data ;//下行命令数据
        confirmCommand.downBufHex = ByteUtil.bytes2Hex(data, true) ;//下行命令数据十六进制形式
        confirmCommand.hasResponse = false ;//是否有应答
        confirmCommand.maxSendTimes = 1 ;//命令最大发送次数(当收不到应答时,将重发2次),如果不设置,命令缓存器进行补充设置
        confirmCommand.isCachForOffLine = false ;//RTU不在线,命令是否缓存
        confirmCommand.isSendFirst = true ;//确认命令,优先发送
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            confirmCommand.isQuickSend = true ;
        }
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs, confirmCommand} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd8AVo cdData = new DataCd8AVo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        int lng = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
        cdData.lng = lng/1000000.0D;
        index += 5 ;
        int lat = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
        cdData.lat = lat/1000000.0D;
        index += 5 ;
        int softVersion = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.softVersion = softVersion/10.0F;
        index += 2 ;
        int hardVersion = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.hardVersion = hardVersion/10.0F;
        index += 2 ;
        int protocolVersion = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.protocolVersion = protocolVersion/10.0F;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_97_Down.java
New file
@@ -0,0 +1,76 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd65Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd97Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_97
})
public class Cd_97_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd97Vo cvo = JSON.parseObject(json, ComCd97Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd97Vo为null") ;
            }
            byte[] bs = new byte[2] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_97_Up.java
New file
@@ -0,0 +1,80 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlParse;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd50Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd65Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd97Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.ArrayList;
import java.util.List;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_97
})
@SuppressWarnings("unused")
public class Cd_97_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_97_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd97Vo cdData = new DataCd97Vo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        byte result = bs[index];
        if(result == 1){
            cdData.success = true ;
        }else{
            cdData.success = false ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_98_Down.java
New file
@@ -0,0 +1,76 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.alibaba.fastjson2.JSON;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.CodeV202404;
import com.dy.common.mw.protocol.p206V202404.ParseParamsForDownV202404;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd97Vo;
import com.dy.common.mw.protocol.p206V202404.downVos.ComCd98Vo;
import com.dy.common.mw.protocol.p206V202404.parse.global.GlCreate;
import com.dy.common.util.ByteUtil;
@AnnotationCodeDown(ifAny={
        CodeV202404.cd_98
})
public class Cd_98_Down implements CodeParse {
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback) throws Exception {
        ParseParamsForDownV202404 para = (ParseParamsForDownV202404) params ;
        byte[] bs = this.doParse(para) ;
        MidResultToRtu midRs = new MidResultToRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.commandId = para.commandId ;//命令ID,发起命令的客户端(web端)生成,以匹配命令结果
        midRs.downCode = para.commandCode ;//下行命令功能码;
        midRs.downBuffer = bs ;//下行命令数据
        midRs.downBufHex = ByteUtil.bytes2Hex(bs, true) ;//下行命令数据十六进制形式
        midRs.hasResponse = true ;//是否有应答
        midRs.maxSendTimes = null ;//命令最大发送次数(当收不到应答时,将重发),如果不设置,命令缓存器进行补充设置
        midRs.isCachForOffLine = false ;//RTU不在线,命令是否缓存,低功耗时为true
        midRs.isSendFirst = false ;//命令应答,首先发送,防止RTU重新上报
        if(isLowPower != null && isLowPower.booleanValue()){
            //低功耗时,尽快发送
            midRs.isQuickSend = true ;
        }
        return new MidResult[]{midRs} ;
    }
    /**
     * æž„造下行数据
     * @param para å‚æ•°
     * @return å­—节数组
     * @throws Exception å¼‚常
     */
    public byte[] doParse(ParseParamsForDownV202404 para) throws Exception {
        byte[] bytes = GlCreate.createStart2Cd(para.rtuAddr, para.commandCode);
        if(para.param != null){
            String json = (String)para.param;
            ComCd98Vo cvo = JSON.parseObject(json, ComCd98Vo.class) ;
            if(cvo == null){
                throw new Exception("json转ComCd98Vo为null") ;
            }
            byte[] bs = new byte[2] ;
            int index = 0 ;
            bs[index] = (byte)(Integer.parseInt(cvo.controllerType, 16));
            index ++ ;
            bs[index] = cvo.projectNo.byteValue() ;
            bytes = ByteUtil.bytesMerge(bytes, bs) ;
        }else{
            throw new Exception("下行命令参数据为null") ;
        }
        GlCreate.createLen(bytes);//长度放字节数组中
        byte[] bsTail = GlCreate.createCrcTail(bytes) ;//CRC和尾
        bytes = ByteUtil.bytesMerge(bytes, bsTail) ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/Cd_98_Up.java
New file
@@ -0,0 +1,74 @@
package com.dy.common.mw.protocol.p206V202404.parse;
import com.dy.common.mw.protocol.*;
import com.dy.common.mw.protocol.p206V202404.*;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd98Vo;
import com.dy.common.util.ByteUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@AnnotationCodeUp(ifAny={
        CodeV202404.cd_98
})
@SuppressWarnings("unused")
public class Cd_98_Up implements CodeParse{
    private static final Logger log = LogManager.getLogger(Cd_98_Up.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®
     */
    @Override
    public MidResult[] parse(Boolean isLowPower, CodeParseParams params, CodeParseCallback callback)throws Exception {
        ParseParamsForUpV202404 para = (ParseParamsForUpV202404)params ;
        int bsLen = new CommonV202404().parseDataLen(para.upBuffer) ;
        if(bsLen > 0){
            this.doParse(para.upBuffer,
                    bsLen,
                    para.upCode,
                    para.data) ;
        }
        log.info("分析上行数据<" + CodeV202404.getCodeName(para.upCode) + " RTU地址=" + para.rtuAddr + ">:\n" + para.data.toString());
        MidResultFromRtu midRs = new MidResultFromRtu() ;
        midRs.protocolName = para.protocolName ;//协议名称
        midRs.rtuAddr = para.rtuAddr ;//Rtu地址
        midRs.upCode = para.upCode ;//上行数据中的功能码
        midRs.upHex = para.upHex ;//上行数据十六进制形式
        midRs.upBuffer = para.upBuffer ;//上行数据字节数组
        midRs.data = para.data ;//解析后的数据
        midRs.reportOrResponse_trueOrFalse = false ;
        callback.callback(midRs.reportOrResponse_trueOrFalse);
        return new MidResult[]{midRs} ;
    }
    /**
     * æ‰§è¡Œåˆ†æž
     * @param bs å­—节数组
     * @param bsLen å­—节长度(总包长,包括包头和包尾)
     * @param dataCode åŠŸèƒ½ç 
     * @param data æ•°æ®
     * @throws Exception å¼‚常
     */
    protected void doParse(byte[] bs, int bsLen, String dataCode, Data data) throws Exception {
        DataV202404 dV1 = (DataV202404)data.getSubData() ;
        DataCd98Vo cdData = new DataCd98Vo() ;
        dV1.subData = cdData ;
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        byte result = bs[index];
        if(result == 1){
            cdData.success = true ;
        }else{
            cdData.success = false ;
        }
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlCreate.java
New file
@@ -0,0 +1,129 @@
package com.dy.common.mw.protocol.p206V202404.parse.global;
import com.dy.common.mw.protocol.p206V1_0_0.ProtocolConstantV206V1_0_0;
import com.dy.common.mw.protocol.p206V202404.CommonV202404;
import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import com.dy.common.util.CRC8_for_2_0;
import com.dy.common.util.DateTime;
public class GlCreate {
    /**
     * 6字节BCD码(12位行政区划) + 2字节HEX
     * @param rtuAddr æŽ§åˆ¶å™¨åœ°å€
     * @param commandCode åŠŸèƒ½ç 
     * @throws Exception
     */
    public static byte[] createStart2Cd(String rtuAddr, String commandCode) throws Exception {
        CommonV202404 commonV202404 = new CommonV202404() ;
        byte[] bsHead = new byte[ProtocolConstantV206V202404.lenHead2Code] ;
        byte index = 0 ;
        bsHead[index] = ProtocolConstantV206V202404.P_Head_Byte ;
        index++ ;
        bsHead[index] = 0 ;//帧长度
        index++ ;
        bsHead[index] = ProtocolConstantV206V202404.P_Head_Byte ;
        index++ ;
        bsHead[index] = commonV202404.createCtrl((byte)0, (byte)0) ;
        index++ ;
        GlCreate.createRtuAddr(rtuAddr, bsHead, index);
        index += 7 ;
        ByteUtil.hex2Bytes(commandCode, bsHead, index) ;
        return bsHead ;
    }
    /**
     * ç”ŸæˆæŽ§åˆ¶å™¨åœ°å€
     * 6字节BCD码(12位行政区划) + 2字节HEX
     * @param rtuAddr
     * @param bs
     * @param index
     * @throws Exception
     */
    public static void createRtuAddr(String rtuAddr, byte[] bs, int index) throws Exception {
        String rtuAddr1 = rtuAddr.substring(0, 12) ;
        String rtuAddr2 = rtuAddr.substring(12) ;
        ByteUtil.string2BCD_BE(bs, rtuAddr1, index) ;
        index += 6 ;
        Integer rtuAddr2Int = Integer.parseInt(rtuAddr2) ;
        ByteUtilUnsigned.short2Bytes_LE(bs, rtuAddr2Int.shortValue(), index);
    }
    /**
     * ç”ŸæˆIC卡地址
     * @param icCardAddr
     * @param bs
     * @param index
     * @throws Exception
     */
    public static void createIcCardAddr(String icCardAddr, byte[] bs, int index) throws Exception {
        String s1 = icCardAddr.substring(0, 2) ;
        String s2 = icCardAddr.substring(2, 4) ;
        String s3 = icCardAddr.substring(4, 6) ;
        String s4 = icCardAddr.substring(6, 8) ;
        bs[index++] = (byte) (Integer.parseInt(s1, 16)) ;
        bs[index++] = (byte) (Integer.parseInt(s2, 16)) ;
        bs[index++] = (byte) (Integer.parseInt(s3, 16)) ;
        bs[index++] = (byte) (Integer.parseInt(s4, 16)) ;
    }
    /**
     * ç”ŸæˆIC卡编码
     * 6字节BCD码(12位行政区划) + 2字节HEX
     * @param icCardNo
     * @param bs
     * @param index
     * @throws Exception
     */
    public static void createIcCardNo(String icCardNo, byte[] bs, int index) throws Exception {
        String icCardNo1 = icCardNo.substring(0, 12) ;
        String icCardNo2 = icCardNo.substring(12) ;
        ByteUtil.string2BCD_BE(bs, icCardNo1, index) ;
        index += 6 ;
        Integer icCardNo2Int = Integer.parseInt(icCardNo2) ;
        ByteUtilUnsigned.short2Bytes_LE(bs, icCardNo2Int.shortValue(), index);
    }
    public static void createPw(byte[] bs, int index) throws Exception {
        bs[index] = 0;
        bs[index + 1] = 0;
    }
    public static void createTp(byte[] bs, int index) throws Exception {
        bs[index] = Byte.parseByte(DateTime.ss()) ;
        bs[index + 1] = Byte.parseByte(DateTime.mm()) ;
        bs[index + 2] = Byte.parseByte(DateTime.HH()) ;
        bs[index + 3] = Byte.parseByte(DateTime.dd()) ;
        bs[index + 4] = (byte)(DateTime.week_Int().byteValue() << 5 | Byte.parseByte(DateTime.MM())) ;
        bs[index + 5] = Byte.parseByte(DateTime.yy()) ;
    }
    public static void createS2D(byte[] bs, int index) throws Exception {
        bs[index] = Byte.parseByte(DateTime.ss()) ;
        bs[index + 1] = Byte.parseByte(DateTime.mm()) ;
        bs[index + 2] = Byte.parseByte(DateTime.HH()) ;
        bs[index + 3] = Byte.parseByte(DateTime.dd()) ;
    }
    public static void createLen(byte[] bsNoTail) throws Exception {
        int len = bsNoTail.length - ProtocolConstantV206V1_0_0.lenHead2ctrl;
        bsNoTail[ProtocolConstantV206V1_0_0.dataLenIndex] = (byte)len ;
    }
    public static byte[] createCrcTail(byte[] bsNoTail) throws Exception {
        int crc = new CRC8_for_2_0().CRC8(bsNoTail, ProtocolConstantV206V1_0_0.ctrlIndex, bsNoTail.length -1) ;
        byte[] bytes = new byte[ProtocolConstantV206V1_0_0.lenTail] ;
        bytes[0] = (byte)crc ;
        bytes[1] = ProtocolConstantV206V1_0_0.P_Tail_Byte ;
        return bytes ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/parse/global/GlParse.java
New file
@@ -0,0 +1,253 @@
package com.dy.common.mw.protocol.p206V202404.parse.global;
import com.dy.common.mw.protocol.p206V202404.ProtocolConstantV206V202404;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd80Vo;
import com.dy.common.mw.protocol.p206V202404.upVos.DataCd81Vo;
import com.dy.common.util.ByteUtil;
import com.dy.common.util.ByteUtilUnsigned;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class GlParse {
    private static final Logger log = LogManager.getLogger(GlParse.class);
    /**
     * åˆ†æžä¸Šè¡Œæ•°æ®ä¸­çš„æ—¶é’Ÿ
     * @param bs ä¸Šè¡Œå­—节数组
     * @param index å¯å§‹ä½
     * @return æŽ§åˆ¶å™¨åœ°å€
     * @throws Exception å¼‚常
     */
    public static String parseRtuDt(byte[] bs, int index)throws Exception{
        String ss = ByteUtil.BCD2String_BE(bs, index, index) ;
        index++ ;
        String MM = ByteUtil.BCD2String_BE(bs, index, index) ;
        index++ ;
        String HH = ByteUtil.BCD2String_BE(bs, index, index) ;
        index++ ;
        String dd = ByteUtil.BCD2String_BE(bs, index, index) ;
        index++ ;
        String mm = ByteUtil.BCD2String_BE(bs, index, index) ;
        index++ ;
        String yy = ByteUtil.BCD2String_BE(bs, index, index) ;
        return yy + "-" + mm + "-" + dd + " " + HH + ":" + MM + ":" + ss ;
    }
   /**
     * åˆ†æžIC卡编号
     * @param bs ä¸Šè¡Œå­—节数组
     * @param index å¯å§‹ä½
     * @param len1 ç¬¬ä¸€éƒ¨åˆ†å­—节数
     * @param len2 ç¬¬äºŒéƒ¨åˆ†å­—节数
     * @return æŽ§åˆ¶å™¨åœ°å€
     * @throws Exception å¼‚常
     */
    public static String parseIcCardNo(byte[] bs, int index, int len1, int len2)throws Exception{
        String rtuAddrBCD = "" + ByteUtil.BCD2Long_BE(bs, index, index + len1 - 1) ;
        String rtuAddrStr = "" + ByteUtilUnsigned.bytes2Short_LE(bs, index + len1 + len2 -1 ) ;
        while(rtuAddrStr.length() < 5){
            rtuAddrStr = "0" + rtuAddrStr ;
        }
        return rtuAddrBCD + rtuAddrStr ;
    }
    /**
     * åˆ†æžçŠ¶æ€ä¸ŽæŠ¥è­¦
     * @param bs
     * @param index
     * @return
     */
    public static void parseAlarmAndState(byte[] bs, int index, DataCd80Vo vo){
        byte b = bs[index] ;
        vo.statePump = (byte)(b & 0x1) ;
        vo.alarmWaterRemain = (byte)(b & 0x2) ;
        vo.alarm0WaterRemain = (byte)(b & 0x4) ;
        vo.alarmExceedYear = (byte)(b & 0x8) ;
        vo.alarmWaterMeterFault = (byte)(b & 0x10) ;
        vo.alarmSteal = (byte)(b & 0x20) ;
        vo.alarmWaterMeterBreak = (byte)(b & 0x40) ;
        vo.alarmEleMeterFault = (byte)(b & 0x80) ;
        index++ ;
        b = bs[index] ;
        vo.alarm0MoneyRemain = (byte)(b & 0x1) ;
        vo.alarmInnerDoor = (byte)(b & 0x2) ;
        vo.alarmOuterDoor = (byte)(b & 0x4) ;
        vo.alarmEleMiss = (byte)(b & 0x8) ;
        vo.alarmEleExceed = (byte)(b & 0x10) ;
        vo.alarmEleLowVolt = (byte)(b & 0x20) ;
        vo.stateIcEnable = (byte)(b & 0x40) ;
    }
    /**
     * åˆ†æžçŠ¶æ€ä¸ŽæŠ¥è­¦
     * @param bs
     * @param index
     * @return
     */
    public static void parseAlarmAndState(byte[] bs, int index, DataCd81Vo vo){
        byte b = bs[index] ;
        vo.statePump = (byte)(b & 0x1) ;
        vo.alarmWaterRemain = (byte)(b & 0x2) ;
        vo.alarm0WaterRemain = (byte)(b & 0x4) ;
        vo.alarmExceedYear = (byte)(b & 0x8) ;
        vo.alarmWaterMeterFault = (byte)(b & 0x10) ;
        vo.alarmSteal = (byte)(b & 0x20) ;
        vo.alarmWaterMeterBreak = (byte)(b & 0x40) ;
        vo.alarmEleMeterFault = (byte)(b & 0x80) ;
        index++ ;
        b = bs[index] ;
        vo.alarm0MoneyRemain = (byte)(b & 0x1) ;
        vo.alarmInnerDoor = (byte)(b & 0x2) ;
        vo.alarmOuterDoor = (byte)(b & 0x4) ;
        vo.alarmEleMiss = (byte)(b & 0x8) ;
        vo.alarmEleExceed = (byte)(b & 0x10) ;
        vo.alarmEleLowVolt = (byte)(b & 0x20) ;
        vo.stateIcEnable = (byte)(b & 0x40) ;
    }
    public static String parseTp(byte[] bs, short index){
        String dt = "" ;
        try{
            dt = dt + ByteUtil.BCD2String_BE(bs, index, index) ;//秒
            index++ ;
            dt = ByteUtil.BCD2String_BE(bs, index, index) + ":" + dt ;//分
            index++ ;
            dt = ByteUtil.BCD2String_BE(bs, index, index) + ":" + dt ;//时
            index++ ;
            dt = ByteUtil.BCD2String_BE(bs, index, index) + " " + dt ;//日
            index++ ;
            //bs[index] = (byte)(bs[index] & 0x10);
            dt = ByteUtil.BCD2String_BE(bs, index, index) + "-" + dt ;//月
            index++ ;
            dt = "20" + ByteUtil.BCD2String_BE(bs, index, index) + "-" + dt ;//å¹´
        }catch (Exception e){
            log.error("解析控制器时钟时异常:" + e.getMessage(), e);
        }
        return dt ;
    }
    /**
     * åˆ†æžåŠŸèƒ½80和5B数据
     * @param bs
     * @param cdData
     * @throws Exception
     */
    public static void parseCd80And5B(byte[] bs, DataCd80Vo cdData) throws Exception{
        int index = ProtocolConstantV206V202404.dataIndex ;
        cdData.controllerType = ByteUtil.bytes2Hex(bs, false, index, 1) ;
        index++ ;
        cdData.projectNo = 0 + bs[index];
        index++ ;
        cdData.useWaterType = bs[index];
        index++ ;
        cdData.orderNo = ByteUtil.BCD2String_BE(bs, index, index + 4) ;
        index += 8 ;
        cdData.icCardAddr = ByteUtil.bytes2Hex(bs, false, index, 4) ;
        index += 4 ;
        cdData.icCardNo  = GlParse.parseIcCardNo(bs, index, 6, 2) ;
        index += 8 ;
        cdData.rtuDt  = GlParse.parseRtuDt(bs, index) ;
        index += 6 ;
        int waterLevel = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
        cdData.waterLevel = waterLevel/1000.0D;
        index += 4 ;
        int waterPress = ByteUtil.BCD2Int_BE(bs, index, index + 2) ;
        cdData.waterPress = waterPress/100.0D;
        index += 3 ;
        int waterInstant = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
        cdData.waterInstant = waterInstant/100.0D;
        index += 4 ;
        int waterTotal = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
        cdData.waterTotal = waterTotal/100.0D;
        index += 5 ;
        int eleTotal = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
        cdData.eleTotal = eleTotal/100.0D;
        index += 5 ;
        int moneyRemain = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
        cdData.moneyRemain = moneyRemain/100.0D;
        index += 5 ;
        int waterRemain = ByteUtil.BCD2Int_BE(bs, index, index + 4) ;
        cdData.waterRemain = waterRemain/100.0D;
        index += 5 ;
        int thisEle = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
        cdData.thisEle = thisEle/100.0D;
        index += 4 ;
        int thisWater = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
        cdData.thisWater = thisWater/100.0D;
        index += 4 ;
        int thisMoney = ByteUtil.BCD2Int_BE(bs, index, index + 3) ;
        cdData.thisMoney = thisMoney/100.0D;
        index += 4 ;
        cdData.thisDuration = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        index += 2 ;
        int waterPrice = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.waterPrice = waterPrice/100.0D;
        index += 2 ;
        int elePrice = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.elePrice = elePrice/100.0D;
        index += 2 ;
        GlParse.parseAlarmAndState(bs, index, cdData) ;
        index += 2 ;
        int aVolt = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.aVolt = aVolt/10.0D;
        index += 2 ;
        int bVolt = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.bVolt = bVolt/10.0D;
        index += 2 ;
        int cVolt = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.cVolt = cVolt/10.0D;
        index += 2 ;
        int aCurrent = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.aCurrent = aCurrent/10.0D;
        index += 2 ;
        int bCurrent = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.bCurrent = bCurrent/10.0D;
        index += 2 ;
        int cCurrent = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.cCurrent = cCurrent/10.0D;
        index += 2 ;
        int batteryVolt = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.batteryVolt = batteryVolt/100.0D;
        index += 2 ;
        int waterMeterTransVolt = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.waterMeterTransVolt = waterMeterTransVolt/100.0D;
        index += 2 ;
        int waterMeterWorkVolt = ByteUtil.BCD2Int_BE(bs, index, index + 1) ;
        cdData.waterMeterWorkVolt = waterMeterWorkVolt/100.0D;
        index += 2 ;
        cdData.csq = ByteUtil.BCD2Int_BE(bs, index, index) ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd02Vo.java
New file
@@ -0,0 +1,28 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//链路检测
@Data
public class DataCd02Vo {
    public String controllerType ;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public String status ;//保持在线状态:  F0 ç™»å½•,F1 é€€å‡ºç™»å½•,F2 åœ¨çº¿ä¿æŒ
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      é“¾è·¯æ£€æµ‹ : \n") ;
        sb.append("      è¯·æ±‚状态 : ") ;
        sb.append(status == null?"未知":(status.equals("F0")?"登录":(status.equals("F1")?"退出登录":(status.equals("F2")?"在线保持":status)))) ;
        sb.append("\n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd10Vo.java
New file
@@ -0,0 +1,28 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//设置设备终端地址
@Data
public class DataCd10Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public String rtuNewAddr ;//控制器新地址
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      è®¾ç½®ç»ˆç«¯åœ°å€åº”ç­” : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      æŽ§åˆ¶å™¨æ–°åœ°å€ : ") ;
        sb.append(rtuNewAddr == null?"未知":rtuNewAddr) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd15Vo.java
New file
@@ -0,0 +1,30 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//远程用户充值
@Data
public class DataCd15Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public Boolean success ;//命令结果(true成功, false失败)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      æ¸…除设备终端用户用水记录 : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      å‘½ä»¤ç»“æžœ : ") ;
        sb.append(success == null?"未知":(success?"成功":"失败")) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd50Vo.java
New file
@@ -0,0 +1,28 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//查询设备终端地址
@Data
public class DataCd50Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public String rtuAddr;//控制器新地址
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      è®¾ç½®ç»ˆç«¯åœ°å€åº”ç­” : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      æŽ§åˆ¶å™¨åœ°å€ : ") ;
        sb.append(rtuAddr == null?"未知": rtuAddr) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd55Vo.java
New file
@@ -0,0 +1,53 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//查询设备终端充值记录
@Data
public class DataCd55Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public String icCardAddr ;//IC卡地址(8位数字或字母)
    public String icCardNo ;//用户卡序列号(16位数字)(6字节BCD,2字节HEX)
    public Double chargeMoney ;//单位:元  2位小数点(最大值 99999999.99)
    public Double chargeWater ;//单位:m3  2位小数点(最大值 99999999.99)
    public String flowNo ;//流水号(12位数字)
    public Boolean success ;//命令结果(true成功, false失败)
    public String dt ;//充值时间(yyyy-mm-dd HH:mm:ss)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      æŸ¥è¯¢è®¾å¤‡ç»ˆç«¯å……值记录  : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      IC卡地址 : ") ;
        sb.append(icCardAddr == null?"未知":icCardAddr) ;
        sb.append("\n") ;
        sb.append("      ç”¨æˆ·å¡åºåˆ—号 : ") ;
        sb.append(icCardNo == null?"未知":icCardNo) ;
        sb.append("\n") ;
        sb.append("      å……值金额 : ") ;
        sb.append(chargeMoney == null?"未知":chargeMoney) ;
        sb.append("\n") ;
        sb.append("      å……值水量 : ") ;
        sb.append(chargeWater == null?"未知":chargeWater) ;
        sb.append("\n") ;
        sb.append("      æµæ°´å· : ") ;
        sb.append(flowNo == null?"未知":flowNo) ;
        sb.append("\n") ;
        sb.append("      å……值结果 : ") ;
        sb.append(success == null?"未知":(success.booleanValue()?"成功":"失败")) ;
        sb.append("\n") ;
        sb.append("      å……值时间 : ") ;
        sb.append(dt == null?"未知":dt) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd56Vo.java
New file
@@ -0,0 +1,30 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//查询设备终端剩余水量和剩余金额报警值
@Data
public class DataCd56Vo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public Integer waterAlarm ;//剩余水量报警值,单位:m3。整数,取值范围0~65535
    public Integer moneyAlarm ;//剩余金额报警值,单位:元。整数,取值范围0~65535
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      æŸ¥è¯¢è®¾å¤‡ç»ˆç«¯å‰©ä½™æ°´é‡å’Œå‰©ä½™é‡‘额报警值  : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      å‰©ä½™æ°´é‡æŠ¥è­¦å€¼ : ") ;
        sb.append(moneyAlarm == null?"未知":moneyAlarm) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd5BVo.java
New file
@@ -0,0 +1,9 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//设备终端工作上报
@Data
public class DataCd5BVo extends DataCd80Vo {
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd5CVo.java
New file
@@ -0,0 +1,40 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//查询设备终端的历史日记录
@Data
public class DataCd5CVo {
    public String controllerType;//控制器类型 01(0x01):测控一体阀;57(0x57):井电控制器
    public Integer projectNo ;//控制器类型 0x01:测控一体阀;0x57:井电控制器
    public String dt ;//观察时间(yyyy-mm-dd HH)
    public Double meterAmountDay ;//当日水表净流量,2个小数点
    public Double farmerAmountDay ;//当日用户用水量,2个小数点
    public Double lossAmountDay ;//当日漏损水量,2个小数点
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      æŸ¥è¯¢è®¾å¤‡ç»ˆç«¯çš„历史日记录  : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      è§‚察时间 : ") ;
        sb.append(dt == null?"未知":dt) ;
        sb.append("\n") ;
        sb.append("      å½“日水表净流量 : ") ;
        sb.append(meterAmountDay == null?"未知":meterAmountDay) ;
        sb.append("\n") ;
        sb.append("      å½“日用户用水量 : ") ;
        sb.append(farmerAmountDay == null?"未知":farmerAmountDay) ;
        sb.append("\n") ;
        sb.append("      å½“日漏损水量 : ") ;
        sb.append(lossAmountDay == null?"未知":lossAmountDay) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd65Vo.java
New file
@@ -0,0 +1,60 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//查询设备终端用户用水记录
@Data
public class DataCd65Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public String icCardAddr ;//IC卡地址(远程开泵/阀时此数据为0)
    public String icCardNo ;//用户卡序列号(16位数字)
    public Double moneyRemain ;//用户剩余金额(单位0.01元)
    public Double waterRemain ;//用户剩余水量(单位0.01m3)
    public Double thisEle ;//本次使用电量(单位0.01度)
    public Double thisWater ;//本次使用水量(单位0.01立方米)
    public String rtuStartDt ;//本次开始时间 (分时日月)
    public String rtuEndDt ;//本次结束时间 (分时日月)
    public Byte useWaterType ;//用水方式(0x00:正常刷卡开泵/阀用水 0x01:平台远程开泵/阀用水 0x02:用户远程开泵/阀用水 0x03:测试卡,0x04:其它)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      æŸ¥è¯¢è®¾å¤‡ç»ˆç«¯ç”¨æˆ·ç”¨æ°´è®°å½• : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      ç”¨æ°´æ–¹å¼ : ") ;
        sb.append(useWaterType == null?"未知":(useWaterType.byteValue()==0?"刷卡开泵/阀":(useWaterType.byteValue()==1?"平台远程开泵/阀":(useWaterType.byteValue()==2?"APP远程开泵/阀":(useWaterType.byteValue()==3?"测试卡开泵/阀":(useWaterType.byteValue()==4?"其他":"未知")))))) ;
        sb.append("\n") ;
        sb.append("      IC卡地址 : ") ;
        sb.append(icCardAddr == null?"未知":icCardAddr) ;
        sb.append("\n") ;
        sb.append("      ç”¨æˆ·å¡åºåˆ—号 : ") ;
        sb.append(icCardNo == null?"未知":icCardNo) ;
        sb.append("\n") ;
        sb.append("      ç”¨æˆ·å‰©ä½™é‡‘额 : ") ;
        sb.append(moneyRemain == null?"未知":moneyRemain) ;
        sb.append("\n") ;
        sb.append("      ç”¨æˆ·å‰©ä½™æ°´é‡ : ") ;
        sb.append(waterRemain == null?"未知":waterRemain) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡ä½¿ç”¨ç”µé‡ : ") ;
        sb.append(thisEle == null?"未知":thisEle) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡ä½¿ç”¨æ°´é‡ : ") ;
        sb.append(thisWater == null?"未知":thisWater) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡å¼€å§‹æ—¶é—´ : ") ;
        sb.append(rtuStartDt == null?"未知":rtuStartDt) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡ç»“束时间 : ") ;
        sb.append(rtuEndDt == null?"未知":rtuEndDt) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd80Vo.java
New file
@@ -0,0 +1,204 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//设备终端工作上报
@Data
public class DataCd80Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public Byte useWaterType ;//用水方式(0x00:正常刷卡开泵/阀用水 0x01:平台远程开泵/阀用水 0x02:用户远程开泵/阀用水 0x03:测试卡,0x04:其它)
    public String orderNo ;//订单号(16位数字)
    public String icCardAddr ;//IC卡地址(远程开泵/阀时此数据为0)
    public String icCardNo ;//用户卡序列号(16位数字)
    public String rtuDt ;//观察时间: 6字节的BCD码(秒分时日月年)
    public Double waterLevel ;//水位(单位0.001米)
    public Double waterPress ;//水压(单位0.01千帕)
    public Double waterInstant ;//瞬时流量(单位0.01立方米/小时)
    public Double waterTotal ;//水表累计流量(单位0.01m3)
    public Double eleTotal ;//电表累计电量(单位0.01度)
    public Double moneyRemain ;//用户剩余金额(单位0.01元)
    public Double waterRemain ;//用户剩余水量(单位0.01m3)
    public Double thisEle ;//本次使用电量(单位0.01度)
    public Double thisWater ;//本次使用水量(单位0.01立方米)
    public Double thisMoney ;//本次使用金额(单位0.01元)
    public Integer thisDuration ;//本次使用时长(单位:分钟  æœ€å¤§9999分钟)
    public Double waterPrice ;//当前水量单价(单位0.01元 æœ€å¤§99.99元)
    public Double elePrice ;//当前电量单价(单位0.01元 æœ€å¤§99.99元)
    public Double aVolt ;//交流A相电压数据(单位0.1伏特)
    public Double bVolt ;//交流B相电压数据(单位0.1伏特)
    public Double cVolt ;//交流C相电压数据(单位0.1伏特)
    public Double aCurrent ;//交流A相电流数据(单位0.1安培)
    public Double bCurrent ;//交流B相电流数据(单位0.1安培)
    public Double cCurrent ;//交流C相电流数据(单位0.1安培)
    public Double batteryVolt ;//后备电池电压(单位0.01伏特)
    public Double waterMeterTransVolt ;//水表远传电压(单位0.01伏特)
    public Double waterMeterWorkVolt ;//水表工作电压(单位0.01伏特)
    /*
    CSQ值应在0到31之间,其中99表示无信号。
    ç½‘络质量评估:
        CSQ值小于10:可以认为网络较差。
        CSQ值在10和25之间:可以认为网络中等。
        CSQ值大于25:可以认为网络较好。
        CSQ值小于11:不容易附着网络。
        11 < CSQ < 18:网络不稳定,可能会导致误码较多。
        CSQ值大于18:能稳定通信
     */
    public Integer csq ;//手机信号强度 CSQ值()
    public Byte statePump ; //æ³µ/阀状态    (1:开泵/阀;0:关泵/阀)
    public Byte alarmWaterRemain ; //剩余水量报警    (1:小于报警上限报警 0:正常)
    public Byte alarm0WaterRemain ; //剩余水量为0关泵/阀    (1:剩余水量为0关泵  0:正常)
    public Byte alarmExceedYear ; //年度超采报警    (1:年用水量大于限制水量报警 0:正常)
    public Byte alarmWaterMeterFault ; //外部流量计故障    (1:流量计故障报警 0:正常)
    public Byte alarmSteal ; //偷水报警    (1:绕开控制器用水报警 0:正常)
    public Byte alarmWaterMeterBreak ; //流量计损坏报警    (1:正常通讯但瞬时为0报警 0:正常)
    public Byte alarmEleMeterFault ; //电表故障报警    (1:和电表通讯断或数据不正常 0:正常)
    public Byte alarm0MoneyRemain ; //剩余金额为0关泵/阀    (1:剩余金额为0报警  0:正常)
    public Byte alarmInnerDoor ; //控制器内门报警    (1:内门打开报警    0:正常)
    public Byte alarmOuterDoor ; //控制器外门报警    (1:外门打开报警    0:正常)
    public Byte alarmEleMiss ; //交流缺项报警    (1:三相缺项报警    0:正常)
    public Byte alarmEleExceed ; //交流过流报警    (1:交流过流报警    0:正常)
    public Byte alarmEleLowVolt ; //三相电欠压报警    (1:欠压报警        0:正常)
    public Byte stateIcEnable ; //IC卡使能    (1、IC有刷卡支持    0:不支持)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      è®¾å¤‡ç»ˆç«¯å·¥ä½œä¸ŠæŠ¥ : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      ç”¨æ°´æ–¹å¼ : ") ;
        sb.append(useWaterType == null?"未知":(useWaterType.byteValue()==0?"刷卡开泵/阀":(useWaterType.byteValue()==1?"平台远程开泵/阀":(useWaterType.byteValue()==2?"APP远程开泵/阀":(useWaterType.byteValue()==3?"测试卡开泵/阀":(useWaterType.byteValue()==4?"其他":"未知")))))) ;
        sb.append("\n") ;
        sb.append("      è®¢å•号 : ") ;
        sb.append(orderNo == null?"未知":orderNo) ;
        sb.append("\n") ;
        sb.append("      IC卡地址 : ") ;
        sb.append(icCardAddr == null?"未知":icCardAddr) ;
        sb.append("\n") ;
        sb.append("      ç”¨æˆ·å¡åºåˆ—号 : ") ;
        sb.append(icCardNo == null?"未知":icCardNo) ;
        sb.append("\n") ;
        sb.append("      è§‚察时间 : ") ;
        sb.append(rtuDt == null?"未知":rtuDt) ;
        sb.append("\n") ;
        sb.append("      æ°´ä½ : ") ;
        sb.append(waterLevel == null?"未知":waterLevel) ;
        sb.append("\n") ;
        sb.append("      æ°´åŽ‹ : ") ;
        sb.append(waterPress == null?"未知":waterPress) ;
        sb.append("\n") ;
        sb.append("      çž¬æ—¶æµé‡ : ") ;
        sb.append(waterInstant == null?"未知":waterInstant) ;
        sb.append("\n") ;
        sb.append("      æ°´è¡¨ç´¯è®¡æµé‡ : ") ;
        sb.append(waterTotal == null?"未知":waterTotal) ;
        sb.append("\n") ;
        sb.append("      ç”µè¡¨ç´¯è®¡ç”µé‡ : ") ;
        sb.append(eleTotal == null?"未知":eleTotal) ;
        sb.append("\n") ;
        sb.append("      ç”¨æˆ·å‰©ä½™é‡‘额 : ") ;
        sb.append(moneyRemain == null?"未知":moneyRemain) ;
        sb.append("\n") ;
        sb.append("      ç”¨æˆ·å‰©ä½™æ°´é‡ : ") ;
        sb.append(waterRemain == null?"未知":waterRemain) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡ä½¿ç”¨ç”µé‡ : ") ;
        sb.append(thisEle == null?"未知":thisEle) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡ä½¿ç”¨æ°´é‡ : ") ;
        sb.append(thisWater == null?"未知":thisWater) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡ä½¿ç”¨é‡‘额 : ") ;
        sb.append(thisMoney == null?"未知":thisMoney) ;
        sb.append("\n") ;
        sb.append("      æœ¬æ¬¡ä½¿ç”¨æ—¶é•¿ : ") ;
        sb.append(thisDuration == null?"未知":thisDuration) ;
        sb.append("\n") ;
        sb.append("      å½“前水量单价 : ") ;
        sb.append(waterPrice == null?"未知":waterPrice) ;
        sb.append("\n") ;
        sb.append("      å½“前电量单价 : ") ;
        sb.append(elePrice == null?"未知":elePrice) ;
        sb.append("\n") ;
        sb.append("      äº¤æµA相电压 : ") ;
        sb.append(aVolt == null?"未知":aVolt) ;
        sb.append("\n") ;
        sb.append("      äº¤æµB相电压 : ") ;
        sb.append(bVolt == null?"未知":bVolt) ;
        sb.append("\n") ;
        sb.append("      äº¤æµC相电压 : ") ;
        sb.append(cVolt == null?"未知":cVolt) ;
        sb.append("\n") ;
        sb.append("      äº¤æµA相电流 : ") ;
        sb.append(aCurrent == null?"未知":aCurrent) ;
        sb.append("\n") ;
        sb.append("      äº¤æµB相电流 : ") ;
        sb.append(bCurrent == null?"未知":bCurrent) ;
        sb.append("\n") ;
        sb.append("      äº¤æµC相电流 : ") ;
        sb.append(cCurrent == null?"未知":cCurrent) ;
        sb.append("\n") ;
        sb.append("      åŽå¤‡ç”µæ± ç”µåŽ‹ : ") ;
        sb.append(batteryVolt == null?"未知":batteryVolt) ;
        sb.append("\n") ;
        sb.append("      æ°´è¡¨è¿œä¼ ç”µåŽ‹ : ") ;
        sb.append(waterMeterTransVolt == null?"未知":waterMeterTransVolt) ;
        sb.append("\n") ;
        sb.append("      æ°´è¡¨å·¥ä½œç”µåŽ‹ : ") ;
        sb.append(waterMeterWorkVolt == null?"未知":waterMeterWorkVolt) ;
        sb.append("\n") ;
        sb.append("      æ³µçŠ¶æ€ : ") ;
        sb.append(statePump == null?"未知":(statePump.byteValue()==1?"æ³µ/阀开":(statePump.byteValue()==0?"æ³µ/阀关":"未知"))) ;
        sb.append("      å‰©ä½™æ°´é‡æŠ¥è­¦ : ") ;
        sb.append(alarmWaterRemain == null?"未知":(alarmWaterRemain.byteValue()==1?"小于报警上限":(alarmWaterRemain.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å‰©ä½™æ°´é‡ä¸º0关泵/阀 : ") ;
        sb.append(alarm0WaterRemain == null?"未知":(alarm0WaterRemain.byteValue()==1?"归零关泵/阀":(alarm0WaterRemain.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å¹´åº¦è¶…采 : ") ;
        sb.append(alarmExceedYear == null?"未知":(alarmExceedYear.byteValue()==1?"报警":(alarmExceedYear.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å¤–部流量计故障 : ") ;
        sb.append(alarmWaterMeterFault == null?"未知":(alarmWaterMeterFault.byteValue()==1?"报警":(alarmWaterMeterFault.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å·æ°´ : ") ;
        sb.append(alarmSteal == null?"未知":(alarmSteal.byteValue()==1?"报警":(alarmSteal.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      æµé‡è®¡æŸå : ") ;
        sb.append(alarmWaterMeterBreak == null?"未知":(alarmWaterMeterBreak.byteValue()==1?"报警":(alarmWaterMeterBreak.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      ç”µè¡¨æ•…éšœ : ") ;
        sb.append(alarmEleMeterFault == null?"未知":(alarmEleMeterFault.byteValue()==1?"报警":(alarmEleMeterFault.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å‰©ä½™é‡‘额为0关泵/阀 : ") ;
        sb.append(alarm0MoneyRemain == null?"未知":(alarm0MoneyRemain.byteValue()==1?"报警":(alarm0MoneyRemain.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      æŽ§åˆ¶å™¨å†…é—¨ : ") ;
        sb.append(alarmInnerDoor == null?"未知":(alarmInnerDoor.byteValue()==1?"报警":(alarmInnerDoor.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      æŽ§åˆ¶å™¨å¤–é—¨ : ") ;
        sb.append(alarmOuterDoor == null?"未知":(alarmOuterDoor.byteValue()==1?"报警":(alarmOuterDoor.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      äº¤æµç¼ºé¡¹ : ") ;
        sb.append(alarmEleMiss == null?"未知":(alarmEleMiss.byteValue()==1?"报警":(alarmEleMiss.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      äº¤æµè¿‡æµ : ") ;
        sb.append(alarmEleExceed == null?"未知":(alarmEleExceed.byteValue()==1?"报警":(alarmEleExceed.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      ä¸‰ç›¸ç”µæ¬ åŽ‹ : ") ;
        sb.append(alarmEleLowVolt == null?"未知":(alarmEleLowVolt.byteValue()==1?"报警":(alarmEleLowVolt.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      IC卡使能 : ") ;
        sb.append(stateIcEnable == null?"未知":(stateIcEnable.byteValue()==1?"支持":(stateIcEnable.byteValue()==0?"不支持":"未知"))) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd81Vo.java
New file
@@ -0,0 +1,85 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//设备终端随机自报
@Data
public class DataCd81Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public Byte statePump ; //æ³µ/阀状态    (1:开泵/阀;0:关泵/阀)
    public Byte alarmWaterRemain ; //剩余水量报警    (1:小于报警上限报警 0:正常)
    public Byte alarm0WaterRemain ; //剩余水量为0关泵/阀    (1:剩余水量为0关泵  0:正常)
    public Byte alarmExceedYear ; //年度超采报警    (1:年用水量大于限制水量报警 0:正常)
    public Byte alarmWaterMeterFault ; //外部流量计故障    (1:流量计故障报警 0:正常)
    public Byte alarmSteal ; //偷水报警    (1:绕开控制器用水报警 0:正常)
    public Byte alarmWaterMeterBreak ; //流量计损坏报警    (1:正常通讯但瞬时为0报警 0:正常)
    public Byte alarmEleMeterFault ; //电表故障报警    (1:和电表通讯断或数据不正常 0:正常)
    public Byte alarm0MoneyRemain ; //剩余金额为0关泵/阀    (1:剩余金额为0报警  0:正常)
    public Byte alarmInnerDoor ; //控制器内门报警    (1:内门打开报警    0:正常)
    public Byte alarmOuterDoor ; //控制器外门报警    (1:外门打开报警    0:正常)
    public Byte alarmEleMiss ; //交流缺项报警    (1:三相缺项报警    0:正常)
    public Byte alarmEleExceed ; //交流过流报警    (1:交流过流报警    0:正常)
    public Byte alarmEleLowVolt ; //三相电欠压报警    (1:欠压报警        0:正常)
    public Byte stateIcEnable ; //IC卡使能    (1、IC有刷卡支持    0:不支持)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      è®¾å¤‡ç»ˆç«¯éšæœºè‡ªæŠ¥ : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      æ³µçŠ¶æ€ : ") ;
        sb.append(statePump == null?"未知":(statePump.byteValue()==1?"æ³µ/阀开":(statePump.byteValue()==0?"æ³µ/阀关":"未知"))) ;
        sb.append("      å‰©ä½™æ°´é‡æŠ¥è­¦ : ") ;
        sb.append(alarmWaterRemain == null?"未知":(alarmWaterRemain.byteValue()==1?"小于报警上限":(alarmWaterRemain.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å‰©ä½™æ°´é‡ä¸º0关泵/阀 : ") ;
        sb.append(alarm0WaterRemain == null?"未知":(alarm0WaterRemain.byteValue()==1?"归零关泵/阀":(alarm0WaterRemain.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å¹´åº¦è¶…采 : ") ;
        sb.append(alarmExceedYear == null?"未知":(alarmExceedYear.byteValue()==1?"报警":(alarmExceedYear.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å¤–部流量计故障 : ") ;
        sb.append(alarmWaterMeterFault == null?"未知":(alarmWaterMeterFault.byteValue()==1?"报警":(alarmWaterMeterFault.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å·æ°´ : ") ;
        sb.append(alarmSteal == null?"未知":(alarmSteal.byteValue()==1?"报警":(alarmSteal.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      æµé‡è®¡æŸå : ") ;
        sb.append(alarmWaterMeterBreak == null?"未知":(alarmWaterMeterBreak.byteValue()==1?"报警":(alarmWaterMeterBreak.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      ç”µè¡¨æ•…éšœ : ") ;
        sb.append(alarmEleMeterFault == null?"未知":(alarmEleMeterFault.byteValue()==1?"报警":(alarmEleMeterFault.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      å‰©ä½™é‡‘额为0关泵/阀 : ") ;
        sb.append(alarm0MoneyRemain == null?"未知":(alarm0MoneyRemain.byteValue()==1?"报警":(alarm0MoneyRemain.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      æŽ§åˆ¶å™¨å†…é—¨ : ") ;
        sb.append(alarmInnerDoor == null?"未知":(alarmInnerDoor.byteValue()==1?"报警":(alarmInnerDoor.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      æŽ§åˆ¶å™¨å¤–é—¨ : ") ;
        sb.append(alarmOuterDoor == null?"未知":(alarmOuterDoor.byteValue()==1?"报警":(alarmOuterDoor.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      äº¤æµç¼ºé¡¹ : ") ;
        sb.append(alarmEleMiss == null?"未知":(alarmEleMiss.byteValue()==1?"报警":(alarmEleMiss.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      äº¤æµè¿‡æµ : ") ;
        sb.append(alarmEleExceed == null?"未知":(alarmEleExceed.byteValue()==1?"报警":(alarmEleExceed.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      ä¸‰ç›¸ç”µæ¬ åŽ‹ : ") ;
        sb.append(alarmEleLowVolt == null?"未知":(alarmEleLowVolt.byteValue()==1?"报警":(alarmEleLowVolt.byteValue()==0?"正常":"未知"))) ;
        sb.append("\n") ;
        sb.append("      IC卡使能 : ") ;
        sb.append(stateIcEnable == null?"未知":(stateIcEnable.byteValue()==1?"支持":(stateIcEnable.byteValue()==0?"不支持":"未知"))) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd8AVo.java
New file
@@ -0,0 +1,44 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//设备登录
@Data
public class DataCd8AVo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public Double lng ;//经度
    public Double lat ;//纬度
    public Float softVersion ;//软件版本号
    public Float hardVersion ;//硬件版本号
    public Float protocolVersion ;//协议版本号
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      è®¾å¤‡ç™»å½• : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      ç»åº¦ : ") ;
        sb.append(lng == null?"未知":lng) ;
        sb.append("\n") ;
        sb.append("      çº¬åº¦ : ") ;
        sb.append(lat == null?"未知":lat) ;
        sb.append("\n") ;
        sb.append("      è½¯ä»¶ç‰ˆæœ¬å· : ") ;
        sb.append(softVersion == null?"未知":softVersion) ;
        sb.append("\n") ;
        sb.append("      ç¡¬ä»¶ç‰ˆæœ¬å· : ") ;
        sb.append(hardVersion == null?"未知":hardVersion) ;
        sb.append("\n") ;
        sb.append("      åè®®ç‰ˆæœ¬å· : ") ;
        sb.append(protocolVersion == null?"未知":protocolVersion) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd97Vo.java
New file
@@ -0,0 +1,29 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//清除设备终端用户用水记录
@Data
public class DataCd97Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public Boolean success ;//命令结果(true成功, false失败)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      æ¸…除设备终端用户用水记录 : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      å‘½ä»¤ç»“æžœ : ") ;
        sb.append(success == null?"未知":(success?"成功":"失败")) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/upVos/DataCd98Vo.java
New file
@@ -0,0 +1,29 @@
package com.dy.common.mw.protocol.p206V202404.upVos;
import lombok.Data;
//清除设备终端用户用水记录
@Data
public class DataCd98Vo {
    public String controllerType;//控制器类型:   01:测控一体阀;57:井电控制器
    public Integer projectNo ;//项目编号:
    public Boolean success ;//命令结果(true成功, false失败)
    public String toString(){
        StringBuffer sb = new StringBuffer() ;
        sb.append("      æ¸…除设备终端用户用水记录 : \n") ;
        sb.append("      æŽ§åˆ¶å™¨ç±»åž‹ : ") ;
        sb.append(controllerType == null?"未知":(controllerType.equals("01")?"测控一体阀":(controllerType.equals("57")?"井电控制器":"未知"))) ;
        sb.append("\n") ;
        sb.append("      é¡¹ç›®ç¼–号 : ") ;
        sb.append(projectNo == null?"未知":projectNo) ;
        sb.append("\n") ;
        sb.append("      å‘½ä»¤ç»“æžœ : ") ;
        sb.append(success == null?"未知":(success?"成功":"失败")) ;
        sb.append("\n") ;
        return sb.toString() ;
    }
}
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/mw/protocol/p206V202404/˵Ã÷.txt
New file
@@ -0,0 +1,5 @@
根据王江海制定的新协议《智能控制终端与管理平台传输协议规范240424.doc》实现
靳总版测控一体阀与王江海版测控一体阀不能在同一个中间件运行,
因为两个版本的协议协议头都一样,没法区分开来,如果两种设备
都要应用,需要部署两个通信中间件。
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/ByteUtil.java
@@ -1195,7 +1195,7 @@
    }
    /**
     * å¤§ç«¯æ¨¡å¼ã€Šæ•°æ®ä½Žä½åœ¨æ•°ç»„高字节》
     * å°ç«¯æ¨¡å¼ã€Šæ•°æ®ä½Žä½åœ¨æ•°ç»„高字节》
     * å­—符串转换成byte数组
     * @value bs byte[]
     * @value str String
pipIrr-platform/pipIrr-common/src/main/java/com/dy/common/util/DateTime.java
@@ -415,16 +415,29 @@
    }
    public static Integer week_Int(){
        String str = week_Str() ;
        return switch (str) {
            case "Mon" -> 1;
            case "Tue" -> 2;
            case "Wed" -> 3;
            case "Thu" -> 4;
            case "Fri" -> 5;
            case "Sat" -> 6;
            case "Sun" -> 7;
            default -> 0;
        };
        if(str.startsWith("周")){
            return switch (str) {
                case "周一" -> 1;
                case "周二" -> 2;
                case "周三" -> 3;
                case "周四" -> 4;
                case "周五" -> 5;
                case "周六" -> 6;
                case "周七" -> 7;
                default -> 0;
            };
        }else{
            return switch (str) {
                case "Mon" -> 1;
                case "Tue" -> 2;
                case "Wed" -> 3;
                case "Thu" -> 4;
                case "Fri" -> 5;
                case "Sat" -> 6;
                case "Sun" -> 7;
                default -> 0;
            };
        }
    }
    /**
     * ä¸¤ä¸ªæ—¥æœŸé—´ç›¸å·®ç§’é’Ÿæ•°
@@ -1568,13 +1581,7 @@
        String[] s = new String[3] ;
        s[0] = ymd.substring(0 , 4) ;
        s[1] = ymd.substring(5 , 7) ;
        if(s[1].charAt(0) == '0'){
            s[1] = s[1].substring(1) ;
        }
        s[2] = ymd.substring(8,10) ;
        if(s[2].charAt(0) == '0'){
            s[2] = s[2].substring(1) ;
        }
        return s ;
    }
    /**