1
MrShi
2025-03-18 a836f03a5d1fbfa81e147d09ffdfa87ba3975c13
server/web/src/main/java/com/doumee/jtt808/web/endpoint/JT808Endpoint.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,239 @@
package com.doumee.jtt808.web.endpoint;
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.Bikes;
import com.doumee.jtt808.web.service.Jtt808Service;
import com.doumee.service.business.BikesService;
import io.github.yezhihao.netmc.core.annotation.Async;
import io.github.yezhihao.netmc.core.annotation.AsyncBatch;
import io.github.yezhihao.netmc.core.annotation.Endpoint;
import io.github.yezhihao.netmc.core.annotation.Mapping;
import io.github.yezhihao.netmc.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.yzh.protocol.basics.JTMessage;
import org.yzh.protocol.commons.JT808;
import org.yzh.protocol.commons.transform.AttributeKey;
import org.yzh.protocol.commons.transform.attribute.Battery;
import org.yzh.protocol.t808.*;
import com.doumee.jtt808.web.model.entity.DeviceDO;
import com.doumee.jtt808.web.model.enums.SessionKey;
import com.doumee.jtt808.web.service.FileService;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.Date;
import java.util.List;
import static org.yzh.protocol.commons.JT808.*;
@Endpoint
@Component
public class JT808Endpoint {
    @Autowired
    private Jtt808Service jtt808Service;
    private static final Logger log = LoggerFactory.getLogger(JT808Endpoint.class);
    @Autowired
    private FileService fileService;
    @Mapping(types = ç»ˆç«¯é€šç”¨åº”ç­”, desc = "终端通用应答")
    public Object T0001(T0001 message, Session session) {
        session.response(message);
        return null;
    }
    @Mapping(types = ç»ˆç«¯å¿ƒè·³, desc = "终端心跳")
    public void T0002(JTMessage message, Session session) {
        log.info("终端心跳========={}", JSONObject.toJSONString(message));
    }
    @Mapping(types = ç»ˆç«¯æ³¨é”€, desc = "终端注销")
    public void T0003(JTMessage message, Session session) {
        session.invalidate();
    }
    @Mapping(types = æŸ¥è¯¢æœåŠ¡å™¨æ—¶é—´, desc = "查询服务器时间")
    public T8004 T0004(JTMessage message, Session session) {
        T8004 result = new T8004(LocalDateTime.now(ZoneOffset.UTC));
        return result;
    }
    @Mapping(types = ç»ˆç«¯è¡¥ä¼ åˆ†åŒ…请求, desc = "终端补传分包请求")
    public void T8003(T8003 message, Session session) {
    }
    @Mapping(types = ç»ˆç«¯æ ¡æ—¶è¯·æ±‚上行, desc = "终端校时请求上行")
    public void T0F01(JTMessage message, Session session) {
    }
    @Mapping(types = ç»ˆç«¯æ³¨å†Œ, desc = "终端注册")
    public T8100 T0100(T0100 message, Session session) {
        session.register(message);
        DeviceDO device = new DeviceDO();
        device.setProtocolVersion(message.getProtocolVersion());
        device.setMobileNo(message.getClientId());
        device.setDeviceId(message.getDeviceId());
        device.setPlateNo(message.getPlateNo());
        session.setAttribute(SessionKey.Device, device);
        T8100 result = new T8100();
        result.setResponseSerialNo(message.getSerialNo());
        result.setToken(message.getDeviceId() + "," + message.getPlateNo());
        result.setResultCode(T8100.Success);
        return result;
    }
    @Mapping(types = ç»ˆç«¯é‰´æƒ, desc = "终端鉴权")
    public T0001 T0102(T0102 message, Session session) {
        session.register(message);
        DeviceDO device = new DeviceDO();
        String[] token = message.getToken().split(",");
        device.setProtocolVersion(message.getProtocolVersion());
        device.setMobileNo(message.getClientId());
        device.setDeviceId(token[0]);
        if (token.length > 1)
            device.setPlateNo(token[1]);
        session.setAttribute(SessionKey.Device, device);
        T0001 result = new T0001();
        result.setResponseSerialNo(message.getSerialNo());
        result.setResponseMessageId(message.getMessageId());
        result.setResultCode(T0001.Success);
        return result;
    }
    @Mapping(types = æŸ¥è¯¢ç»ˆç«¯å‚数应答, desc = "查询终端参数应答")
    public void T0104(T0104 message, Session session) {
        session.response(message);
    }
    @Mapping(types = æŸ¥è¯¢ç»ˆç«¯å±žæ€§åº”ç­”, desc = "查询终端属性应答")
    public void T0107(T0107 message, Session session) {
        log.info("查询终端属性应答========={}", JSONObject.toJSONString(message));
        session.response(message);
    }
    @Mapping(types = ç»ˆç«¯å‡çº§ç»“果通知, desc = "终端升级结果通知")
    public void T0108(T0108 message, Session session) {
    }
    /**
     * å¼‚步批量处理
     * poolSize:参考数据库CPU核心数量
     * maxElements:最大累积4000条记录处理一次
     * maxWait:最大等待时间1秒
     */
    @AsyncBatch(poolSize = 2, maxElements = 4000, maxWait = 1000)
    @Mapping(types = ä½ç½®ä¿¡æ¯æ±‡æŠ¥, desc = "位置信息汇报")
    public void T0200(List<T0200> list) throws Exception {
        jtt808Service.updateBikesInfo(list);
        System.out.println(JSONObject.toJSONString(list)
      );
    }
    @Mapping(types = å®šä½æ•°æ®æ‰¹é‡ä¸Šä¼ , desc = "定位数据批量上传")
    public void T0704(T0704 message) {
    }
    public static String bcd2String(byte[] bytes) {
        StringBuilder temp = new StringBuilder(bytes.length * 2);
        for (int i = 0; i < bytes.length; i++) {
            // é«˜å››ä½
            temp.append((bytes[i] & 0xf0) >>> 4);
            // ä½Žå››ä½
            temp.append(bytes[i] & 0x0f);
        }
        return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp.toString().substring(1) : temp.toString();
    }
    @Mapping(types = {位置信息查询应答, è½¦è¾†æŽ§åˆ¶åº”ç­”}, desc = "位置信息查询应答/车辆控制应答")
    public void T0201_0500(T0201_0500 message, Session session) {
        session.response(message);
    }
    @Mapping(types = äº‹ä»¶æŠ¥å‘Š, desc = "事件报告")
    public void T0301(T0301 message, Session session) {
    }
    @Mapping(types = æé—®åº”ç­”, desc = "提问应答")
    public void T0302(T0302 message, Session session) {
    }
    @Mapping(types = ä¿¡æ¯ç‚¹æ’­_取消, desc = "信息点播/取消")
    public void T0303(T0303 message, Session session) {
    }
    @Mapping(types = æŸ¥è¯¢åŒºåŸŸæˆ–线路数据应答, desc = "查询区域或线路数据应答")
    public void T0608(T0608 message, Session session) {
        session.response(message);
    }
    @Mapping(types = è¡Œé©¶è®°å½•数据上传, desc = "行驶记录仪数据上传")
    public void T0700(T0700 message, Session session) {
        session.response(message);
    }
    @Mapping(types = ç”µå­è¿å•上报, desc = "电子运单上报")
    public void T0701(JTMessage message, Session session) {
    }
    @Mapping(types = é©¾é©¶å‘˜èº«ä»½ä¿¡æ¯é‡‡é›†ä¸ŠæŠ¥, desc = "驾驶员身份信息采集上报")
    public void T0702(T0702 message, Session session) {
        session.response(message);
    }
    @Mapping(types = CAN总线数据上传, desc = "CAN总线数据上传")
    public void T0705(T0705 message, Session session) {
    }
    @Mapping(types = å¤šåª’体事件信息上传, desc = "多媒体事件信息上传")
    public void T0800(T0800 message, Session session) {
    }
    @Async
    @Mapping(types = å¤šåª’体数据上传, desc = "多媒体数据上传")
    public JTMessage T0801(T0801 message, Session session) {
        if (message.getPacket() == null) {
            T0001 result = new T0001();
            result.copyBy(message);
            result.setMessageId(JT808.平台通用应答);
            result.setSerialNo(session.nextSerialNo());
            result.setResponseSerialNo(message.getSerialNo());
            result.setResponseMessageId(message.getMessageId());
            result.setResultCode(T0001.Success);
            return result;
        }
        fileService.saveMediaFile(message);
        T8800 result = new T8800();
        result.setMediaId(message.getId());
        return result;
    }
    @Mapping(types = å­˜å‚¨å¤šåª’体数据检索应答, desc = "存储多媒体数据检索应答")
    public void T0802(T0802 message, Session session) {
        session.response(message);
    }
    @Mapping(types = æ‘„像头立即拍摄命令应答, desc = "摄像头立即拍摄命令应答")
    public void T0805(T0805 message, Session session) {
        session.response(message);
    }
    @Mapping(types = æ•°æ®ä¸Šè¡Œé€ä¼ , desc = "数据上行透传")
    public void T0900(T0900 message, Session session) {
    }
    @Mapping(types = æ•°æ®åŽ‹ç¼©ä¸ŠæŠ¥, desc = "数据压缩上报")
    public void T0901(T0901 message, Session session) {
    }
    @Mapping(types = ç»ˆç«¯RSA公钥, desc = "终端RSA公钥")
    public void T0A00(T0A00_8A00 message, Session session) {
        session.response(message);
    }
}