puzhibing
2 天以前 ea7595c4c75926f85388574b261b8ba90cf60e0d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.ruoyi.dataInterchange.server;
 
import com.ruoyi.common.core.utils.bean.BeanUtils;
import com.ruoyi.dataInterchange.dao.UPExgMsgRegisterDao;
import com.ruoyi.dataInterchange.model.BaseMsg;
import com.ruoyi.dataInterchange.model.UPBaseMsgVehicleAddedAck;
import com.ruoyi.dataInterchange.model.UPExgMsgRegister;
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;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
 
/**
 * @author zhibing.pu
 * @Date 2025/3/4 21:01
 */
@Slf4j
@Component
public class BaseMsgService {
    
    @Resource
    private RedisTemplate redisTemplate;
    
    @Resource
    private UPExgMsgRegisterDao upExgMsgRegisterDao;
    
    
    public void up_base_msg(ChannelHandlerContext ctx, OuterPacket out) {
        if (!redisTemplate.hasKey("login:" + out.getGnsscenterId())) {
            log.error("链路还未登录校验,拒绝连接:{}", out.getGnsscenterId());
            ctx.close();
            return;
        }
        BaseMsg baseMsg = getBaseMsg(out);
        DataType dataType = DataType.getDataType(baseMsg.getDataType());
        switch (dataType) {
            case UP_BASE_MSG_VEHICLE_ADDED_ACK:
                log.info("补报车辆静态信息应答消息({}):{}", DataType.UP_BASE_MSG_VEHICLE_ADDED_ACK.getCode(), out);
                up_base_msg_vehicle_added_ack(ctx, out.getGnsscenterId(), baseMsg);
                break;
            default:
                break;
        }
    }
    
    
    
    /**
     * 解析子业务数据
     *
     * @param out
     * @return
     */
    public BaseMsg getBaseMsg(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);
        BaseMsg baseMsg = new BaseMsg();
        baseMsg.setVehicleNo(vehicleNo);
        baseMsg.setVehicleColor(vehicleColor);
        baseMsg.setDataType(dataType);
        baseMsg.setDataLength(dataLength);
        baseMsg.setData(data);
        return baseMsg;
    }
    
    
    public void up_base_msg_vehicle_added_ack(ChannelHandlerContext ctx, int inferiorPlatformId, BaseMsg baseMsg){
        UPBaseMsgVehicleAddedAck upBaseMsgVehicleAddedAck = new UPBaseMsgVehicleAddedAck().decode(baseMsg);
        UPExgMsgRegister upExgMsgRegister = new UPExgMsgRegister();
        BeanUtils.copyProperties(upBaseMsgVehicleAddedAck, upExgMsgRegister);
        upExgMsgRegister.setInferiorPlatformId(inferiorPlatformId);
        upExgMsgRegister.setCreateTime(LocalDateTime.now().toEpochSecond(ZoneOffset.ofHours(8)));
        UPExgMsgRegister register = upExgMsgRegisterDao.findByVehicleNo(upExgMsgRegister.getVehicleNo());
        if (null == register) {
            upExgMsgRegisterDao.save(upExgMsgRegister);
        }
    }
}