5.1 KiB
5.1 KiB
通用无人车状态 API 数据源替换实施说明
目标
将现有“通用无人车状态 API(universal_autonomous_vehicle_api)”的数据来源替换为:
- 接口文档1(WebSocket 推送,/ws/at_manager、/ws/at_manager_bsm、/ws/at_manager_path)
- 接口文档2(HTTP 获取,/api/vehicle_manager/v1/vehicles/{vehicleId}/status)
同时保持前端使用的 现有 WebSocket 推送通道与消息结构不变(复用 vehicle_status_update)。
现状要点(便于对照)
DataCollectorService调用DataCollectorDao.getUniversalVehicleStatus()拉取状态数据。DataProcessingService.processUniversalVehicleStatusUpdates()发布VehicleStatusUpdateEvent,由WebSocketMessageBroadcaster推送给前端。UniversalVehicleApiController提供/api/v1/vehicles/{vehicleId}/status给前端请求车辆详情。
总体改造思路
- 通用无人车状态 API 仍然存在,但其数据源改为文档1的 WS 缓存 + 文档2的 HTTP 兜底。
- 复用原有 WS 推送逻辑,保持前端接口与消息不变。
- 所有文档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
- 解析消息 JSON,按
messageName分流:VehicleDetailsVehicleLoginStatusVehicleChassisInfoVehicleOrderInfoVehicleSuspendReportVehicleTailerNumVehiclePositionInfoNaviShortPathReportGetFmsMessage
- 支持重连与连接状态统计(参考
AdxpFlightServiceWebSocketClient)。
2. 增加缓存结构(DataCollectorService)
在 DataCollectorService 内新增缓存(ConcurrentHashMap):
vehicleDetailsCachevehicleLoginStatusCachevehicleChassisCachevehicleOrderCachevehicleSuspendCachevehicleTailerCachevehiclePositionCachevehiclePathCachevehicleFmsMessageCachevehicleSnapshotCache(聚合后的最新快照)
并在 init() 中注册 WS 客户端的消息监听回调,将消息写入缓存。
3. 替换通用状态采集逻辑
保留方法入口,替换内部数据源:
-
DataCollectorDao.getUniversalVehicleStatus()改为:- 从文档1缓存组装
UniversalVehicleStatusDTO - 缺失字段时调用文档2 HTTP
/api/vehicle_manager/v1/vehicles/{vehicleId}/status - 返回完整 DTO
- 从文档1缓存组装
-
DataCollectorService.collectUniversalVehicleStatus()改为:- 不再请求旧 universal API
- 仅通过
getUniversalVehicleStatus()读取新数据源并缓存
4. 调整 DataProcessingService 推送逻辑
processUniversalVehicleStatusUpdates()继续发布VehicleStatusUpdateEvent- 但其数据来源改为新缓存/新聚合结果
- 复用原有
vehicle_status_updateWebSocket 输出
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
验证流程(实施完成后)
- 启动服务后确认 WS 客户端连接成功
- 有文档1数据时,
vehicle_status_update能持续推送给前端 - 前端请求
/api/v1/vehicles/{vehicleId}/status返回正确 - 断开 WS 后,HTTP 兜底仍可返回数据
注意事项
- 采集阶段不要做计算或 WebSocket 推送(遵循采集/处理分离原则)
- 缓存需要带时间戳,避免过期数据污染
- WS 断线要重连,避免数据空档
- 旧 universal API 数据源必须完全停止对前端输出