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