From dde1bed7ceaa288aa7d52d468d6f1eafe50db115 Mon Sep 17 00:00:00 2001
From: zhouhn <zhouhn@xiaopeng.com>
Date: 星期六, 07 三月 2026 20:59:19 +0800
Subject: [PATCH] KafkaConsumerService的报文传输改成proto生成的文件
---
xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java | 171 +++++++++++++++++++++++++++-----------------------------
1 files changed, 82 insertions(+), 89 deletions(-)
diff --git a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
index a0fec39..85d2979 100644
--- a/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
+++ b/xp-robotaxi-automatic-pilot-boot/src/main/java/com/xiaopeng/automaticPilot/service/KafkaConsumerService.java
@@ -1,7 +1,6 @@
package com.xiaopeng.automaticPilot.service;
import cn.hutool.core.lang.Snowflake;
-import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.xiaopeng.api.dto.map.OrderRouteAndFareDto;
import com.xiaopeng.api.dto.operation.LonLatDto;
@@ -18,37 +17,19 @@
import com.xiaopeng.api.model.order.XpOrder;
import com.xiaopeng.api.model.vehicleConvoy.XpVehicle;
import com.xiaopeng.api.vo.automaticPilot.VehiclePosition;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.ActionType;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.GeoPoint;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperation;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.OrderOperationType;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.PointType;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.ResponseMessage;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.RestoreNavigationData;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.StatusCode;
-import com.xiaopeng.api.vo.automaticPilot.protobuf.Waypoint;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.MessageType;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.MsgContent;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.RTCmdType;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.RtMsgHeader;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.NavigationDeviationEvent;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.NavigationDeviationMessage;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.navigationDeviationEvent.RtEventType;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.orderStateUpdateEvent.OrderStatusInfoEvent;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.systemStatusXpu.*;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.xpuNavigationRequest.NavigationRequest;
-import com.xiaopeng.api.vo.automaticPilot.proto.up.xpuNavigationRequest.OrderPhase;
+import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
+import com.xiaopeng.api.vo.automaticPilot.protobuf.RTCmdType;
+import com.google.protobuf.util.JsonFormat;
+import com.google.protobuf.InvalidProtocolBufferException;
import com.xiaopeng.api.vo.operation.RouteVo;
import com.xiaopeng.api.vo.vehicleConvoy.CancelTaxiPassengerVo;
import com.xiaopeng.automaticPilot.util.XPUUtil;
-import com.xiaopeng.common.core.constant.CacheConstants;
import com.xiaopeng.common.core.domain.R;
import com.xiaopeng.common.core.enums.OrderStatusEnum;
import com.xiaopeng.common.core.enums.PushMessageTypeEnum;
import com.xiaopeng.common.core.utils.StringUtils;
import com.xiaopeng.common.core.utils.uuid.UUID;
import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.query.Criteria;
@@ -103,16 +84,31 @@
*
*/
public void topicProdRobotaxiXpuHigh(String message) {
- MsgContent msgContent = JSON.parseObject(message, MsgContent.class);
- handleXPUMessage(msgContent, message);
+ MsgContent msgContent = parseMsgContent(message);
+ if (msgContent != null) {
+ handleXPUMessage(msgContent, message);
+ }
}
/**
* 消费消息 - XPU上报Robotaxi云端的消息topic(低优先级)
*/
public void topicProdRobotaxiXpuNormal(String message) {
- MsgContent msgContent = JSON.parseObject(message, MsgContent.class);
- handleXPUMessage(msgContent, message);
+ MsgContent msgContent = parseMsgContent(message);
+ if (msgContent != null) {
+ handleXPUMessage(msgContent, message);
+ }
+ }
+
+ private MsgContent parseMsgContent(String message) {
+ try {
+ MsgContent.Builder builder = MsgContent.newBuilder();
+ JsonFormat.parser().ignoringUnknownFields().merge(message, builder);
+ return builder.build();
+ } catch (InvalidProtocolBufferException e) {
+ log.error("Failed to parse message: {}", message, e);
+ return null;
+ }
}
@@ -122,12 +118,17 @@
* @param message
*/
public void handleXPUMessage(MsgContent msgContent, String message){
- RtMsgHeader header = msgContent.getHeader();
+ MsgHeader header = msgContent.getHeader();
MessageType type = header.getType();
//处理请求消息
if (MessageType.MESSAGE_TYPE_REQUEST == type) {
//区分业务类型
- RTCmdType cmd = header.getCmd();
+ int cmdValue = header.getCmd();
+ RTCmdType cmd = RTCmdType.getByValue(cmdValue);
+ if (cmd == null) {
+ log.warn("Unknown cmd value: {}", cmdValue);
+ return;
+ }
switch (cmd) {
case SYSTEM_STATUS_XPU:
log.info("XPU发布系统运行状态 (XPU→云端):{}", message);
@@ -192,10 +193,10 @@
//TODO 这里的逻辑要再确认下
//消息应答
if(MessageType.MESSAGE_TYPE_RESPONSE == type){
- com.xiaopeng.api.vo.automaticPilot.proto.up.ResponseMessage resposne = msgContent.getContent_detail().getObject("resposne", com.xiaopeng.api.vo.automaticPilot.proto.up.ResponseMessage.class);
- com.xiaopeng.api.vo.automaticPilot.proto.up.StatusCode code = resposne.getCode();
- Long requestSeq = resposne.getRequest_seq();
- if(code == com.xiaopeng.api.vo.automaticPilot.proto.up.StatusCode.OK){
+ ResponseMessage response = msgContent.getResponse();
+ StatusCode code = response.getCode();
+ long requestSeq = response.getRequestSeq();
+ if(code == StatusCode.OK){
Object sequence = redisTemplate.opsForValue().get(requestSeq);
if(sequence!=null){
String[] split = sequence.toString().split("_");
@@ -210,10 +211,6 @@
}
}
-
-
-
-
/**
* XPU发布系统运行状态---车辆实时位置
*
@@ -221,21 +218,21 @@
*/
public void systemStatusXpu(MsgContent msgContent) {
//开始处理消息对应的业务逻辑
- SystemRuntimeStatus systemRuntimeStatus = msgContent.getContent_detail().getObject("systemRuntimeStatus", SystemRuntimeStatus.class);
+ SystemRuntimeStatus systemRuntimeStatus = msgContent.getSystemRuntimeStatus();
//获取实时位置
RealtimePose pose = systemRuntimeStatus.getPose();
- Wgs naviPose = pose.getNavi_pose();
+ Wgs naviPose = pose.getNaviPose();
Double latitude = naviPose.getLatitude();
Double longitude = naviPose.getLongitude();
Double course = naviPose.getCourse();
Float alt = naviPose.getAlt();
//获取车辆静态信息
- VehicleStaticInfo staticInfo = systemRuntimeStatus.getVehicle_status().getStatic_info();
- String xpuId = staticInfo.getXpu_id();
+ VehicleStaticInfo staticInfo = systemRuntimeStatus.getVehicleStatus().getStaticInfo();
+ String xpuId = staticInfo.getXpuId();
XpVehicle xpVehicle = xpVehicleClient.findByVehicleXpuId(xpuId).getData();
String vin = xpVehicle.getVehicleVin();
//先响应消息
- Long sequence = msgContent.getHeader().getSequence();
+ long sequence = msgContent.getHeader().getSequence();
responseMessage(sequence, vin);
//保存车辆实时位置到redis
redisTemplate.opsForGeo().add("vehiclePosition:" + vin, new GeoJsonPoint(longitude, latitude), vin);
@@ -249,15 +246,15 @@
vehiclePosition.setPoint(new GeoJsonPoint(longitude, latitude));
vehiclePosition.setCourse(course);
vehiclePosition.setAlt(alt);
- VehicleStatus vehicleStatus = systemRuntimeStatus.getVehicle_status();
+ VehicleStatus vehicleStatus = systemRuntimeStatus.getVehicleStatus();
//车辆动态信息
- VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamic_status();
- dynamicStatus.setSpeed(dynamicStatus.getSpeed());
- vehiclePosition.setCurrentElectricity(dynamicStatus.getBattery_level());
+ VehicleDynamicStatus dynamicStatus = vehicleStatus.getDynamicStatus();
+ vehiclePosition.setSpeed(dynamicStatus.getSpeed());
+ vehiclePosition.setCurrentElectricity(dynamicStatus.getDstBatDisp());
//订单信息
- OrderStatusInfo runningOrderStatusInfo = systemRuntimeStatus.getRunning_order_status_info();
+ OrderStatusInfo runningOrderStatusInfo = systemRuntimeStatus.getRunningOrderStatusInfo();
Long orderId = null;
- String order_id = runningOrderStatusInfo.getOrder_id();
+ String order_id = runningOrderStatusInfo.getOrderId();
vehiclePosition.setHasOrder(0);
if (StringUtils.isNotEmpty(order_id)) {
if (order_id.contains("XU")) {
@@ -271,14 +268,15 @@
mongoTemplate.save(vehiclePosition);
//调用推送服务接口
if (null != orderId) {
- RtTripInfo rtTripInfo = systemRuntimeStatus.getRt_trip_info();
+ RtTripInfo rtTripInfo = systemRuntimeStatus.getRtTripInfo();
PushOrderRouteDTO dto = new PushOrderRouteDTO();
dto.setOrderId(orderId);
dto.setRouteType(order_id.contains("XU") ? 2 : 1);
dto.setLongitude(longitude);
dto.setLatitude(latitude);
- dto.setDuration(rtTripInfo.getRemaining_time());
- dto.setDistance(rtTripInfo.getRemaining_distance().intValue());
+ //TODO 这两个字段现在拿不到
+// dto.setDuration(rtTripInfo.getRemaining_time());
+// dto.setDistance(rtTripInfo.getRemaining_distance().intValue());
xpPushMessageClient.pushOrderRoute(dto);
}
}
@@ -291,12 +289,13 @@
*/
public void systemStatusXpuAndReassign(MsgContent msgContent) {
//开始处理消息对应的业务逻辑
- SystemRuntimeStatus systemRuntimeStatus = msgContent.getContent_detail().getObject("systemRuntimeStatus", SystemRuntimeStatus.class);
- AbnormalReason abnormalReason = systemRuntimeStatus.getSystem_status().getAbnormal_reason();
+ SystemRuntimeStatus systemRuntimeStatus = msgContent.getSystemRuntimeStatus();
+ AbnormalReason abnormalReason = systemRuntimeStatus.getSystemStatus().getAbnormalReason();
// 存储车辆挡位
- GearLevel gearLevel = systemRuntimeStatus.getVehicle_status().getDynamic_status().getGear_level();
- int value = gearLevel.getValue();
- redisTemplate.opsForValue().set(CacheConstants.GEAR_LEVEL + systemRuntimeStatus.getVehicle_status().getStatic_info().getVin(), value);
+ GearLevel gearLevel = systemRuntimeStatus.getVehicleStatus().getDynamicStatus().getGearLevel();
+ int value = gearLevel.getNumber();
+ //TODO 这里拿不到车架号,只有XPU-ID
+// redisTemplate.opsForValue().set(CacheConstants.GEAR_LEVEL + systemRuntimeStatus.getVehicleStatus().getStaticInfo().getVin(), value);
// 判断是否为故障状态
if (abnormalReason == AbnormalReason.FAULT) {
@@ -304,7 +303,7 @@
// TODO 添加异常任务
// 解绑用户与车辆关系
CancelTaxiPassengerVo cancelTaxiPassengerVo = new CancelTaxiPassengerVo();
- String orderId = systemRuntimeStatus.getRunning_order_status_info().getOrder_id();
+ String orderId = systemRuntimeStatus.getRunningOrderStatusInfo().getOrderId();
XpOrder xpOrder = xpOrderClient.queryOrderById(Long.parseLong(orderId)).getData();
XpVehicle vehicle = xpVehicleClient.queryById(xpOrder.getVehicleId()).getData();
if (vehicle != null) {
@@ -328,21 +327,12 @@
reassignOrderDTO.setOrderNo(xpOrder.getOrderNumber());
reassignOrderDTO.setCount(10);
RealtimePose pose = systemRuntimeStatus.getPose();
- Wgs naviPose = pose.getNavi_pose();
+ Wgs naviPose = pose.getNaviPose();
Double latitude = naviPose.getLatitude();
Double longitude = naviPose.getLongitude();
reassignOrderDTO.setLongitude(longitude);
reassignOrderDTO.setLatitude(latitude);
reassignOrderClient.reassignOrder(reassignOrderDTO);
-
-
-
-
-
-
-
-
-
// }
}
}
@@ -354,11 +344,11 @@
*/
public void xpuNavigationRequest(MsgContent msgContent) {
//开始处理消息对应的业务逻辑
- NavigationRequest naviRequest = msgContent.getContent_detail().getObject("naviRequest", NavigationRequest.class);
- String requestId = naviRequest.getRequest_id();
- String orderId = naviRequest.getOrder_id();
- String taskId = naviRequest.getTask_id();
- OrderPhase orderPhase = naviRequest.getOrder_phase();
+ NavigationRequest naviRequest = msgContent.getNavigationRequset();
+ String requestId = naviRequest.getRequestId();
+ String orderId = naviRequest.getOrderId();
+ String taskId = naviRequest.getTaskId();
+ OrderPhase orderPhase = naviRequest.getOrderPhase();
log.info("订单ID:{}", orderId);
log.info("任务ID:{}", taskId);
switch (orderPhase) {
@@ -388,17 +378,19 @@
*/
public void navigationDeviationEvent(MsgContent msgContent) {
//先响应消息
- Long sequence = msgContent.getHeader().getSequence();
+ long sequence = msgContent.getHeader().getSequence();
//开始处理消息对应的业务逻辑
- NavigationDeviationEvent deviationEvent = msgContent.getContent_detail().getObject("deviationEvent", NavigationDeviationEvent.class);
- String requestId = deviationEvent.getRequest_id();
+ NavigationDeviationEvent deviationEvent = msgContent.getNaviDeviationEvent();
+
+// String requestId = deviationEvent.getRequestId();
//偏航事件类型 1:请求导航,2:取消导航
- if (deviationEvent.getEvent_type().equals(RtEventType.RT_EVENT_TYPE_REQUEST)) {
- NavigationDeviationMessage navigationDeviationMessage = deviationEvent.getNavigation_deviation_message();
- String orderId = navigationDeviationMessage.getOrder_id();
- String taskId = navigationDeviationMessage.getTask_id();
- Double longitude = navigationDeviationMessage.getLongitude();
- Double latitude = navigationDeviationMessage.getLatitude();
+// if (deviationEvent.getEventType().equals(RtEventType.RT_EVENT_TYPE_REQUEST)) {
+ NavigationDeviationMessage navigationDeviationMessage = deviationEvent.getNavigationDeviationMessage();
+ String orderId = navigationDeviationMessage.getOrderId();
+ String taskId = navigationDeviationMessage.getTaskId();
+ Wgs wgs = navigationDeviationMessage.getPoint();
+ Double longitude = wgs.getLongitude();
+ Double latitude = wgs.getLatitude();
//订单类型 1:乘客订单,2=巡游订单
LonLatDto destination = new LonLatDto();
LonLatDto origin = new LonLatDto();
@@ -451,10 +443,11 @@
throw new RuntimeException("根据导航ID获取车端需要的导航数据失败");
}
+ //TODO 这里的逻辑不太对,收到导航偏航事件之后
//构建导航下发请求对象
- cloudPushNavigationInfo(requestId, routeVo.getRouteID(), stringR.getData(), orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
+// cloudPushNavigationInfo(requestId, routeVo.getRouteID(), stringR.getData(), orderId, xpVehicle.getVehicleVin(), xpVehicle.getXpuId());
}
- }
+// }
}
@@ -598,15 +591,15 @@
*/
public void orderStateUpdateEvent(MsgContent msgContent) {
//先响应消息
- Long sequence = msgContent.getHeader().getSequence();
+ long sequence = msgContent.getHeader().getSequence();
//开始处理消息对应的业务逻辑
- OrderStatusInfoEvent orderStatusInfoEvent = msgContent.getContent_detail().getObject("orderStatusInfoEvent", OrderStatusInfoEvent.class);
+ OrderStatusInfoEvent orderStatusInfoEvent = msgContent.getOrderStatusInfoEvent();
//只处理请求消息
- if (orderStatusInfoEvent.getEvent_type().equals(RtEventType.RT_EVENT_TYPE_REQUEST)) {
- com.xiaopeng.api.vo.automaticPilot.proto.up.orderStateUpdateEvent.OrderStatusInfo orderStatusInfo = orderStatusInfoEvent.getOrder_status_info();
- String orderId = orderStatusInfo.getOrder_id();
+ if (orderStatusInfoEvent.getEventType().equals(RtEventType.kEventOrderStateUpdate)) {
+ OrderStatusInfo orderStatusInfo = orderStatusInfoEvent.getOrderStatusInfo();
+ String orderId = orderStatusInfo.getOrderId();
//普通单
- com.xiaopeng.api.vo.automaticPilot.proto.up.orderStateUpdateEvent.OrderStatus status = orderStatusInfo.getStatus();
+ OrderStatus status = orderStatusInfo.getStatus();
switch (status) {
case ORDER_STATUS_UNSPECIFIED:
//订单状态未知
--
Gitblit v1.7.1