181 lines
5.3 KiB
Markdown
181 lines
5.3 KiB
Markdown
|
|
# 通信状态消息处理功能
|
|||
|
|
|
|||
|
|
## 功能概述
|
|||
|
|
|
|||
|
|
本功能实现了对设备通信状态消息的处理,包括:
|
|||
|
|
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<ProcessResult> 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<IDeviceCommunicationStateService, DeviceCommunicationStateService>();
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 日志记录
|
|||
|
|
|
|||
|
|
### 通信状态消息处理日志
|
|||
|
|
- **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<string, string>
|
|||
|
|
{
|
|||
|
|
["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. **错误恢复**: 处理缓存服务不可用时的降级策略
|