|
|
|
@ -30,6 +30,7 @@ import java.math.BigDecimal;
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
import java.util.Date; |
|
|
|
|
import java.util.List; |
|
|
|
|
import java.util.concurrent.TimeUnit; |
|
|
|
|
|
|
|
|
|
@Slf4j |
|
|
|
|
public class EchoServerHandler extends ChannelInboundHandlerAdapter { |
|
|
|
@ -143,7 +144,7 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter {
|
|
|
|
|
deviceCodeParamList = arrayCache.toList(CollectionParamsManage.class); |
|
|
|
|
} |
|
|
|
|
size = deviceCodeParamList.size(); |
|
|
|
|
log.info("deviceCodeParam size ===> {}", size); |
|
|
|
|
// log.info("deviceCodeParam size ===> {}", size);
|
|
|
|
|
// 清空receiveStr
|
|
|
|
|
receiveStr = ""; |
|
|
|
|
num = 0; |
|
|
|
@ -160,30 +161,79 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter {
|
|
|
|
|
log.info("gateway not find deviceCodeParam!"); |
|
|
|
|
} |
|
|
|
|
} else if (receiveStr.length() == 18) { |
|
|
|
|
// 水电表、热泵设置返回数据解析
|
|
|
|
|
// 水电表返回数据解析
|
|
|
|
|
idleCount = 1; |
|
|
|
|
log.info("水电表、热泵设置接收==>{},长度:{}", receiveStr, receiveStr.length()); |
|
|
|
|
nextSendOrder(ctx); |
|
|
|
|
} else if (receiveStr.length() == 12 || receiveStr.length() == 14) { |
|
|
|
|
// 热泵返回数据解析
|
|
|
|
|
idleCount = 1; |
|
|
|
|
log.info("热泵读取接收===>{},长度:{}", receiveStr, receiveStr.length()); |
|
|
|
|
nextSendOrder(ctx); |
|
|
|
|
} else if (receiveStr.length() == 16) { |
|
|
|
|
// 热泵设置指令返回
|
|
|
|
|
// 判断是否有指令发送
|
|
|
|
|
if (redisCache.hasKey("order_send") && redisCache.getCacheObject("order_send").equals(receiveStr)) { |
|
|
|
|
NettyTools.setReceiveMsg("order_wait", receiveStr); |
|
|
|
|
log.info("热泵读取接收===>{},长度:{},是否存在order_send_read: {}", receiveStr, receiveStr.length(), redisCache.hasKey("order_send_read")); |
|
|
|
|
if (redisCache.hasKey("order_send_read")) { |
|
|
|
|
log.error("order_send_read存在,接收到指令是{}", receiveStr); |
|
|
|
|
CollectionParamsManage collectionParamsManage = new CollectionParamsManage(); |
|
|
|
|
collectionParamsManage.setDataType(2); |
|
|
|
|
collectionParamsManage.setParamType("14"); |
|
|
|
|
Object orderSend = redisCache.getCacheObject("order_send_read"); |
|
|
|
|
String orderSendStr = String.valueOf(orderSend); |
|
|
|
|
String substring = orderSendStr.substring(0, 2); |
|
|
|
|
collectionParamsManage.setOtherName(ExchangeStringUtil.hexToDec(substring) + "号热泵温度设置"); |
|
|
|
|
analysisReceiveData(receiveStr, collectionParamsManage); |
|
|
|
|
redisCache.deleteObject("order_send_read"); |
|
|
|
|
} else { |
|
|
|
|
nextSendOrder(ctx); |
|
|
|
|
} |
|
|
|
|
} else if (receiveStr.length() == 16) { |
|
|
|
|
idleCount = 1; |
|
|
|
|
nextSendOrder(ctx); |
|
|
|
|
} else if (receiveStr.length() > 50 && receiveStr.length() < 100) { |
|
|
|
|
// 热泵设置指令返回
|
|
|
|
|
controlOrder(ctx); |
|
|
|
|
} else if (receiveStr.length() > 20 && receiveStr.length() < 100) { |
|
|
|
|
idleCount = 1; |
|
|
|
|
// 清空receiveStr
|
|
|
|
|
nextSendOrder(ctx); |
|
|
|
|
controlOrder(ctx); |
|
|
|
|
} |
|
|
|
|
ctx.flush(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void controlOrder(ChannelHandlerContext ctx) { |
|
|
|
|
// 热泵设置指令返回
|
|
|
|
|
if (redisCache.hasKey("order_send")) { |
|
|
|
|
// 判断是否有指令发送
|
|
|
|
|
Object orderSend = redisCache.getCacheObject("order_send"); |
|
|
|
|
String orderSendStr = String.valueOf(orderSend); |
|
|
|
|
// // 发送读取热泵设置温度
|
|
|
|
|
// String controlCode = ModbusUtils.createReadOrder(orderSendStr.substring(0, 2),
|
|
|
|
|
// "03",
|
|
|
|
|
// "0003",
|
|
|
|
|
// "1");
|
|
|
|
|
// SendOrderUtils.sendOrderToDTU(ctx, controlCode);
|
|
|
|
|
if (receiveStr.contains(orderSendStr)) { |
|
|
|
|
String readOrder = ModbusUtils.createReadOrder(orderSendStr.substring(0, 2), |
|
|
|
|
"03", |
|
|
|
|
"0003", |
|
|
|
|
"1"); |
|
|
|
|
// 初始化发送指令
|
|
|
|
|
// NettyTools.initReceiveMsg("order_wait_read");
|
|
|
|
|
// 发送读取指令
|
|
|
|
|
redisCache.setCacheObject("order_send_read", readOrder, 10, TimeUnit.SECONDS); |
|
|
|
|
ctx.writeAndFlush(ModbusUtils.createByteBuf(readOrder)); |
|
|
|
|
// 发送读取指令
|
|
|
|
|
log.error("热泵设置读取指令发送:{},order_send_read键值:{}", readOrder, redisCache.hasKey("order_send_read")); |
|
|
|
|
log.error("热泵设置指令返回:{}", receiveStr); |
|
|
|
|
NettyTools.setReceiveMsg("order_wait", receiveStr); |
|
|
|
|
redisCache.deleteObject("order_send"); |
|
|
|
|
receiveStr = ""; |
|
|
|
|
try { |
|
|
|
|
Thread.sleep(500); |
|
|
|
|
} catch (InterruptedException e) { |
|
|
|
|
throw new RuntimeException(e); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void dealSession(ChannelHandlerContext ctx) { |
|
|
|
|
// 获取表号
|
|
|
|
|
String deviceCode =receiveStr; |
|
|
|
@ -227,10 +277,15 @@ public class EchoServerHandler extends ChannelInboundHandlerAdapter {
|
|
|
|
|
|
|
|
|
|
private void nextSendOrder(ChannelHandlerContext ctx) throws InterruptedException { |
|
|
|
|
// 发送指令响应不用解析
|
|
|
|
|
if (receiveStr.length() != 16) { |
|
|
|
|
if (receiveStr.length() != 16 && receiveStr.length() < 20) { |
|
|
|
|
// 解析采集的报文,并保存到数据库
|
|
|
|
|
analysisReceiveData(receiveStr, deviceCodeParamList.get(num)); |
|
|
|
|
} |
|
|
|
|
// 判断是否有远程指令发送,如果有先不采集
|
|
|
|
|
if (redisCache.hasKey("order_send")) { |
|
|
|
|
log.error("有远程设置指令发送,不进行采集"); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
// 清空receiveStr
|
|
|
|
|
receiveStr = ""; |
|
|
|
|
// 判断发送的下标,如果不等于指令数组大小
|
|
|
|
|