using MQTTnet.Client; using Prism.Events; using Prism.Regions; using RIZO_Application.Core; using RIZO_Application.Core.Mvvm; using RIZO_Application.Infrastructure.Model; using RIZO_Helper.Tools; namespace RIZO_Application.Modules.Base.ViewModels { public class MqttControlViewModel : RegionViewModelBase { private readonly IEventAggregator _eventAggregator; private MqttHelper? _mqttHepler; private SubscriptionToken _token; public MqttControlViewModel( IRegionManager regionManager, IEventAggregator eventAggregator) : base(regionManager) { _eventAggregator = eventAggregator; _token = _eventAggregator.GetEvent().Subscribe(OnScanEventReceived, ThreadOption.UIThread, true); Task.Run(Mqtt); } public async Task Mqtt() { string serverUrl = "noConfig"; string clientId = "noConfig"; if (MqttConfigs.Current != null) { serverUrl = MqttConfigs.Current.ServerUrl ?? string.Empty; clientId = MqttConfigs.Current.ClientId ?? string.Empty; } _eventAggregator.GetEvent().Publish($"Mqtt初始化……"); _mqttHepler = new MqttHelper(serverUrl, 1883, clientId); _mqttHepler.MessageReceived += HandleMqttMessage; await _mqttHepler.ConnectAsync(); await _mqttHepler.SubscribeAsync($"shgg_mes/print/{clientId}"); await _mqttHepler.PublishAsync($"shgg_mes/connect/{clientId}","已连接"); // await _mqttHepler.SubscribeAsync("shgg_mes/backEnd/SiteComLabelCode"); _eventAggregator.GetEvent().Publish($"Mqtt初始化完成"); } // 定义事件处理方法 public void HandleMqttMessage(object sender, MqttApplicationMessageReceivedEventArgs e) { // 获取消息的主题 string topic = e.ApplicationMessage.Topic; // 获取消息的负载并转换为字符串 string payload = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload); // 打印接收到的消息信息 _eventAggregator.GetEvent().Publish($"收到信息'{topic}': {payload}"); // 控制打印 PrintDto printMessage = new() { Path = "/", Name = "需要测试打印", Description = "123" }; _eventAggregator.GetEvent().Publish(printMessage); } private async void OnScanEventReceived(string message) { if(_mqttHepler != null) { //TODO JSON重新构造发送信息 await _mqttHepler.PublishAsync($"shgg_mes/backEnd/SiteComLabelCode", message); } } public void Destroy() { _token?.Dispose(); } } }