# UDP多播接收功能说明 ## 概述 本功能实现了UDP多播接收逻辑,对应C++代码`TLogServer.cpp`中的接收广播机制。服务通过UDP多播接收COP(Common Object Protocol)协议数据,解析后交由`TranLogService`处理。 ## 功能对应关系 ### C++代码对应关系 | C++代码 | Java实现 | 说明 | |---------|---------|------| | `m_RecvCtrl.Start(m_iRecvPort, m_IP.c_str())` | `MulticastReceiverService.start()` | 启动UDP多播接收 | | `m_RecvCtrl.AddGroup(m_GroupIPArray[GIPIndex].c_str(), m_IP.c_str())` | `MulticastReceiverService.start()` 中的 `socket.joinGroup()` | 加入多播组 | | `m_RecvCtrl.RegisterCallback(CallbackFunc, this)` | `MulticastReceiverService.receiveLoop()` | 注册回调函数 | | `CTranLogServer::CallbackFunc(COP_ITEM& item)` | `MulticastReceiverService.processReceivedData()` | 回调处理函数 | | `CTranLogServer::Process(item)` | `TranLogService.process(item)` | 处理数据 | ## 配置说明 在 `application.yml` 中配置UDP多播接收参数: ```yaml multicast: receiver: # 是否启用UDP多播接收 enabled: true # 接收端口(对应C++的RecvPort) recv-port: 5000 # 本地网络接口IP地址(对应C++的IPAddress) ip-address: 0.0.0.0 # 多播组IP地址列表(对应C++的GroupIP0, GroupIP1, ...) group-ips: - 225.6.7.8 # 可以配置多个多播组 # - 225.6.7.9 # 接收缓冲区大小(字节) buffer-size: 65536 # 接收超时时间(毫秒) timeout: 1000 ``` ### 环境变量配置 也可以通过环境变量配置: - `MULTICAST_RECEIVER_ENABLED`: 是否启用(默认:true) - `MULTICAST_RECEIVER_PORT`: 接收端口(默认:5000) - `MULTICAST_RECEIVER_IP`: 本地IP地址(默认:0.0.0.0) - `MULTICAST_GROUP_IP_0`: 第一个多播组IP - `MULTICAST_BUFFER_SIZE`: 缓冲区大小(默认:65536) - `MULTICAST_TIMEOUT`: 超时时间(默认:1000) ## 核心组件 ### 1. MulticastConfig 配置类,读取UDP多播接收相关配置。 **位置**: `com.afe.dc.tranlog.config.MulticastConfig` ### 2. MulticastReceiverService UDP多播接收服务,负责: - 创建并绑定UDP多播Socket - 加入配置的多播组 - 接收UDP数据包 - 调用COP解析器解析数据 - 将解析后的数据传递给TranLogService处理 **位置**: `com.afe.dc.tranlog.service.MulticastReceiverService` **生命周期**: - `@PostConstruct`: 应用启动时自动启动接收服务 - `@PreDestroy`: 应用关闭时自动停止接收服务 ### 3. COPParser COP协议解析器,负责将UDP接收到的字节数据解析为`COPItem`对象。 **位置**: `com.afe.dc.tranlog.service.COPParser` **功能**: - 解析COP消息头(消息类型、ItemNo等) - 解析FID字段数据 - 支持多种数据类型(CHAR、SHORT、INT、LONG、FLOAT、DOUBLE、STRING等) **注意**: COP协议的具体格式可能需要根据实际协议规范进行调整。 ## 数据流程 ``` 外部数据源(Data Provider) │ │ (UDP 多播发送 COP 协议数据) ▼ MulticastReceiverService (接收端) │ │ (接收UDP数据包) ▼ COPParser.parse() (解析COP协议) │ │ (转换为COPItem对象) ▼ TranLogService.process() (处理数据) │ ▼ TranDatabaseService (更新数据库) ``` ## 启动和停止 ### 自动启动 服务会在Spring Boot应用启动时自动启动(通过`@PostConstruct`注解)。 ### 手动控制 可以通过配置`multicast.receiver.enabled=false`来禁用UDP多播接收功能。 ### 停止 服务会在Spring Boot应用关闭时自动停止(通过`@PreDestroy`注解),包括: - 离开所有多播组 - 关闭Socket - 停止接收线程 ## 日志 服务会输出以下关键日志: - 启动成功:`[MulticastReceiverService] Started UDP multicast receiver on port: {port}, groups: {groups}` - 加入多播组:`[MulticastReceiverService] Joined multicast group: {ip} on interface: {interface}` - 接收数据:`[MulticastReceiverService] Processing COP item: itemNo={itemNo}, msgType={msgType}` - 解析失败:`[COPParser] Failed to parse COP data` - 处理失败:`[MulticastReceiverService] Failed to process COP item` ## 注意事项 1. **COP协议格式**: 当前实现的COP解析器是基于通用协议的假设。如果实际的COP协议格式不同,需要调整`COPParser`的解析逻辑。 2. **网络权限**: 在某些操作系统上,加入多播组可能需要特殊权限。 3. **防火墙**: 确保防火墙允许UDP数据包通过配置的端口。 4. **网络接口**: 如果配置了特定的IP地址,确保该IP地址对应的网络接口存在且可用。 5. **性能**: 接收缓冲区大小和超时时间可以根据实际网络环境调整。 ## 故障排查 ### 无法接收数据 1. 检查配置是否正确(端口、多播组IP) 2. 检查网络接口是否正确 3. 检查防火墙设置 4. 查看日志中的错误信息 ### 解析失败 1. 检查COP协议格式是否与实现一致 2. 查看日志中的详细错误信息 3. 可能需要调整`COPParser`的解析逻辑 ### 处理失败 1. 检查`TranLogService`的日志 2. 检查数据库连接 3. 检查数据格式是否正确 ## 扩展 如果需要支持更多的COP协议特性,可以: 1. 扩展`COPParser`以支持更多的数据类型 2. 添加更多的FID字段解析逻辑 3. 添加数据验证和错误处理 4. 添加性能监控和统计