1 feat(mqtt): 实现MQTT服务器状态管理与事件系统

2
    3 1. 在MqttServer和MqttServerDto模型中添加IsConnect属性,用于跟踪连接状态
    4 2. 重构MqttManagementService服务,使用事件驱动方式管理服务器状态变化
    5 3. 实现MqttServerChangedEventArgs事件参数类,支持区分不同变更类型
    6 4. 在IEventService中添加OnMqttServerChanged事件,实现事件通知机制
    7 5. 优化数据存储结构,将MqttServers从ObservableCollection改为ObservableDictionary
    8 6. 更新MqttServiceManager以正确处理连接状态和事件触发
    9 7. 在WPF层更新UI以响应服务器状态变化
   10 8. 删除不再需要的Helper类(DataServicesHelper, MessageHelper, SiemensHelper)
   11 9. 在NLog配置中添加调试器输出目标以便调试
   12 10. 完善VariableHistoryViewModel防止空引用异常
This commit is contained in:
2025-10-05 00:28:25 +08:00
parent d4562e600e
commit a6fc543e4f
25 changed files with 497 additions and 537 deletions

View File

@@ -48,13 +48,74 @@ public class DataEventService : IDataEventService
// 监听变量值变更事件
_eventService.OnVariableValueChanged += OnVariableValueChanged;
_eventService.OnMqttServerChanged += OnMqttServerChanged;
_appDataCenterService.DataLoaderService.OnLoadDataCompleted += OnLoadDataCompleted;
// 监听日志变更事件
// _appDataCenterService.OnLogChanged += _logDataService.OnNlogChanged;
_logger?.LogInformation("DataEventService 初始化完成");
}
private void OnMqttServerChanged(object? sender, MqttServerChangedEventArgs e)
{
_logger?.LogDebug("接收到Mqtt服务器状态发生了改变服务器名称{mqttName}属性: {mqttProperty}",
e.MqttServer.ServerName, e.PropertyType);
// 在UI线程上更新变量值
App.Current.Dispatcher.BeginInvoke(new Action(() =>
{
//// 查找并更新对应的变量
if (_dataStorageService.MqttServers.TryGetValue(e.MqttServer.Id, out var mqttServerItem))
{
if (e.ChangeType == ActionChangeType.Updated)
{
switch (e.PropertyType)
{
case MqttServerPropertyType.ServerName:
break;
case MqttServerPropertyType.ServerUrl:
break;
case MqttServerPropertyType.Port:
break;
case MqttServerPropertyType.IsConnect:
mqttServerItem.IsConnect=e.MqttServer.IsConnect;
break;
case MqttServerPropertyType.Username:
break;
case MqttServerPropertyType.Password:
break;
case MqttServerPropertyType.IsActive:
break;
case MqttServerPropertyType.SubscribeTopic:
break;
case MqttServerPropertyType.PublishTopic:
break;
case MqttServerPropertyType.ClientId:
break;
case MqttServerPropertyType.MessageFormat:
break;
case MqttServerPropertyType.MessageHeader:
break;
case MqttServerPropertyType.MessageContent:
break;
case MqttServerPropertyType.MessageFooter:
break;
case MqttServerPropertyType.All:
break;
default:
break;
}
}
}
else
{
_logger?.LogWarning("在Mqtt服务器队列中找不到ID为 {MqttServer} 的变量,无法更新值", e.MqttServer.Id);
}
}));
}
private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e)
{
_logger?.LogDebug("接收到数据加载完成事件,成功: {IsSuccess}", e.IsSuccess);

View File

@@ -28,7 +28,7 @@ public class DataStorageService : IDataStorageService
/// <summary>
/// MQTT服务器列表。
/// </summary>
public ObservableCollection<MqttServerItemViewModel> MqttServers { get; set; }
public ObservableDictionary<int, MqttServerItemViewModel> MqttServers { get; set; }
/// <summary>
/// 菜单列表。
@@ -55,7 +55,7 @@ public class DataStorageService : IDataStorageService
Devices=new ObservableDictionary<int,DeviceItemViewModel>();
VariableTables = new ObservableDictionary<int,VariableTableItemViewModel>();
Variables=new ObservableDictionary<int,VariableItemViewModel>();
MqttServers=new ObservableCollection<MqttServerItemViewModel>();
MqttServers=new ObservableDictionary<int, MqttServerItemViewModel>();
Menus=new ObservableCollection<MenuItemViewModel>();
MenuTrees=new ObservableCollection<MenuItemViewModel>();
Nlogs=new ObservableCollection<NlogItemViewModel>();

View File

@@ -41,7 +41,11 @@ public class MqttDataService : IMqttDataService
try
{
// 加载MQTT服务器数据
_dataStorageService.MqttServers = _mapper.Map<ObservableCollection<MqttServerItemViewModel>>(_appDataStorageService.MqttServers.Values);
foreach (var mqttServerDto in _appDataStorageService.MqttServers.Values)
{
_dataStorageService.MqttServers.TryAdd(mqttServerDto.Id,_mapper.Map<MqttServerItemViewModel>(mqttServerDto));
}
}
catch (Exception ex)
{
@@ -61,7 +65,7 @@ public class MqttDataService : IMqttDataService
dto.Id = id;
var mqttServerItem = _mapper.Map<MqttServerItemViewModel>(dto);
_dataStorageService.MqttServers.Add(mqttServerItem);
_dataStorageService.MqttServers.Add(mqttServerItem.Id,mqttServerItem);
return mqttServerItem;
}
@@ -82,7 +86,7 @@ public class MqttDataService : IMqttDataService
public async Task<bool> DeleteMqttServer(MqttServerItemViewModel mqttServer)
{
await _mqttAppService.DeleteMqttServerAsync(mqttServer.Id);
_dataStorageService.MqttServers.Remove(mqttServer);
_dataStorageService.MqttServers.Remove(mqttServer.Id);
return true;
}
}