package org.yzh.web.endpoint;
|
|
import com.ruoyi.jt.domain.*;
|
import com.ruoyi.jt.service.*;
|
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 lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
import org.yzh.commons.util.BytesUtils;
|
import org.yzh.protocol.basics.JTMessage;
|
import org.yzh.protocol.commons.JT808;
|
import org.yzh.protocol.t808.*;
|
import org.yzh.web.model.entity.DeviceDO;
|
import org.yzh.web.model.enums.SessionKey;
|
import org.yzh.web.service.FileService;
|
|
import java.time.LocalDateTime;
|
import java.time.ZoneOffset;
|
import java.util.List;
|
|
import static org.yzh.protocol.commons.JT808.*;
|
|
@Slf4j
|
@Endpoint
|
@Component
|
@RequiredArgsConstructor
|
public class JT808Endpoint {
|
|
private final FileService fileService;
|
|
@Autowired
|
private IJtDeviceService jtDeviceService;
|
@Autowired
|
private IJtDeviceLocationService jtDeviceLocationService;
|
|
@Mapping(types = 终端通用应答, desc = "终端通用应答")
|
public Object T0001(T0001 message, Session session) {
|
// String clientId = message.getClientId();
|
// System.out.println("终端响应通用应答数据终端手机号:" + clientId);
|
// log.info("终端响应通用应答数据终端手机号:" + clientId);
|
// int serialNo = message.getSerialNo();
|
// System.out.println("终端响应通用应答数据消息流水号:" + serialNo);
|
// log.info("终端响应通用应答数据消息流水号:" + serialNo);
|
// System.out.println("终端响应通用应答数据message.getExtData():" +message.getExtData());
|
// System.out.println("终端响应通用应答数据message:" + message);
|
// log.info("终端响应通用应答数据message:" + message);
|
session.response(message);
|
return null;
|
}
|
|
@Mapping(types = 终端心跳, desc = "终端心跳")
|
public void T0002(JTMessage message, Session session) {
|
}
|
|
@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().setDateTime(LocalDateTime.now(ZoneOffset.UTC));
|
return result;
|
}
|
|
@Mapping(types = 终端补传分包请求, desc = "终端补传分包请求")
|
public void T8003(T8003 message, Session session) {
|
}
|
|
|
@Mapping(types = 终端注册, desc = "终端注册")
|
public T8100 T0100(T0100 message, Session session) {
|
DeviceDO device = new DeviceDO();
|
device.setProtocolVersion(message.getProtocolVersion());
|
device.setMobileNo(message.getClientId());
|
device.setDeviceId(message.getDeviceId());
|
device.setPlateNo(message.getPlateNo());
|
System.out.println("" + device);
|
T8100 result = new T8100();
|
result.setResponseSerialNo(message.getSerialNo());
|
result.setToken(message.getDeviceId() + " ," + message.getPlateNo());
|
//判断系统中是否存在设备号和车辆绑定
|
if (this.jtDeviceService.isExistDevice(device)) {
|
session.setAttribute(SessionKey.Device, device);
|
result.setResultCode(T8100.Success);
|
} else {
|
result.setResultCode(T8100.NotFoundVehicle);
|
}
|
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]);
|
|
|
T0001 result = new T0001();
|
result.setResponseSerialNo(message.getSerialNo());
|
result.setResponseMessageId(message.getMessageId());
|
//判断系统中车辆存在状态
|
if (this.jtDeviceService.isExistDevice(device)) {
|
session.setAttribute(SessionKey.Device, device);
|
result.setResultCode(T0001.Success);
|
} else {
|
|
result.setResultCode(T0001.Failure);
|
}
|
|
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) {
|
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) {
|
this.jtDeviceLocationService.saveT0200s(list,true);
|
}
|
|
@Mapping(types = 定位数据批量上传, desc = "定位数据批量上传")
|
public void T0704(T0704 message) {
|
List<T0200> list = message.getItems();
|
this.jtDeviceLocationService.saveT0200s(list,false);
|
}
|
|
@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) {
|
// session.response(message);
|
// 获取终端手机号和消息流水号
|
String clientId = message.getClientId();
|
System.out.println("终端响应T0900数据终端手机号:" + clientId);
|
log.info("终端响应T0900数据终端手机号:" + clientId);
|
int serialNo = message.getSerialNo();
|
System.out.println("终端响应T0900数据消息流水号:" + serialNo);
|
log.info("终端响应T0900数据消息流水号:" + serialNo);
|
// JtDevice jtDevice=new JtDevice();
|
// jtDevice.setClientId(message.getClientId());
|
// List<JtDevice> list = jtDeviceService.selectJtDeviceList(jtDevice);
|
// //JtDevice jd=list.get(0);
|
// ArdTankLock ardTankLock=null;
|
//
|
// if(!list.isEmpty()){
|
// //ardTankLock.setCarId(list.get(0).getId());
|
// ardTankLock = ardTankLockService.selectArdTankLockByCarId(list.get(0).getId());
|
//
|
// }
|
int key;
|
byte[] value=null;
|
if(message.getMessage()!=null) {
|
key = message.getMessage().getKey();
|
value = (byte[]) message.getMessage().getValue();
|
// Base64.getUrlDecoder().decode(message.getMessage().getValue().toString());
|
String va=BytesUtils.bytes2hex(value);
|
System.out.println("终端响应T0900数据key:" + key);
|
log.info("终端响应T0900数据key:" + key);
|
|
System.out.println("终端响应T0900数据value:" + va);
|
log.info("终端响应T0900数据value:" + va);
|
|
//测试数据,读所有信息
|
//value=BytesUtils.hex2bytes("00010B02010102007300E61906180B1414010001020304051906180A0000000102030405061906190A000000020304050607FFFFFFFFFFFFFF030405060708FFFFFFFFFFFFFF040506070809FFFFFFFFFFFFFF050607080900FFFFFFFFFFFFFF060708090001FFFFFFFFFFFFFF070809000102FFFFFFFFFFFFFF080900010203FFFFFFFFFFFFFF090001020304FFFFFFFFFFFFFF2F");
|
String ins = String.valueOf(value[2]);
|
if(ins.equals("11"))
|
{//读所有信息
|
System.out.println("终端响应T0900数据为读所有信息:" + ins);
|
log.info("终端响应T0900数据为读所有信息:" + ins);
|
// ArdTankLockState lock = AnalysisUtils.analysis(value,ardTankLock.getId(),ardTankLock.getCarId());
|
// lockService.insertArdTankLockState(lock);
|
//设备密码
|
|
}
|
if(ins.equals("9"))
|
{//读设备号
|
System.out.println("终端响应T0900数据为读设备号:" + ins);
|
log.info("终端响应T0900数据为读设备号:" + ins);
|
}
|
if(ins.equals("2"))
|
{//设置锁状态(开锁关锁)
|
System.out.println("终端响应T0900数据为设置锁状态:" + ins);
|
log.info("终端响应T0900数据为设置锁状态:" + ins);
|
}
|
if(ins.equals("1"))
|
{//读锁当前状态
|
System.out.println("终端响应T0900数据为读锁当前状态:" + ins);
|
log.info("终端响应T0900数据为读锁当前状态:" + ins);
|
}
|
|
|
}
|
//return T8900ReadLockIdResponse.parseFromBytes(value);
|
|
}
|
|
@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);
|
}
|
|
@Mapping(types = 数据下行透传, desc = "多业务透传处理")
|
public void T8900(T8900 message, Session session) {
|
//数据下行透传
|
//消息透传应答
|
session.response(message);
|
|
try {
|
// 解析响应数据
|
|
//byte[] responseData = message.getData();
|
// byte responseStatus = T8900.parseValveResponse(responseData);
|
|
// 获取终端手机号和消息流水号
|
String clientId = message.getClientId();
|
System.out.println("终端响应8900数据终端手机号:" + clientId);
|
log.info("终端响应8900数据终端手机号:" + clientId);
|
int serialNo = message.getSerialNo();
|
System.out.println("终端响应8900数据消息流水号:" + serialNo);
|
log.info("终端响应8900数据消息流水号:" + serialNo);
|
System.out.println("终端响应8900数据message:" + message);
|
log.info("终端响应8900数据message:" + message);
|
|
} catch (Exception e) {
|
// logger.error("处理蝶阀锁响应消息出错", e);
|
}
|
}
|
|
// @Mapping(types = 消息透传应答, desc = "多业务透传处理")
|
// public void T8901(T8900 message, Session session) {
|
// //数据下行透传
|
// //消息透传应答
|
// session.response(message);
|
// // 获取终端手机号和消息流水号
|
// String clientId = message.getClientId();
|
// System.out.println("终端响应8901数据终端手机号:" + clientId);
|
// log.info("终端响应8901数据终端手机号:" + clientId);
|
// int serialNo = message.getSerialNo();
|
// System.out.println("终端响应8901数据消息流水号:" + serialNo);
|
// log.info("终端响应8901数据消息流水号:" + serialNo);
|
// System.out.println("终端响应8900数据message:" + message);
|
// log.info("终端响应8901数据message:" + message);
|
// }
|
|
// // 处理透传响应(消息ID与请求一致,均为0x8900) zwy20250610
|
// @Mapping(types = 0x8900)
|
// public T8900Response handleValveLockResponse(T8900Response response, Session session) {
|
// // 可在此添加业务逻辑(如记录状态到数据库)
|
// return response;
|
// }
|
}
|