# 通信状态消息处理功能 ## 功能概述 本功能实现了对设备通信状态消息的处理,包括: 1. 解析通信状态消息并保存到缓存 2. 在遥测和遥信召唤时检查设备通信状态 3. 对通信状态异常的设备跳过数据召唤操作 ## 消息格式 ### 通信状态消息示例 ```json { "Type": "CommState", "Content": [ {"DeviceID": "B009002", "CommState": "0"}, {"DeviceID": "B009003", "CommState": "1"} ] } ``` ### 通信状态值含义 - `"0"`: 断开/异常 - `"1"`: 正常/连接 ## 核心组件 ### 1. IDeviceCommunicationStateService 设备通信状态服务接口,提供以下功能: - `SetDeviceCommunicationStateAsync`: 设置单个设备通信状态 - `GetDeviceCommunicationStateAsync`: 获取设备通信状态 - `IsDeviceCommunicationNormalAsync`: 检查设备通信状态是否正常 - `SetDeviceCommunicationStatesAsync`: 批量设置设备通信状态 - `ClearDeviceCommunicationStateAsync`: 清除设备通信状态缓存 ### 2. DeviceCommunicationStateService 服务实现类,使用 `IMemoryCache` 进行状态缓存: - 缓存过期时间:60分钟 - 滑动过期时间:30分钟 - 线程安全的缓存操作 ### 3. CommunicationStateMessage 通信状态消息数据模型: - `Type`: 消息类型(固定为 "CommState") - `Content`: 设备通信状态列表 ### 4. DeviceCommunicationState 设备通信状态数据模型: - `DeviceID`: 设备ID - `CommState`: 通信状态值 - `IsNormal()`: 检查是否为正常状态 - `GetStateDescription()`: 获取状态描述 ## 处理流程 ### 1. 通信状态消息处理(DataProcessor) ```csharp private async Task ProcessCommStateMessageAsync(JToken contentToken) { // 1. 解析Content数组中的每个设备通信状态信息 // 2. 验证设备ID和通信状态值 // 3. 批量保存到缓存 // 4. 记录处理结果日志 } ``` ### 2. 遥测召唤时的通信状态检查(TelemetryCallService) ```csharp // 检查设备通信状态 bool isCommNormal = await _deviceCommunicationStateService.IsDeviceCommunicationNormalAsync(device.Id, cancellationToken); if (!isCommNormal) { _logger.LogWarning("装置通信状态异常,取消数据召唤操作 - 设备ID: {DeviceId} ({DeviceName})", device.Id, device.DeviceName); commStateSkippedCount++; commStateSkippedDevices.Add($"{device.Id}({device.DeviceName})"); continue; } ``` ## 服务注册 在 `ServiceCollectionExtensions.cs` 中添加了以下服务注册: ```csharp // 添加内存缓存服务 services.AddMemoryCache(); // 设备通信状态服务 services.AddSingleton(); ``` ## 日志记录 ### 通信状态消息处理日志 - **Info**: 开始处理通信状态消息 - **Debug**: 解析单个设备通信状态 - **Warning**: 设备ID或通信状态为空 - **Error**: 处理异常 ### 遥测召唤日志 - **Warning**: 装置通信状态异常,取消数据召唤操作 - **Info**: 任务执行完成统计(包含通信状态异常跳过的设备数量) ## 使用示例 ### 1. 基本使用 ```csharp // 注入服务 private readonly IDeviceCommunicationStateService _deviceCommunicationStateService; // 设置设备通信状态 await _deviceCommunicationStateService.SetDeviceCommunicationStateAsync("B009002", "1"); // 检查设备通信状态 bool isNormal = await _deviceCommunicationStateService.IsDeviceCommunicationNormalAsync("B009002"); // 批量设置 var deviceStates = new Dictionary { ["B009002"] = "1", ["B009003"] = "0" }; await _deviceCommunicationStateService.SetDeviceCommunicationStatesAsync(deviceStates); ``` ### 2. 完整示例 参见 `Examples/CommunicationStateExample.cs` 文件,包含: - 通信状态消息处理演示 - 遥测召唤时的状态检查演示 - 缓存清理功能演示 ## 技术特性 ### 1. 异步编程 - 所有方法都支持异步操作 - 支持 `CancellationToken` 取消令牌 - 遵循 `async/await` 最佳实践 ### 2. 异常处理 - 完善的异常处理和日志记录 - 区分业务异常和系统异常 - 优雅的错误恢复机制 ### 3. 线程安全 - 使用 `lock` 确保缓存操作的线程安全 - 支持并发访问 ### 4. 性能优化 - 使用内存缓存提高查询性能 - 批量操作减少网络开销 - 合理的缓存过期策略 ## 配置说明 ### 缓存配置 ```csharp private const int CACHE_EXPIRATION_MINUTES = 60; // 1小时过期 private const string NORMAL_STATE = "1"; // 正常通信状态值 ``` ### 日志级别 - **Debug**: 详细的操作日志 - **Info**: 重要的业务流程日志 - **Warning**: 需要关注的异常情况 - **Error**: 系统错误 ## 扩展建议 1. **Redis缓存**: 考虑使用Redis替代MemoryCache,支持分布式部署 2. **状态持久化**: 将通信状态持久化到数据库,支持系统重启后恢复 3. **状态变更通知**: 实现状态变更事件通知机制 4. **监控告警**: 添加通信状态异常的监控和告警功能 5. **配置化**: 将通信状态值含义配置化,支持不同的设备类型 ## 注意事项 1. **内存使用**: MemoryCache会占用应用程序内存,需要监控内存使用情况 2. **缓存一致性**: 在分布式环境中需要考虑缓存一致性问题 3. **状态同步**: 确保通信状态消息的及时处理和更新 4. **错误恢复**: 处理缓存服务不可用时的降级策略