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