中央热水项目
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

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;
}
}