QDAirPortBackend0122/实施方案_通用无人车状态API替换.md
2026-01-22 13:19:47 +08:00

5.1 KiB
Raw Blame History

通用无人车状态 API 数据源替换实施说明

目标

将现有“通用无人车状态 APIuniversal_autonomous_vehicle_api”的数据来源替换为

  • 接口文档1WebSocket 推送,/ws/at_manager、/ws/at_manager_bsm、/ws/at_manager_path
  • 接口文档2HTTP 获取,/api/vehicle_manager/v1/vehicles/{vehicleId}/status

同时保持前端使用的 现有 WebSocket 推送通道与消息结构不变(复用 vehicle_status_update)。

现状要点(便于对照)

  1. DataCollectorService 调用 DataCollectorDao.getUniversalVehicleStatus() 拉取状态数据。
  2. DataProcessingService.processUniversalVehicleStatusUpdates() 发布 VehicleStatusUpdateEvent,由 WebSocketMessageBroadcaster 推送给前端。
  3. UniversalVehicleApiController 提供 /api/v1/vehicles/{vehicleId}/status 给前端请求车辆详情。

总体改造思路

  1. 通用无人车状态 API 仍然存在,但其数据源改为文档1的 WS 缓存 + 文档2的 HTTP 兜底
  2. 复用原有 WS 推送逻辑,保持前端接口与消息不变。
  3. 所有文档1 WS 数据入缓存,采集阶段不做计算、不开 WebSocket 推送(遵循采集/处理分离原则)。

详细实施步骤

1. 新增文档1 WebSocket 客户端

位置建议qaup-collision/src/main/java/com/qaup/collision/datacollector/websocket

新增 VehicleManagerWebSocketClient,功能:

  • 连接 3 个 WS
    • /ws/at_manager
    • /ws/at_manager_bsm
    • /ws/at_manager_path
  • 解析消息 JSONmessageName 分流:
    • VehicleDetails
    • VehicleLoginStatus
    • VehicleChassisInfo
    • VehicleOrderInfo
    • VehicleSuspendReport
    • VehicleTailerNum
    • VehiclePositionInfo
    • NaviShortPathReport
    • GetFmsMessage
  • 支持重连与连接状态统计(参考 AdxpFlightServiceWebSocketClient)。

2. 增加缓存结构DataCollectorService

DataCollectorService 内新增缓存ConcurrentHashMap

  • vehicleDetailsCache
  • vehicleLoginStatusCache
  • vehicleChassisCache
  • vehicleOrderCache
  • vehicleSuspendCache
  • vehicleTailerCache
  • vehiclePositionCache
  • vehiclePathCache
  • vehicleFmsMessageCache
  • vehicleSnapshotCache(聚合后的最新快照)

并在 init() 中注册 WS 客户端的消息监听回调,将消息写入缓存。

3. 替换通用状态采集逻辑

保留方法入口,替换内部数据源

  • DataCollectorDao.getUniversalVehicleStatus() 改为:

    1. 从文档1缓存组装 UniversalVehicleStatusDTO
    2. 缺失字段时调用文档2 HTTP /api/vehicle_manager/v1/vehicles/{vehicleId}/status
    3. 返回完整 DTO
  • DataCollectorService.collectUniversalVehicleStatus() 改为:

    • 不再请求旧 universal API
    • 仅通过 getUniversalVehicleStatus() 读取新数据源并缓存

4. 调整 DataProcessingService 推送逻辑

  • processUniversalVehicleStatusUpdates() 继续发布 VehicleStatusUpdateEvent
  • 但其数据来源改为新缓存/新聚合结果
  • 复用原有 vehicle_status_update WebSocket 输出

5. 调整 UniversalVehicleApiController

  • /api/v1/vehicles/{vehicleId}/status 返回逻辑不改结构
  • 调用的新 getUniversalVehicleStatus()(已替换数据源)

字段映射参考文档1 → 通用状态字段)

文档1字段 通用状态字段 说明
VehiclePositionInfo.x/y motionStatus.position.longitude/latitude x→经度, y→纬度
VehiclePositionInfo.theta motionStatus.velocity.direction 缺失则默认 0
VehicleChassisInfo.sys_info.state_info.d_speed_kmph motionStatus.velocity.speed km/h
VehicleChassisInfo.sys_info.state_info.d_battery_available batteryStatus.mainBattery.chargeLevel 转 Double
VehicleLoginStatus.loginStatus operationalStatus.powerStatus login→ON, logout→OFF
VehicleSuspendReport.suspendStatus operationalStatus.emergencyStatus 0→NORMAL, 1/2→EMERGENCY
VehicleOrderInfo.businessKey/jobType/jobStage missionContext.currentMission.* missionId/jobType/进度
NaviShortPathReport.path missionContext.waypoints x/y→经纬度

未映射字段保留在缓存中,后续可扩展。


配置项新增application.yml

建议新增:

data:
  collector:
    vehicle-manager:
      host: 10.3.8.22
      port: 8020
      ws:
        at-manager: /ws/at_manager
        at-manager-bsm: /ws/at_manager_bsm
        at-manager-path: /ws/at_manager_path
      http:
        status: /api/vehicle_manager/v1/vehicles/{vehicleId}/status

验证流程(实施完成后)

  1. 启动服务后确认 WS 客户端连接成功
  2. 有文档1数据时vehicle_status_update 能持续推送给前端
  3. 前端请求 /api/v1/vehicles/{vehicleId}/status 返回正确
  4. 断开 WS 后HTTP 兜底仍可返回数据

注意事项

  1. 采集阶段不要做计算或 WebSocket 推送(遵循采集/处理分离原则)
  2. 缓存需要带时间戳,避免过期数据污染
  3. WS 断线要重连,避免数据空档
  4. 旧 universal API 数据源必须完全停止对前端输出