SOMS/src/YunDa.Server/YunDa.Server.ISMSTcp/README_CommunicationState.md
2025-09-03 10:16:04 +08:00

5.3 KiB
Raw Blame History

通信状态消息处理功能

功能概述

本功能实现了对设备通信状态消息的处理,包括:

  1. 解析通信状态消息并保存到缓存
  2. 在遥测和遥信召唤时检查设备通信状态
  3. 对通信状态异常的设备跳过数据召唤操作

消息格式

通信状态消息示例

{
  "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

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: 系统错误

扩展建议

  1. Redis缓存: 考虑使用Redis替代MemoryCache支持分布式部署
  2. 状态持久化: 将通信状态持久化到数据库,支持系统重启后恢复
  3. 状态变更通知: 实现状态变更事件通知机制
  4. 监控告警: 添加通信状态异常的监控和告警功能
  5. 配置化: 将通信状态值含义配置化,支持不同的设备类型

注意事项

  1. 内存使用: MemoryCache会占用应用程序内存需要监控内存使用情况
  2. 缓存一致性: 在分布式环境中需要考虑缓存一致性问题
  3. 状态同步: 确保通信状态消息的及时处理和更新
  4. 错误恢复: 处理缓存服务不可用时的降级策略