# 碰撞避免系统数据采集模块设计文档 本文档详细描述了碰撞避免系统中数据采集模块的设计和实现,包括其架构、主要组件、工作流程以及与其他模块的交互方式。 ## 1. 模块概述 数据采集模块(DataCollector)是碰撞避免系统的核心组件之一,负责从多种数据源实时采集不同类型移动物体(航空器、特勤车辆、无人车等)的位置和状态信息,并提供给系统的其他模块进行处理和分析。该模块采用定时任务机制,定期从外部API获取数据,并维护移动物体的实时状态和历史轨迹。 ### 1.1 功能职责 - 从多个外部数据源采集移动物体的位置和状态信息 - 对采集的原始数据进行初步处理和转换 - 维护移动物体的历史轨迹记录 - 提供数据清理机制,避免历史数据过度积累 - 与系统其他模块协作,为碰撞检测和避险决策提供数据支持 ### 1.2 模块结构 数据采集模块采用分层架构设计,主要包含以下组件: ``` dataCollector/ ├── config/ # 配置类,如RestTemplate配置等 ├── dao/ # 数据访问层,负责与外部数据源交互 ├── model/ # 数据模型,定义数据结构 │ └── enums/ # 枚举类型定义 ├── repository/ # 数据仓库,负责数据存储和检索 └── service/ # 服务层,实现核心业务逻辑 ``` ## 2. 核心组件设计 ### 2.1 数据模型 (model) 数据模型定义了数据采集模块处理的各类数据结构: #### 2.1.1 VehicleLocationInfo.java 用于表示车辆位置信息的数据模型: ```java @Data public class VehicleLocationInfo { private String transId; // 消息唯一id private long timestamp; // 时间戳 private String vehicleId; // 车辆ID private double longitude; // 经度 private double latitude; // 纬度 private double direction; // 车头航向角 private double speed; // 车速 } ``` #### 2.1.2 VehicleCommand.java 用于发送控制指令到无人车的命令模型: ```java // 简化表示,实际实现可能包含更多字段 @Data public class VehicleCommand { private String commandId; // 命令ID private String vehicleId; // 目标车辆ID private String commandType; // 命令类型(如:转向、加速、减速等) private Map parameters; // 命令参数 private long timestamp; // 命令发送时间戳 } ``` #### 2.1.3 CommandResponse.java 命令执行响应模型,用于接收无人车对命令的执行结果: ```java @Data public class CommandResponse { private String commandId; // 对应的命令ID private boolean success; // 执行是否成功 private String message; // 执行结果消息 private long timestamp; // 响应时间戳 } ``` ### 2.2 数据访问对象 (dao) 数据访问对象负责与外部数据源的通信,获取原始数据: #### 2.2.1 DataCollectorDao.java ```java @Slf4j @Component public class DataCollectorDao { // 配置属性 @Value("${data.collector.vehicle-api.base-url}") private String vehicleBaseUrl; @Value("${data.collector.vehicle-api.endpoints.vehicle-location}") private String vehicleLocationEndpoint; private final RestTemplate restTemplate; private final AuthService authService; // 构造函数注入依赖 public DataCollectorDao(RestTemplate restTemplate, AuthService authService) { this.restTemplate = restTemplate; this.authService = authService; } // 采集航空器数据 public List collectAircraftData(String endpoint, String baseUrl) { // 通过HTTP请求获取航空器数据 // 处理响应并返回数据列表 } // 采集特种车辆数据 public List collectVehicleData(String endpoint, String baseUrl) { // 通过HTTP请求获取特种车辆数据 // 处理响应并返回数据列表 } // 获取无人车位置信息 public List getVehicleLocationInfo() { // 通过HTTP请求获取无人车位置数据 // 处理响应并返回数据列表 } } ``` DAO层的主要职责: - 构建HTTP请求,包括URL、头信息等 - 处理授权认证(通过AuthService获取令牌) - 发送请求并接收响应 - 将响应数据转换为系统内部数据模型 - 提供异常处理和日志记录 ### 2.3 服务层 (service) 服务层实现核心业务逻辑,包括数据采集调度、处理和存储: #### 2.3.1 DataCollectorService.java ```java @Slf4j @Service public class DataCollectorService { // 配置信息 @Value("${data.collector.airport-api.endpoints.vehicle}") private String airportVehicleEndpoint; @Value("${data.collector.airport-api.endpoints.aircraft}") private String airportAircraftEndpoint; @Value("${data.collector.airport-api.base-url}") private String airportBaseUrl; // 内存数据存储 @Getter ConcurrentHashMap> dataMap = new ConcurrentHashMap<>(); @Autowired private DataCollectorDao dataCollectorDao; @Autowired private MovingObjectRepository movingObjectRepository; // 定时采集航空器数据 @Scheduled(fixedRateString = "${data.collector.interval}") public void collectAircraftData() { // 调用DAO获取最新数据 // 处理和更新历史状态 // 存储到仓库中 } // 定时采集特种车辆数据 @Scheduled(fixedRateString = "${data.collector.interval}") @Async // 异步执行 public void collectVehicleData() { // 调用DAO获取最新数据 // 处理和更新历史状态 // 存储到仓库中 } // 定时采集无人车数据 @Scheduled(fixedRateString = "${data.collector.interval}") @Async // 异步执行 public void collectVehicleLocationData() { // 调用DAO获取最新数据 // 处理和更新历史状态 // 存储到仓库中 } } ``` 服务层的主要职责: - 调度定期数据采集任务 - 处理和转换数据,更新移动物体状态 - 维护移动物体的历史状态记录 - 提供数据缓存和快速访问机制 - 与仓库层交互,进行数据持久化 #### 2.3.2 AuthService.java 负责处理与外部API的认证授权: ```java @Service public class AuthService { // 获取访问令牌 public String getToken() { // 实现获取、缓存和刷新令牌的逻辑 // 可能包括用户名/密码认证或其他方式 } } ``` #### 2.3.3 DataCleanupService.java 负责定期清理过期数据,防止系统资源占用过多: ```java @Service @Slf4j public class DataCleanupService { // 定期清理历史数据 @Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1点执行 public void cleanupOldData() { // 实现清理逻辑 // 例如:删除30天前的数据 } } ``` ### 2.4 配置 (config) 定义模块所需的配置类: #### 2.4.1 RestTemplateConfig.java 配置HTTP客户端,用于与外部API通信: ```java @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ObjectMapper objectMapper) { RestTemplate restTemplate = new RestTemplate(); // 配置消息转换器,使用自定义的ObjectMapper // 设置连接超时、读取超时等参数 return restTemplate; } @Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); // 配置特性,如忽略未知属性等 return mapper; } } ``` ## 3. 数据流程和工作机制 ### 3.1 数据采集流程 ```mermaid sequenceDiagram participant 外部API participant DataCollectorDao participant DataCollectorService participant MovingObjectRepository Note over DataCollectorService: 定时触发(@Scheduled) DataCollectorService->>DataCollectorDao: 请求最新数据 DataCollectorDao->>外部API: HTTP请求(带认证令牌) 外部API-->>DataCollectorDao: 返回原始数据 DataCollectorDao-->>DataCollectorService: 转换为内部数据模型 Note over DataCollectorService: 处理历史状态 DataCollectorService->>DataCollectorService: 创建MovementState对象 DataCollectorService->>DataCollectorService: 添加到历史队列 DataCollectorService->>DataCollectorService: 控制历史记录长度 DataCollectorService->>MovingObjectRepository: 更新移动物体状态 Note over MovingObjectRepository: 存储最新状态供其他模块使用 ``` ### 3.2 数据更新机制 数据采集模块采用如下机制维护移动物体的状态: 1. **定时轮询**: 以固定时间间隔(通过`${data.collector.interval}`配置)向外部API发送请求 2. **增量更新**: 每次只更新发生变化的数据,减少系统负担 3. **历史记录**: 为每个移动物体维护一个固定长度(MAX_HISTORY)的历史状态队列 4. **并发处理**: 使用ConcurrentHashMap等线程安全容器存储数据 5. **异步执行**: 通过@Async注解实现采集任务的异步处理 ### 3.3 数据清理机制 为防止数据无限增长占用系统资源,模块实现了数据清理机制: 1. **内存数据控制**: 移动物体历史状态队列限制最大长度(MAX_HISTORY) 2. **定期清理**: DataCleanupService定期(默认每天凌晨)清理过期数据 3. **按时间阈值**: 默认清理30天前的历史数据 ## 4. 与其他模块的交互 ### 4.1 数据提供 数据采集模块作为数据提供方,与其他模块的交互如下: ```mermaid flowchart TD DC[数据采集模块] --> |提供实时位置数据| DP[数据处理模块] DC --> |提供历史轨迹数据| DP DC --> |提供移动物体更新| WS[WebSocket模块] WS --> |推送位置更新给客户端| Client[客户端] DP --> |碰撞风险分析| WS DC --> |查询历史数据| API[控制器API] ``` ### 4.2 接口定义 数据采集模块通过以下方式向其他模块提供数据: 1. **直接依赖注入**: ```java @Service public class ProcessingService { @Autowired private MovingObjectRepository movingObjectRepository; // 使用仓库获取最新数据进行处理 } ``` 2. **事件驱动**: ```java // 在DataCollectorService中 private final ApplicationEventPublisher eventPublisher; // 当检测到新数据时发布事件 eventPublisher.publishEvent(new NewDataEvent(data)); // 在其他模块中 @EventListener public void handleNewData(NewDataEvent event) { // 处理新数据 } ``` ## 5. 配置项 数据采集模块通过application.yml或application.properties文件配置以下参数: ```yaml data: collector: interval: 5000 # 数据采集间隔(毫秒) airport-api: base-url: "https://api.airport.example.com" endpoints: vehicle: "/api/vehicles" aircraft: "/api/aircrafts" vehicle-api: base-url: "https://api.vehicle-vendor.example.com" endpoints: vehicle-location: "/api/location" ``` ## 6. 扩展性设计 ### 6.1 增加新数据源 系统设计支持轻松添加新的数据源: 1. 在DataCollectorDao中添加新的数据采集方法 2. 在DataCollectorService中添加对应的定时任务方法 3. 更新配置文件,添加新数据源的URL和端点 4. 根据需要添加新的数据模型类 ### 6.2 支持不同协议 当前系统主要通过HTTP REST API获取数据,但架构设计支持扩展其他协议: 1. 通过创建专用的连接器类,如 MqttConnector、WebSocketConnector等 2. 在配置中指定通信协议和参数 3. 实现相应的数据处理和转换逻辑 ## 7. 安全考虑 数据采集模块实现了以下安全措施: 1. **认证授权**:通过AuthService管理API访问令牌,定期刷新 2. **数据校验**:验证接收数据的完整性和有效性 3. **异常处理**:妥善处理网络错误和数据异常,防止系统崩溃 4. **数据隔离**:使用独立的数据模型,防止外部数据直接影响核心系统 ## 8. 性能优化 为确保高性能运行,数据采集模块采用以下策略: 1. **并发处理**:使用线程池和异步任务处理多个数据源 2. **数据缓存**:通过内存缓存减少重复数据处理 3. **批量处理**:一次处理多条记录,减少系统调用开销 4. **增量更新**:只处理和传输变化的数据 5. **连接池**:复用HTTP连接,减少连接建立开销 ## 9. 监控和错误处理 ### 9.1 日志记录 系统使用SLF4J进行全面的日志记录: ```java log.info("成功获取航空器数据,数量: {}", dataList.size()); log.error("采集航空器数据失败: {}", endpoint, e); ``` ### 9.2 异常处理 采用try-catch块捕获并处理异常,确保数据采集失败不会影响整个系统运行: ```java try { // 数据采集逻辑 } catch (Exception e) { log.error("数据采集异常: {}", e.getMessage(), e); return Collections.emptyList(); // 返回空结果而非抛出异常 } ``` ## 10. 未来改进 数据采集模块计划的未来改进方向: 1. **自适应采集频率**:根据数据变化频率动态调整采集间隔 2. **数据源健康检查**:定期检测数据源可用性,自动切换备用源 3. **数据质量评估**:引入数据质量评分机制,过滤低质量数据 4. **实时数据流**:从轮询机制升级到实时数据流(如WebSocket、MQTT) 5. **数据压缩**:对历史数据进行智能压缩,减少存储需求