package com.mh.user.tcp; import com.mh.common.utils.StringUtils; import com.mh.user.constants.Constant; import com.mh.user.entity.DeviceCodeParamEntity; import com.mh.user.entity.GatewayManageEntity; import com.mh.user.factory.Device; import com.mh.user.factory.DeviceFactory; import com.mh.user.netty.session.ServerSession; import com.mh.user.netty.session.SessionMap; import com.mh.user.service.BuildingService; import com.mh.user.service.DeviceInstallService; import com.mh.user.service.NowDataService; import com.mh.user.strategy.DeviceStrategy; import com.mh.user.strategy.DeviceStrategyFactory; import com.mh.user.utils.*; import lombok.extern.slf4j.Slf4j; import org.springframework.context.ApplicationContext; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; /** * @author nxr * @title : * @description : 串口发送和接收处理,操作类 * @updateTime 2022-08-10 * @throws : */ @Slf4j public class TcpSingle { // 调用service ApplicationContext context = SpringBeanUtil.getApplicationContext(); DeviceInstallService deviceInstallService = context.getBean(DeviceInstallService.class); NowDataService nowDataService = context.getBean(NowDataService.class); BuildingService buildingService = context.getBean(BuildingService.class); public String serialPortSend(DeviceCodeParamEntity deviceCodeParamEntity, GatewayManageEntity gatewayManageEntity) { String rtData = "fail"; String comName = deviceCodeParamEntity.getDataCom().toUpperCase(); if (StringUtils.isBlank(comName)) { return rtData; } try { // 创建设备报文 Device device = DeviceFactory.createDevice(deviceCodeParamEntity.getDeviceType()); DeviceStrategy strategy = DeviceStrategyFactory.createStrategy(deviceCodeParamEntity.getDeviceType()); if (null == strategy) { return rtData; } device.setStrategy(strategy); String sendStr = device.createOrders(deviceCodeParamEntity); //从获取响应数据 ConcurrentHashMap map = SessionMap.inst().getMap(); Set> entries = map.entrySet(); boolean flag = false; String keyVal = null; String heartBeat = gatewayManageEntity.getHeartBeat().toUpperCase(); for (Map.Entry entry : entries) { String key = entry.getKey(); //log.info("当前session:{},当前sessionId:{},当前在线设备数:{}",entry,entry.getValue().getSessionId(),map.size()); if (key.contains(heartBeat)) { flag = true; keyVal = key; break; } } if (flag) { ServerSession serverSession = map.get(keyVal); serverSession.getChannel().writeAndFlush(NettyTools.createByteBuf(sendStr)); NettyTools.initReceiveMsg(heartBeat); String receiveStr = ""; if (Constant.WEB_FLAG) { receiveStr = NettyTools.waitReceiveMsg(heartBeat); } if (StringUtils.isBlank(receiveStr)) { return Constant.FAIL; } receiveStr = receiveStr.replace("null", "").replace(" ", ""); log.info("TCP客户端" + heartBeat + "接收数据:" + receiveStr + ",大小: " + receiveStr.length()); //返回值全部变成大写 String receiveData = receiveStr.toUpperCase(); //截取去掉FE String deviceType = deviceCodeParamEntity.getDeviceType(); String deviceAddr = deviceCodeParamEntity.getDeviceAddr(); String dataStr = ""; if (receiveData.length() > 8 && ("水表".equals(deviceType) || "电表".equals(deviceType))) { String str1 = receiveData.substring(0, 8); String str2 = receiveData.substring(8); dataStr = str1.replace("FE", "") + str2; } else { dataStr = receiveData; } String registerAddr = deviceCodeParamEntity.getRegisterAddr(); String brand = deviceCodeParamEntity.getBrand(); String buildingId = deviceCodeParamEntity.getBuildingId(); String buildingName = buildingService.queryBuildingName(buildingId); //查询楼栋名称 deviceInstallService.updateOnline(deviceAddr, deviceType, buildingId, "在线"); //设备在线 log.info("{}在线,设备号:{},所属楼栋:{}", deviceType, deviceAddr, buildingName); if (deviceType.equals("热泵")) { String strState = nowDataService.selectStateByPumpName(buildingId, deviceAddr, deviceCodeParamEntity.getDeviceName()); if (strState != null && strState.equals("离线")) { //采集到数据 nowDataService.updateRunState(buildingId, deviceAddr, "不运行", buildingName, comName); //监控界面状态表热泵在线状态 } } rtData = device.analysisReceiveData(DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss"), deviceType, registerAddr, brand, buildingId, buildingName, dataStr, deviceCodeParamEntity); return rtData; } else { log.error("没有找到心跳包数据:{}", heartBeat); } } catch (Exception e) { log.info("单抄TCP客户端:{}异常,没有数据返回!关闭串口", gatewayManageEntity.getHeartBeat(), e); } return Constant.FAIL; } }