package com.xiaopeng.automaticPilot.util;
|
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.http.HttpRequest;
|
import cn.hutool.http.HttpResponse;
|
import com.google.protobuf.util.JsonFormat;
|
import com.xiaopeng.api.vo.automaticPilot.protobuf.*;
|
|
import java.util.UUID;
|
|
/**
|
* GPS单点位置发送测试工具
|
* 用于快速测试发送单个位置信息到服务器
|
*/
|
public class SinglePositionTester {
|
|
private static final JsonFormat.Printer jsonPrinter = JsonFormat.printer()
|
.printingEnumsAsInts()
|
.preservingProtoFieldNames();
|
|
/**
|
* 推送XPU消息的接口地址
|
*/
|
private static final String PUSH_MESSAGE_URL =
|
"http://logan-gateway.aliyun-hd1-pre.logan.xiaopeng.inner/xp-robotaxi-automatic-pilot-boot/base/v1/pushXPUMessage";
|
|
/**
|
* 发送单个位置信息
|
*
|
* @param longitude 经度
|
* @param latitude 纬度
|
* @param course 方位角(0-360度)
|
* @param speed 速度(米/秒)
|
* @param uid 用户ID
|
* @param xpuId XPU设备ID
|
* @param orderId 订单ID
|
* @return 是否发送成功
|
*/
|
public static boolean sendPosition(double longitude, double latitude, int course,
|
double speed, long uid, String xpuId, String orderId) {
|
try {
|
// 创建消息
|
MsgContent message = createMessage(longitude, latitude, course, speed, uid, xpuId, orderId);
|
|
// 转换为JSON
|
String json = jsonPrinter.print(message);
|
|
System.out.println("========================================");
|
System.out.println("准备发送位置信息:");
|
System.out.println("----------------------------------------");
|
System.out.println("经度: " + longitude);
|
System.out.println("纬度: " + latitude);
|
System.out.println("方位角: " + course + "°");
|
System.out.println("速度: " + speed + " m/s");
|
System.out.println("用户ID: " + uid);
|
System.out.println("XPU ID: " + xpuId);
|
System.out.println("订单ID: " + orderId);
|
System.out.println("----------------------------------------");
|
System.out.println("JSON消息:");
|
System.out.println(json);
|
System.out.println("========================================\n");
|
|
// 发送到服务器
|
HttpResponse response = HttpRequest.post(PUSH_MESSAGE_URL)
|
.body(json)
|
.contentType("application/json")
|
.timeout(10000) // 10秒超时
|
.execute();
|
|
if (response.isOk()) {
|
System.out.println("✓ 消息发送成功!");
|
System.out.println("响应状态码: " + response.getStatus());
|
System.out.println("响应内容: " + response.body());
|
return true;
|
} else {
|
System.err.println("✗ 消息发送失败!");
|
System.err.println("响应状态码: " + response.getStatus());
|
System.err.println("响应内容: " + response.body());
|
return false;
|
}
|
|
} catch (Exception e) {
|
System.err.println("✗ 发送异常: " + e.getMessage());
|
e.printStackTrace();
|
return false;
|
}
|
}
|
|
/**
|
* 创建系统运行状态消息(使用Protobuf对象)
|
*/
|
private static MsgContent createMessage(double longitude, double latitude,
|
int course, double speed,
|
long uid, String xpuId, String orderId) {
|
long timestamp = System.currentTimeMillis();
|
|
// 构建 MsgContent
|
MsgContent.Builder msgContentBuilder = MsgContent.newBuilder();
|
|
// 构建 Header
|
MsgHeader.Builder headerBuilder = MsgHeader.newBuilder();
|
headerBuilder.setTimestamp(timestamp);
|
headerBuilder.setCmd(14001); // SYSTEM_STATUS_XPU
|
headerBuilder.setSequence(1);
|
headerBuilder.setType(MessageType.MESSAGE_TYPE_REQUEST);
|
headerBuilder.setMsgId("MSG-UUID-" + UUID.randomUUID().toString());
|
headerBuilder.setSource(SourceType.XPU);
|
msgContentBuilder.setHeader(headerBuilder.build());
|
|
// 构建 Wgs (GPS坐标)
|
Wgs.Builder wgsBuilder = Wgs.newBuilder();
|
wgsBuilder.setLongitude(longitude);
|
wgsBuilder.setLatitude(latitude);
|
wgsBuilder.setCourse(course);
|
wgsBuilder.setPosAcc(0.5);
|
wgsBuilder.setAlt(10);
|
|
// 构建 RealtimePose
|
RealtimePose.Builder poseBuilder = RealtimePose.newBuilder();
|
poseBuilder.setTimestamp(timestamp);
|
poseBuilder.setNaviPose(wgsBuilder.build());
|
|
// 构建 VehicleStaticInfo
|
VehicleStaticInfo.Builder staticInfoBuilder = VehicleStaticInfo.newBuilder();
|
staticInfoBuilder.setXpuId(xpuId);
|
staticInfoBuilder.setTimestamp(timestamp);
|
|
// 构建 VehicleDynamicStatus
|
VehicleDynamicStatus.Builder dynamicStatusBuilder = VehicleDynamicStatus.newBuilder();
|
dynamicStatusBuilder.setGearLevel(GearLevel.GEAR_D);
|
dynamicStatusBuilder.setSteeringAngle(0.5f);
|
dynamicStatusBuilder.setSpeed((float) speed);
|
dynamicStatusBuilder.setTimestamp(timestamp);
|
dynamicStatusBuilder.setBmsSocDisp(80);
|
dynamicStatusBuilder.setDstBatDisp(400.5f);
|
|
// 构建 VehicleStatus
|
VehicleStatus.Builder vehicleStatusBuilder = VehicleStatus.newBuilder();
|
vehicleStatusBuilder.setStaticInfo(staticInfoBuilder.build());
|
vehicleStatusBuilder.setDynamicStatus(dynamicStatusBuilder.build());
|
|
// 构建 SystemStatus
|
SystemStatus.Builder systemStatusBuilder = SystemStatus.newBuilder();
|
systemStatusBuilder.setPhase(SystemPhase.SYSTEM_NORMAL);
|
systemStatusBuilder.setAbnormalReason(AbnormalReason.ABNORMAL_REASON_UNSPECIFIED);
|
systemStatusBuilder.addAvailableServices(ServiceAvailability.ROBOTAXI_AVAILABLE);
|
systemStatusBuilder.setIsEmergency(false);
|
|
// 构建 SystemRuntimeStatus
|
SystemRuntimeStatus.Builder statusBuilder = SystemRuntimeStatus.newBuilder();
|
statusBuilder.setTimestamp(timestamp);
|
statusBuilder.setUid(uid);
|
statusBuilder.setVehicleStatus(vehicleStatusBuilder.build());
|
statusBuilder.setSystemStatus(systemStatusBuilder.build());
|
statusBuilder.setDrivingMode(DrivingMode.AUTONOMOUS);
|
statusBuilder.setPose(poseBuilder.build());
|
|
// 构建 OrderStatusInfo (运行中的订单状态信息)
|
if (StrUtil.isNotBlank(orderId)) {
|
OrderStatusInfo.Builder orderStatusInfoBuilder = OrderStatusInfo.newBuilder();
|
orderStatusInfoBuilder.setOrderId(orderId);
|
orderStatusInfoBuilder.setStatus(OrderStatus.ORDER_EN_ROUTE_TO_DESTINATION); // 前往目的地
|
orderStatusInfoBuilder.setOrderPhase(OrderPhase.ROUTE_TO_DESTINATION);
|
orderStatusInfoBuilder.setChangeSource(OrderStateChangeSource.ORDER_STATE_CHANGE_SOURCE_VEHICLE);
|
orderStatusInfoBuilder.setTimestamp(timestamp);
|
statusBuilder.setRunningOrderStatusInfo(orderStatusInfoBuilder.build()); // 设置运行中的订单信息
|
}
|
|
// 设置 SystemRuntimeStatus 到 MsgContent
|
msgContentBuilder.setSystemRuntimeStatus(statusBuilder.build());
|
|
return msgContentBuilder.build();
|
}
|
|
/**
|
* 主方法 - 测试示例
|
*/
|
public static void main(String[] args) {
|
// 默认测试参数
|
double longitude = 113.382238; // 经度
|
double latitude = 23.156917; // 纬度
|
int course = 90; // 方位角(度)
|
double speed = 10.5; // 速度(米/秒)
|
long uid = 8107912; // 用户ID
|
String xpuId = "c47b405bee79000f282a36e800000000"; // XPU设备ID
|
String orderId = ""; // 订单ID
|
|
// 解析命令行参数
|
if (args.length >= 6) {
|
try {
|
longitude = Double.parseDouble(args[0]);
|
latitude = Double.parseDouble(args[1]);
|
course = Integer.parseInt(args[2]);
|
speed = Double.parseDouble(args[3]);
|
uid = Long.parseLong(args[4]);
|
xpuId = args[5];
|
if (args.length >= 7) {
|
orderId = args[6];
|
}
|
} catch (NumberFormatException e) {
|
System.err.println("❌ 参数格式错误!");
|
printUsage();
|
System.exit(1);
|
}
|
} else if (args.length > 0 && args.length < 6) {
|
System.err.println("❌ 参数数量不正确!");
|
printUsage();
|
System.exit(1);
|
}
|
|
System.out.println("╔════════════════════════════════════════╗");
|
System.out.println("║ GPS单点位置发送测试工具 ║");
|
System.out.println("╚════════════════════════════════════════╝\n");
|
|
// 发送位置信息
|
boolean success = sendPosition(longitude, latitude, course, speed, uid, xpuId, orderId);
|
|
System.out.println("\n========================================");
|
if (success) {
|
System.out.println("✓ 测试完成 - 发送成功");
|
} else {
|
System.out.println("✗ 测试完成 - 发送失败");
|
}
|
System.out.println("========================================");
|
|
System.exit(success ? 0 : 1);
|
}
|
|
/**
|
* 打印使用说明
|
*/
|
private static void printUsage() {
|
System.out.println("\n使用方法:");
|
System.out.println("========================================");
|
System.out.println("java SinglePositionTester [参数...]");
|
System.out.println();
|
System.out.println("参数列表(全部可选,不提供则使用默认值):");
|
System.out.println(" 1. 经度 (longitude)");
|
System.out.println(" 2. 纬度 (latitude)");
|
System.out.println(" 3. 方位角 (course, 0-360度)");
|
System.out.println(" 4. 速度 (speed, 米/秒)");
|
System.out.println(" 5. 用户ID (uid)");
|
System.out.println(" 6. XPU设备ID (xpuId)");
|
System.out.println(" 7. 订单ID (orderId, 可选)");
|
System.out.println();
|
System.out.println("示例:");
|
System.out.println(" # 使用默认参数");
|
System.out.println(" java SinglePositionTester");
|
System.out.println();
|
System.out.println(" # 自定义参数(不含订单ID)");
|
System.out.println(" java SinglePositionTester 113.3245 23.1235 90 10.5 12345678 c47b405bee79000f282a36e800000000");
|
System.out.println();
|
System.out.println(" # 自定义参数(含订单ID)");
|
System.out.println(" java SinglePositionTester 113.3245 23.1235 90 10.5 12345678 c47b405bee79000f282a36e800000000 XU100001");
|
System.out.println();
|
System.out.println(" # 测试广州天河区某个位置");
|
System.out.println(" java SinglePositionTester 113.3245 23.1235 45 15.0 88888888 c47b405bee79000f282a36e800000000 XU200002");
|
System.out.println("========================================");
|
}
|
}
|