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("========================================"); } }