package org.springblade.modules.netty.handle; 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.springblade.modules.netty.business.entity.PoliceCarEquipment; import org.springblade.modules.netty.business.service.PoliceCarEquipmentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import static org.springblade.modules.netty.config.MyDecoder.hexToByte; import static org.springblade.modules.netty.config.MyDecoder.hexTohort; import static org.springblade.modules.netty.util.Hex.getDouble; import static org.springblade.modules.netty.util.Hex.hexStr2Str; /** * updHandler udp 服务端数据接收处理 * @author zhongrj * @date 2023-02-21 */ @Component public class UdpServerHandler extends SimpleChannelInboundHandler { private Logger logger = LoggerFactory.getLogger(this.getClass()); private static UdpServerHandler udpServerHandler; @Autowired private PoliceCarEquipmentService policeCarEquipmentService; @PostConstruct public void init() { udpServerHandler = this; udpServerHandler.policeCarEquipmentService = this.policeCarEquipmentService; } @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"; //创建设备对象 PoliceCarEquipment backEquipment = new PoliceCarEquipment(); 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.policeCarEquipmentService.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 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(); } }