From 2e98b20bea4463e4465e3c19059d0744a09aec06 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Tue, 27 Jun 2023 14:34:41 +0800
Subject: [PATCH] gb28181版本升级-补充

---
 src/main/java/com/genersoft/iot/vmp/netty/handle/UdpServerHandler.java |  191 +++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 191 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/genersoft/iot/vmp/netty/handle/UdpServerHandler.java b/src/main/java/com/genersoft/iot/vmp/netty/handle/UdpServerHandler.java
new file mode 100644
index 0000000..f9694ab
--- /dev/null
+++ b/src/main/java/com/genersoft/iot/vmp/netty/handle/UdpServerHandler.java
@@ -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();
+	}
+}

--
Gitblit v1.9.3