package com.ruoyi.dataInterchange.server; import com.ruoyi.dataInterchange.model.CtrlMag; import com.ruoyi.dataInterchange.model.enu.DataType; import com.ruoyi.dataInterchange.util.jtt809.common.Jtt809Util; import com.ruoyi.dataInterchange.util.jtt809.packet.common.OuterPacket; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.ChannelHandlerContext; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * @author zhibing.pu * @Date 2025/3/4 20:55 */ @Slf4j @Component public class CtrlMsgService { @Resource private RedisTemplate redisTemplate; public void up_ctrl_msg(ChannelHandlerContext ctx, OuterPacket out) { if (!redisTemplate.hasKey("login:" + out.getGnsscenterId())) { log.error("链路还未登录校验,拒绝连接:{}", out.getGnsscenterId()); ctx.close(); return; } CtrlMag ctrlMsg = getCtrlMsg(out); DataType dataType = DataType.getDataType(ctrlMsg.getDataType()); switch (dataType) { case UP_CTRL_MSG_MONITOR_VEHICLE_ACK: log.info("车辆单向监听应答消息({}):{}", DataType.UP_CTRL_MSG_MONITOR_VEHICLE_ACK.getCode(), out); break; case UP_CTRL_MSG_TAKE_PHOTO_ACK: log.info("车辆牌照应答消息({}):{}", DataType.UP_CTRL_MSG_TAKE_PHOTO_ACK.getCode(), out); break; case UP_CTRL_MSG_TEXT_INFO_ACK: log.info("下发车辆报文应答消息({}):{}", DataType.UP_CTRL_MSG_TEXT_INFO_ACK.getCode(), out); break; case UP_CTRL_MSG_TAKE_TRAVEL_ACK: log.info("上报车辆行驶记录应答消息({}):{}", DataType.UP_CTRL_MSG_TAKE_TRAVEL_ACK.getCode(), out); break; case UP_CTRL_MSG_EMERGENCY_MONITORING_ACK: log.info("车辆应急接入监管平台应答消息({}):{}", DataType.UP_CTRL_MSG_EMERGENCY_MONITORING_ACK.getCode(), out); break; default: break; } } /** * 解析子业务数据 * * @param out * @return */ public CtrlMag getCtrlMsg(OuterPacket out) { byte[] body = out.getBody(); ByteBuf byteBuf = Unpooled.wrappedBuffer(body); //车牌号 String vehicleNo = Jtt809Util.readGBKString(byteBuf, 21); //车牌颜色 byte vehicleColor = byteBuf.readByte(); //子业务类型标识 int dataType = byteBuf.readUnsignedShort(); //后续数据长度 int dataLength = byteBuf.readInt(); //子业务数据包 byte[] data = new byte[byteBuf.readableBytes()]; byteBuf.readBytes(data); CtrlMag ctrlMag = new CtrlMag(); ctrlMag.setVehicleNo(vehicleNo); ctrlMag.setVehicleColor(vehicleColor); ctrlMag.setDataType(dataType); ctrlMag.setDataLength(dataLength); ctrlMag.setData(data); return ctrlMag; } }