实现的功能:
1. 添加了对 EventService.OnDeviceChanged 事件的订阅
2. 实现了 OnDeviceChanged 事件处理方法,根据变化类型进行相应处理
3. 实现了 HandleDeviceAdded 方法,当设备添加时:
- 检查设备协议是否为 OPC UA
- 将设备添加到监控列表
- 如果设备是激活状态,则自动连接设备
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using DMS.Application.DTOs;
|
using DMS.Application.DTOs;
|
||||||
|
using DMS.Application.Events;
|
||||||
using DMS.Application.Interfaces;
|
using DMS.Application.Interfaces;
|
||||||
using DMS.Application.Models;
|
using DMS.Application.Models;
|
||||||
using DMS.Core.Enums;
|
using DMS.Core.Enums;
|
||||||
@@ -10,7 +11,6 @@ using DMS.Infrastructure.Interfaces.Services;
|
|||||||
using DMS.Infrastructure.Models;
|
using DMS.Infrastructure.Models;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using Microsoft.Extensions.Options;
|
using Microsoft.Extensions.Options;
|
||||||
using VariableValueChangedEventArgs = DMS.Core.Events.VariableValueChangedEventArgs;
|
|
||||||
|
|
||||||
namespace DMS.Infrastructure.Services.OpcUa
|
namespace DMS.Infrastructure.Services.OpcUa
|
||||||
{
|
{
|
||||||
@@ -46,6 +46,7 @@ namespace DMS.Infrastructure.Services.OpcUa
|
|||||||
_semaphore = new SemaphoreSlim(_options.MaxConcurrentConnections, _options.MaxConcurrentConnections);
|
_semaphore = new SemaphoreSlim(_options.MaxConcurrentConnections, _options.MaxConcurrentConnections);
|
||||||
|
|
||||||
_eventService.OnDeviceActiveChanged += OnDeviceActiveChanged;
|
_eventService.OnDeviceActiveChanged += OnDeviceActiveChanged;
|
||||||
|
_eventService.OnDeviceChanged += OnDeviceChanged;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void OnDeviceActiveChanged(object? sender, DeviceActiveChangedEventArgs e)
|
private async void OnDeviceActiveChanged(object? sender, DeviceActiveChangedEventArgs e)
|
||||||
@@ -60,6 +61,165 @@ namespace DMS.Infrastructure.Services.OpcUa
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnDeviceChanged(object? sender, DeviceChangedEventArgs e)
|
||||||
|
{
|
||||||
|
switch (e.ChangeType)
|
||||||
|
{
|
||||||
|
case DataChangeType.Added:
|
||||||
|
// 当设备被添加时,加载并连接该设备
|
||||||
|
HandleDeviceAdded(e.Device);
|
||||||
|
break;
|
||||||
|
case DataChangeType.Updated:
|
||||||
|
// 当设备被更新时,更新其配置
|
||||||
|
HandleDeviceUpdated(e.Device);
|
||||||
|
break;
|
||||||
|
case DataChangeType.Deleted:
|
||||||
|
// 当设备被删除时,移除设备监控
|
||||||
|
HandleDeviceRemoved(e.Device.Id);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理设备添加事件
|
||||||
|
/// </summary>
|
||||||
|
private void HandleDeviceAdded(DeviceDto device)
|
||||||
|
{
|
||||||
|
if (device == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("HandleDeviceAdded: 接收到空设备对象");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查设备协议是否为OPC UA
|
||||||
|
if (device.Protocol != Core.Enums.ProtocolType.OpcUa)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("设备 {DeviceId} ({DeviceName}) 不是OPC UA协议,跳过加载",
|
||||||
|
device.Id, device.Name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_logger.LogInformation("处理设备添加事件: {DeviceId} ({DeviceName})",
|
||||||
|
device.Id, device.Name);
|
||||||
|
|
||||||
|
// 添加设备到监控列表
|
||||||
|
AddDevice(device);
|
||||||
|
|
||||||
|
// 如果设备是激活状态,则尝试连接
|
||||||
|
if (device.IsActive)
|
||||||
|
{
|
||||||
|
// 使用Task.Run来避免阻塞事件处理
|
||||||
|
_ = Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await ConnectDeviceAsync(device.Id, CancellationToken.None);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "连接新添加的设备 {DeviceId} ({DeviceName}) 时发生错误",
|
||||||
|
device.Id, device.Name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "处理设备添加事件时发生错误: {DeviceId} ({DeviceName})",
|
||||||
|
device?.Id, device?.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理设备更新事件
|
||||||
|
/// </summary>
|
||||||
|
private void HandleDeviceUpdated(DeviceDto device)
|
||||||
|
{
|
||||||
|
if (device == null)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("HandleDeviceUpdated: 接收到空设备对象");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 检查设备协议是否为OPC UA
|
||||||
|
if (device.Protocol != Core.Enums.ProtocolType.OpcUa)
|
||||||
|
{
|
||||||
|
_logger.LogInformation("设备 {DeviceId} ({DeviceName}) 不是OPC UA协议,跳过更新",
|
||||||
|
device.Id, device.Name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_logger.LogInformation("处理设备更新事件: {DeviceId} ({DeviceName})",
|
||||||
|
device.Id, device.Name);
|
||||||
|
|
||||||
|
// 先移除旧设备配置
|
||||||
|
if (_deviceContexts.TryGetValue(device.Id, out var oldContext))
|
||||||
|
{
|
||||||
|
// 断开旧连接
|
||||||
|
_ = Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await DisconnectDeviceAsync(device.Id, CancellationToken.None);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "断开旧设备 {DeviceId} ({DeviceName}) 连接时发生错误",
|
||||||
|
device.Id, device.Name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加更新后的设备
|
||||||
|
AddDevice(device);
|
||||||
|
|
||||||
|
// 如果设备是激活状态,则尝试连接
|
||||||
|
if (device.IsActive)
|
||||||
|
{
|
||||||
|
// 使用Task.Run来避免阻塞事件处理
|
||||||
|
_ = Task.Run(async () =>
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await ConnectDeviceAsync(device.Id, CancellationToken.None);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "连接更新后的设备 {DeviceId} ({DeviceName}) 时发生错误",
|
||||||
|
device.Id, device.Name);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "处理设备更新事件时发生错误: {DeviceId} ({DeviceName})",
|
||||||
|
device?.Id, device?.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理设备删除事件
|
||||||
|
/// </summary>
|
||||||
|
private async void HandleDeviceRemoved(int deviceId)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_logger.LogInformation("处理设备删除事件: {DeviceId}", deviceId);
|
||||||
|
|
||||||
|
// 从监控列表中移除设备
|
||||||
|
await RemoveDeviceAsync(deviceId, CancellationToken.None);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "处理设备删除事件时发生错误: {DeviceId}", deviceId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化服务管理器
|
/// 初始化服务管理器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
Reference in New Issue
Block a user