package com.ruoyi.netty.communication; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.dto.NettyUpgradeStcdInfoDTO; import com.ruoyi.common.utils.netty.*; import com.ruoyi.system.domain.NettyUpgradeStcdInfo; import io.netty.channel.Channel; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author 86175 */ @Slf4j public class DecisionIdentifier { /** * @param receiveStr 报文的具体数据内容 * @para通道m channel netty * @author fxck * @date 2022/6/9 17:41 */ public static void ScreenIdentifier(String receiveStr, ApplicationContext act) { if (receiveStr.startsWith("68") ) { String stcd = receiveStr.substring(40, 46); RedisCache redisCache = act.getBean(RedisCache.class); NettyUpgradeStcdInfo nettyUpgradeStcdInfo = redisCache.getCacheMapValue("NettyUpgradeStcdInfo", stcd); if (nettyUpgradeStcdInfo != null) { nettyUpgradeStcdInfo.setState(0); } else { NettyUpgradeStcdInfo nettyUpgradeStcdInfo1 = new NettyUpgradeStcdInfo(); nettyUpgradeStcdInfo1.setStcd(stcd); nettyUpgradeStcdInfo1.setState(0); nettyUpgradeStcdInfo = nettyUpgradeStcdInfo1; } //设置转态 switch (receiveStr.substring(46, 48)){ case "85": Analysis(nettyUpgradeStcdInfo, receiveStr); break; } Map map = new HashMap<>(); map.put(stcd, nettyUpgradeStcdInfo); redisCache.setCacheMap("NettyUpgradeStcdInfo", map); } if (receiveStr.startsWith("aa")) { String a = receiveStr.substring(6, 14); String stcd = receiveStr.substring(12, 14) + receiveStr.substring(10, 12) + receiveStr.substring(8, 10); RedisCache redisCache = act.getBean(RedisCache.class); NettyUpgradeStcdInfo nettyUpgradeStcdInfo = redisCache.getCacheMapValue("NettyUpgradeStcdInfo", stcd); nettyUpgradeStcdInfo.setState(1); redisCache.setCacheMapValue("NettyUpgradeStcdInfo", stcd, nettyUpgradeStcdInfo); if (nettyUpgradeStcdInfo != null) { nettyUpgradeStcdInfo.setState(1); } // String sbbh =NettyTool.addZeroForNum(stcd,8); String sbbh = stcd; /*新版程序的升级,可以单独脱机使用*/ switch (receiveStr.substring(14, 16)) { case "01": //添加延时 //解析 设备编号 //解析 设备的状态 如果正常开始运行 直接报错 if (receiveStr.substring(16, 18).equals("06")) { //开始升级 发送第一包的数据 String filenet = ChannelHandlerContextCache.cache.entrySet().iterator().next().getKey(); //设备发送数据 // String[] filenetArray= redisCache.getCacheObject(nettyUpgradeStcdInfo.getVersion()+"keys"); // String filenet=filenetArray[0]; String datastr = "40" + NettyTool.addZeroForNum(filenet.replace("@",""),6) + ChannelHandlerContextCache.fileStr.entrySet().iterator().next().getValue(); // String datastr =redisCache.getCacheMapValue(nettyUpgradeStcdInfo.getVersion()+"fileStr",filenet); String numner = NettyTool.Hexlength(datastr); String fileString = "AA0014" + receiveStr.substring(6, 14) + "0340" + NettyTool.addZeroForNum(filenet.replace("@",""), 6) + NettyTool.addZeroForNum(numner, 8) + NettyTool.getCRChigh(datastr); connectToClient.write2Client(fileString + NettyTool.getCRChigh(fileString), ConcurrentHashMapBean.channelMap.get(stcd), "下载文件信息01"); } else { log.info("设备" + sbbh + "发送命令失效!!!!升级失败,请重新升级"); } break; case "03": //添加延时 //解析数据 状态成功 开始调用方法发送第一条数据 得到包校验数据 //解析 设备编号 Integer mapkey1 = Integer.parseInt(receiveStr.substring(18, 24),16); String mapkey="@"+Integer.toHexString(mapkey1).toUpperCase(); /*得到块地址 成功*/ String filenet = ChannelHandlerContextCache.cache.get(mapkey).get(0); // // List cacheList= redisCache.getCacheMapValue(nettyUpgradeStcdInfo.getVersion()+"cache",mapkey); // String filenet = cacheList.get(0); String baoshuhex = ConvertCode.intToHexString(ChannelHandlerContextCache.cache.get(mapkey).size(), 1); // String baoshuhex = ConvertCode.intToHexString(cacheList.size(), 1); /*log.info(filenet);*/ if (receiveStr.substring(24, 26).equals("06")) { //开始发送的是第一包的数据 String fileString = "AA0212" + a + "04" + "40" + receiveStr.substring(18, 24) + NettyTool.addZeroForNum(baoshuhex, 4) + "0000" + filenet; String crc04 = NettyTool.getCRChigh(fileString); connectToClient.write2Client(fileString + NettyTool.getCRChigh(fileString), ConcurrentHashMapBean.channelMap.get(stcd), "设备【" + sbbh + "】" + "块地址:【" + mapkey + "】"); } break; case "04": //添加延时 //先判定是否成功 if (receiveStr.substring(32, 34).equals("06")) { /*查看是否最后一条数据*/ Integer kuaichangdu = Integer.parseInt(receiveStr.substring(24, 28), 16); Integer dangqianbaoshu = Integer.parseInt(receiveStr.substring(28, 32), 16) + 1; if (kuaichangdu.equals(dangqianbaoshu)) { //------------------添加块校验--------- /*向设备发送校验信息*/ String Str05 = "AA" + "000E" + a + "05" + receiveStr.substring(16, 24); connectToClient.write2Client(Str05 + NettyTool.getCRChigh(Str05), ConcurrentHashMapBean.channelMap.get(stcd), "继点续传"); } else { //下表位置 String a04 = "@" + receiveStr.substring(20, 24).toUpperCase(); Integer xiabiao04 = Integer.parseInt(receiveStr.substring(28, 32), 16) + 1; String file04 = ChannelHandlerContextCache.cache.get(a04).get(xiabiao04); // List cacheList= redisCache.getCacheMapValue(nettyUpgradeStcdInfo.getVersion()+"cache",mapkey); // String file04 =cacheList.get(xiabiao04); //第几包 Integer baoshu04 = Integer.parseInt(receiveStr.substring(28, 32), 16) + 1; String fileString04 = "AA0212" + a + "04" + "40" + receiveStr.substring(18, 24) + receiveStr.substring(24, 28) + NettyTool.addZeroForNum(NettyTool.encodeHEX(baoshu04), 4) + file04; String fileStringcrc04 = NettyTool.getCRChigh(fileString04); connectToClient.write2Client(fileString04 + NettyTool.getCRChigh(fileString04), ConcurrentHashMapBean.channelMap.get(stcd), "设备:【" + sbbh + "】 " + "当前块:【" + a04 + "】" + "当前包数:【" + baoshu04 + "】" + "总包数:【" + receiveStr.substring(24, 28) + "】"); } } else { //块递地址 String kuaiPath = receiveStr.substring(20, 24); Long zongpage = Long.parseLong(receiveStr.substring(24, 28), 16); Long danqianpage = Long.parseLong(receiveStr.substring(28, 32), 16); } break; case "05": //添加延时 //如果块地址是最后一条 那么就开始 发送整体的代码校验 if (NettyTool.Selectsubscript(ChannelHandlerContextCache.keys, receiveStr.substring(18, 24).toUpperCase()) + 1 == ChannelHandlerContextCache.keys.length) { //最后一条块已经校验完毕 String str2 = "AA000A" + a + "02"; String numner2 = NettyTool.getCRChigh(str2); String fileStr02 = str2 + numner2; connectToClient.write2Client(fileStr02, ConcurrentHashMapBean.channelMap.get(stcd), "查询最新文件校验信息"); } else { String kauidizhi = String.valueOf(ChannelHandlerContextCache.keys[NettyTool.Selectsubscript(ChannelHandlerContextCache.keys, receiveStr.substring(20, 24).toUpperCase()) + 1]); //读取下个块 log.info("块地址" + kauidizhi); String blocklenght = ChannelHandlerContextCache.fileStr.get(kauidizhi); // String blocklenght = redisCache.getCacheMapValue(nettyUpgradeStcdInfo.getVersion()+"fileStr",kauidizhi); String datastr03 = "40" +NettyTool.addZeroForNum(kauidizhi.substring(1),6) + blocklenght; String numner03 = NettyTool.Hexlength(datastr03); String str03 = "AA" + "0014" + a + "03" + "40" +NettyTool.addZeroForNum(kauidizhi.substring(1),6) + NettyTool.addZeroForNum(numner03, 8) + NettyTool.getCRChigh(datastr03); connectToClient.write2Client(str03 + NettyTool.getCRChigh(str03), ConcurrentHashMapBean.channelMap.get(stcd), "校验块03"); } break; case "02": //延迟 1秒 //进行快校验 if (receiveStr.substring(24, 26).equals("06")) { //发送在线编程的方法 String str06 = "AA000A" + a + "06"; String crc06 = NettyTool.getCRChigh(str06); connectToClient.write2Client(str06 + NettyTool.getCRChigh(str06), ConcurrentHashMapBean.channelMap.get(stcd), "在线编程"); } else { //发送在线编程的方法 String str06 = "AA000A" + a + "06"; String crc06 = NettyTool.getCRChigh(str06); connectToClient.write2Client(str06 + NettyTool.getCRChigh(str06), ConcurrentHashMapBean.channelMap.get(stcd), "在线编程"); } break; case "06": if (receiveStr.substring(16, 18).equals("06")) { //接受到的信息成功 log.info("升级 成功"); nettyUpgradeStcdInfo.setSuccessTime(new Date()); redisCache.setCacheMapValue("NettyUpgradeStcdInfo", stcd, nettyUpgradeStcdInfo); } else { log.info("校验失败---文件出现错误"); } break; default: throw new IllegalStateException("Unexpected value: " + receiveStr.substring(14, 16)); } } } public static NettyUpgradeStcdInfo Analysis(NettyUpgradeStcdInfo nettyUpgradeStcdInfo1, String receiveStr){ //设置数据属性 //交流电状态 48,49 Integer ACState = receiveStr.substring(48, 49).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setACState(ACState); //蓄电池状态 49,50 Integer batteryStatus = receiveStr.substring(49, 50).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setBatteryStatus(batteryStatus); //水位超限报警状态 50,51 Integer waterLevelAlarm = receiveStr.substring(50, 51).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setWaterLevelAlarm(waterLevelAlarm); //流量超限报警状态 51,52 Integer flowAlarm = receiveStr.substring(51, 52).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setFlowAlarm(flowAlarm); //电压状态 52,53 Integer voltageStatus = receiveStr.substring(52, 53).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setVoltageStatus(voltageStatus); //流量仪表状态 53,54 Integer flowMeterStatus = receiveStr.substring(53, 54).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setFlowMeterStatus(flowMeterStatus); //水位仪表状态 54,55 Integer waterLevelInstrument = receiveStr.substring(54, 55).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setWaterLevelInstrument(waterLevelInstrument); //终端箱门状态 55,56 Integer TerminalStatus = receiveStr.substring(55, 56).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setTerminalStatus(TerminalStatus); //存储器状态 56,57 Integer storageStatus = receiveStr.substring(56, 57).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setStorageStatus(storageStatus); //水泵工作状态 57,58 Integer waterPumpStatus = receiveStr.substring(57, 58).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setWaterPumpStatus(waterPumpStatus); //井剩余水量报警 58,59 Integer wellAlarm = receiveStr.substring(58, 59).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setWellAlarm(wellAlarm); //回路报警 59,60 Integer loopAlarm = receiveStr.substring(59, 60).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setLoopAlarm(loopAlarm); //输入断相 60,61 Integer inputPhaseFailure = receiveStr.substring(60, 61).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setInputPhaseFailure(inputPhaseFailure); //输出断相 61,62 Integer outputPhaseFailure = receiveStr.substring(61, 62).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setOutputPhaseFailure(outputPhaseFailure); //电表信号报警 62,63 Integer meterSignalAlarm = receiveStr.substring(62, 63).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setMeterSignalAlarm(meterSignalAlarm); //过载报警 63,64 Integer overloadAlarm = receiveStr.substring(63, 64).equals("1") ? 1 : 0; nettyUpgradeStcdInfo1.setOverloadAlarm(overloadAlarm); return nettyUpgradeStcdInfo1; } }