SOMS/src/YunDa.Server/YunDa.Server.ISMSTcp/README_CommunicationState.md

181 lines
5.3 KiB
Markdown
Raw Normal View History

# 通信状态消息处理功能
## 功能概述
本功能实现了对设备通信状态消息的处理,包括:
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. **错误恢复**: 处理缓存服务不可用时的降级策略