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().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; } }