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<String, NettyUpgradeStcdInfo> 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<String> 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<String> 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;
|
}
|
}
|