package com.panzhihua.service_property.netty;
|
|
import cn.hutool.core.date.DateUtil;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.panzhihua.common.utlis.DateUtils;
|
import com.panzhihua.common.utlis.StringUtils;
|
import com.panzhihua.service_property.dao.ComPropertyAlarmDao;
|
import com.panzhihua.service_property.dao.ComPropertyAlarmSettingDao;
|
import com.panzhihua.service_property.dao.ComPropertyEquipmentDao;
|
import com.panzhihua.service_property.entity.ComPropertyAlarm;
|
import com.panzhihua.service_property.entity.ComPropertyAlarmSetting;
|
import com.panzhihua.service_property.entity.ComPropertyEquipment;
|
import com.panzhihua.service_property.util.MyTools;
|
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.amqp.rabbit.core.RabbitTemplate;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.stereotype.Component;
|
|
import javax.annotation.PostConstruct;
|
import javax.annotation.Resource;
|
import java.time.Duration;
|
import java.util.Date;
|
import java.util.Objects;
|
|
@Slf4j
|
@Component
|
public class NettyServerHandler extends ChannelInboundHandlerAdapter {
|
@Resource
|
private ComPropertyAlarmDao comPropertyAlarmDao;
|
@Resource
|
private ComPropertyAlarmSettingDao comPropertyAlarmSettingDao;
|
@Resource
|
private ComPropertyEquipmentDao comPropertyEquipmentDao;
|
@Resource
|
private StringRedisTemplate stringRedisTemplate;
|
@Resource
|
private RabbitTemplate rabbitTemplate;
|
|
private static NettyServerHandler nettyServerHandler;
|
|
/**
|
* 客户端连接会触发
|
*/
|
@Override
|
public void channelActive(ChannelHandlerContext ctx) throws Exception {
|
log.info("Channel active......");
|
}
|
|
/**
|
* 客户端发消息会触发
|
*/
|
@Override
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
MyTools myTools = new MyTools();
|
log.info("服务器收到消息: {}", msg.toString());
|
if (msg.toString().startsWith("4A1802")) {
|
myTools.writeToClient("404A021823", ctx, "状态包");
|
}
|
if (msg.toString().startsWith("4A0C01")) {
|
myTools.writeToClient("404A01" + DateUtils.getDateFormatString(new Date(), "HHmmss") + "23", ctx, "心跳包");
|
}
|
if (msg.toString().startsWith("4A1803")) {
|
String serial = msg.toString().substring(14, 24);
|
myTools.writeToClient("404A03" + msg.toString().substring(msg.toString().length() - 2) + "23", ctx, "事件包");
|
if (msg.toString().startsWith("4A18031")) {
|
//正式处理
|
delayAlarm(serial);
|
//展会处理
|
// ComPropertyAlarm comPropertyAlarm = new ComPropertyAlarm();
|
// comPropertyAlarm.setCreateTime(DateUtil.date());
|
// comPropertyAlarm.setSerialNo(serial);
|
// comPropertyAlarm.setType(ComPropertyAlarm.type.one);
|
// nettyServerHandler.comPropertyAlarmDao.insert(comPropertyAlarm);
|
}
|
|
}
|
ctx.flush();
|
}
|
|
/**
|
* 发生异常触发
|
*/
|
@Override
|
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
cause.printStackTrace();
|
ctx.close();
|
}
|
|
@PostConstruct
|
public void init() {
|
nettyServerHandler = this;
|
nettyServerHandler.comPropertyAlarmDao = this.comPropertyAlarmDao;
|
nettyServerHandler.stringRedisTemplate = this.stringRedisTemplate;
|
nettyServerHandler.rabbitTemplate = this.rabbitTemplate;
|
}
|
|
//报警事件包延迟处理方法
|
private void delayAlarm(String serial) {
|
int duration = 0;
|
if (StringUtils.isNotEmpty(serial)) {
|
|
ComPropertyEquipment comPropertyEquipment = new ComPropertyEquipment();
|
if (nettyServerHandler.stringRedisTemplate.hasKey(serial)) {
|
comPropertyEquipment = JSONObject.parseObject(nettyServerHandler.stringRedisTemplate.boundValueOps(serial).get(), ComPropertyEquipment.class);
|
duration = getDuration(Objects.requireNonNull(comPropertyEquipment));
|
nettyServerHandler.stringRedisTemplate.boundValueOps(serial).set(JSONObject.toJSONString(comPropertyEquipment), Duration.ofHours(duration));
|
} else {
|
comPropertyEquipment = nettyServerHandler.comPropertyEquipmentDao.selectOne(new QueryWrapper<ComPropertyEquipment>().eq("serial_no", serial));
|
duration = getDuration(comPropertyEquipment);
|
nettyServerHandler.stringRedisTemplate.boundValueOps(serial).set(JSONObject.toJSONString(comPropertyEquipment));
|
}
|
int finalDuration = duration;
|
nettyServerHandler.rabbitTemplate.convertAndSend("huacheng.delayed.exchange", "huacheng.delayed.key", comPropertyEquipment, message -> {
|
message.getMessageProperties().setHeader("x-delay", finalDuration * 1000 * 3601);
|
return message;
|
});
|
}
|
}
|
|
private int getDuration(ComPropertyEquipment comPropertyEquipment) {
|
int duration;
|
if (nettyServerHandler.stringRedisTemplate.hasKey(comPropertyEquipment.getCommunityId().toString())) {
|
duration = Integer.parseInt(nettyServerHandler.stringRedisTemplate.boundValueOps(comPropertyEquipment.getCommunityId().toString()).get());
|
} else {
|
ComPropertyAlarmSetting comPropertyAlarmSetting = nettyServerHandler.comPropertyAlarmSettingDao.getByCommunityId(comPropertyEquipment.getCommunityId());
|
duration = comPropertyAlarmSetting.getTriggerTime();
|
nettyServerHandler.stringRedisTemplate.boundValueOps(comPropertyEquipment.getCommunityId().toString()).set(comPropertyAlarmSetting.getTriggerTime().toString());
|
}
|
return duration;
|
}
|
}
|