You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
5.8 KiB
121 lines
5.8 KiB
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<String, ServerSession> map = SessionMap.inst().getMap(); |
|
Set<Map.Entry<String, ServerSession>> entries = map.entrySet(); |
|
boolean flag = false; |
|
String keyVal = null; |
|
String heartBeat = gatewayManageEntity.getHeartBeat().toUpperCase(); |
|
for (Map.Entry<String, ServerSession> 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; |
|
} |
|
}
|
|
|