上饶市公安局wvp平台
zhongrj
2023-06-27 2e98b20bea4463e4465e3c19059d0744a09aec06
src/main/java/com/genersoft/iot/vmp/netty/handle/UdpServerHandler.java
New file
@@ -0,0 +1,191 @@
package com.genersoft.iot.vmp.netty.handle;
import com.genersoft.iot.vmp.gb28181.bean.DeviceChannel;
import com.genersoft.iot.vmp.netty.business.entity.TalkBackEquipment;
import com.genersoft.iot.vmp.netty.business.service.TalkBackEquipmentService;
import com.genersoft.iot.vmp.policeBodyCamera.service.DeviceChannelPoliceCameraService;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.socket.DatagramPacket;
import io.netty.util.CharsetUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import static com.genersoft.iot.vmp.netty.config.MyDecoder.hexToByte;
import static com.genersoft.iot.vmp.netty.config.MyDecoder.hexTohort;
import static com.genersoft.iot.vmp.netty.util.Hex.getDouble;
import static com.genersoft.iot.vmp.netty.util.Hex.hexStr2Str;
/**
 * updHandler udp 服务端数据接收处理
 * @author zhongrj
 * @date 2023-02-21
 */
@Component
public class UdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> {
   private Logger logger = LoggerFactory.getLogger(this.getClass());
   private static UdpServerHandler udpServerHandler;
   @Autowired
   private TalkBackEquipmentService talkBackEquipmentService;
   @Autowired
   private DeviceChannelPoliceCameraService deviceChannelPoliceCameraService;
   @PostConstruct
   public void init() {
      udpServerHandler = this;
      udpServerHandler.talkBackEquipmentService = this.talkBackEquipmentService;
      udpServerHandler.deviceChannelPoliceCameraService = this.deviceChannelPoliceCameraService;
   }
   @Override
   protected void channelRead0(ChannelHandlerContext channelHandlerContext, DatagramPacket datagramPacket) throws Exception {
      // 读取收到的数据
      ByteBuf buf = (ByteBuf) datagramPacket.copy().content();
      byte[] req = new byte[buf.readableBytes()];
      buf.readBytes(req);
      String body = new String(req, CharsetUtil.UTF_8);
      // 字节转16进制字符串
      String s = bytesToHexString(req);
      //获取字符串的长度
      int length = s.length();
//      System.out.println("数据长度>>>>>> = " + length);
      //数据解析
      dataHandler(s);
   }
   /**
    * 数据解析
    * @param s 16位字符串
    */
   private void dataHandler(String s) {
//      s = "AAAACCCC220000000033373933343732393100000000000000000000000052D50451F77D5D406C04E275FD723C400000015F0000000507E70306103B0A";
      //创建设备对象
      TalkBackEquipment backEquipment = new TalkBackEquipment();
      if (s.substring(4,8).equals("CCCC")) {
         backEquipment.setStatus(1);
      }
      //断开连接
      if (s.substring(4,8).equals("FFFF")) {
         backEquipment.setStatus(0);
      }
      //截取字符串
      backEquipment.setTerminalNumber(hexStr2Str(s.substring(20, 60)));
      backEquipment.setLongitude(Double.toString(getDouble(s.substring(60, 76))));
      backEquipment.setLatitude(Double.toString(getDouble(s.substring(76, 92))));
      backEquipment.setSpeed(Short.toString(hexTohort(s.substring(92, 96))));
      backEquipment.setDirection(Short.toString(hexTohort(s.substring(96, 100))));
      backEquipment.setElevation(Short.toString(hexTohort(s.substring(100, 104))));
      backEquipment.setPrecisions(Short.toString(hexTohort(s.substring(104, 108))));
      String year = Short.toString(hexTohort(s.substring(108, 112)));
      String month = Short.toString(hexToByte(s.substring(112, 114)));
      if (Integer.parseInt(month)<10){
         month = "0" + month;
      }
      String day = Short.toString(hexToByte(s.substring(114, 116)));
      if (Integer.parseInt(day)<10){
         day = "0" + day;
      }
      String hour = Short.toString(hexToByte(s.substring(116, 118)));
      if (Integer.parseInt(hour)<10){
         hour = "0" + hour;
      }
      String minute = Short.toString(hexToByte(s.substring(118, 120)));
      if (Integer.parseInt(minute)<10){
         minute = "0" + minute;
      }
      String second = Short.toString(hexToByte(s.substring(120, 122)));
      if (Integer.parseInt(second)<10){
         second = "0" + second;
      }
      String time = year + "-" + month + "-" + day +" " + hour + ":" + minute + ":" + second;
      //时间拼接
      try {
         backEquipment.setReceiveTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(time));
      } catch (ParseException e) {
         e.printStackTrace();
      }
      backEquipment.setUpdateTime(new Date());
      // 新增
      udpServerHandler.talkBackEquipmentService.save(backEquipment);
   }
   /**
    * 转换
    * @param bArray
    * @return
    */
   public String bytesToHexString(byte[] bArray) {
      StringBuffer sb = new StringBuffer(bArray.length);
      String sTemp;
      for (int i = 0; i < bArray.length; i++) {
         sTemp = Integer.toHexString(0xFF & bArray[i]);
         if (sTemp.length() < 2)
            sb.append(0);
         sb.append(sTemp.toUpperCase());
      }
      return sb.toString();
   }
   /**
    * 保存设备数据--测试
    * @param body
    */
   @Async
   public void saveTalkBackEquipmentInfo(String body) {
      DeviceChannel deviceChannelPoliceCamera = new DeviceChannel();
      deviceChannelPoliceCamera.setAddress("");
      deviceChannelPoliceCamera.setDeviceId("123");
      deviceChannelPoliceCamera.setName("CS");
      deviceChannelPoliceCamera.setLongitude(128.125412);
      deviceChannelPoliceCamera.setLatitude(29.1254124);
      deviceChannelPoliceCamera.setPTZTypeText("111");
      deviceChannelPoliceCamera.setCertNum("10");
      deviceChannelPoliceCamera.setPTZType(1);
      deviceChannelPoliceCamera.setStatus(1);
      deviceChannelPoliceCamera.setChannelId("123456");
      udpServerHandler.deviceChannelPoliceCameraService.insertDeviceChannelPoliceCamera(deviceChannelPoliceCamera);
   }
   /**
    * 捕获异常
    * @param ctx
    * @param cause
    * @throws Exception
    */
   @Override
   public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)throws Exception {
      logger.error("UdpServerHandler exceptionCaught"+cause.getMessage());
      System.out.println("UdpServerHandler exceptionCaught"+cause.getMessage());
      cause.printStackTrace();
      ctx.close();
   }
   /**
    * 消息没有结束的时候触发
    * @param ctx
    * @throws Exception
    */
   @Override
   public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
      ctx.flush();
   }
}