public MqttSubscribePacket CreateSubscribePacket(MqttClientSubscribeOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } var packet = new MqttSubscribePacket { Properties = new MqttSubscribePacketProperties() }; packet.TopicFilters.AddRange(options.TopicFilters); packet.Properties.SubscriptionIdentifier = options.SubscriptionIdentifier; packet.Properties.UserProperties = options.UserProperties; return(packet); }
public MqttSubscribePacket CreateSubscribePacket(MqttClientSubscribeOptions options) { if (options == null) { throw new ArgumentNullException(nameof(options)); } if (options.UserProperties?.Any() == true) { throw new MqttProtocolViolationException("User properties are not supported in MQTT version 3."); } var subscribePacket = new MqttSubscribePacket(); subscribePacket.TopicFilters.AddRange(options.TopicFilters); return(subscribePacket); }
private async Task SubscribeToTopics() { if (!_mqttClient.IsConnected) { _logger.LogWarning("Subscribed error! MQTT Client is not connected"); return; } if (_settings.ListenerTopics.Count > 0) { var topics = new List <TopicFilter>(); var subscribeOptions = new MqttClientSubscribeOptions(); foreach (var topic in _settings.ListenerTopics) { topics.Add(new TopicFilterBuilder().WithTopic(topic).Build()); } subscribeOptions.TopicFilters = topics; await SubscribeAsync(subscribeOptions, CancellationToken.None); } }
public static Task <MqttClientSubscribeResult> SubscribeAsync(this IMqttClient client, MqttClientSubscribeOptions options) { if (client == null) { throw new ArgumentNullException(nameof(client)); } return(client.SubscribeAsync(options, CancellationToken.None)); }
/// <summary> /// Publishes the icue devices to the MQTT broker and sets up the control topics. /// </summary> internal void PublishDevices() { if (Client.IsConnected) { if (IcueSdk == null) { IcueSdk = new Sdk(false); } if (MqttIcueDeviceList.GetDevices().Length == 0) { GetListOfMqttDevices(); } for (int i = 0; i < MqttIcueDeviceList.GetDevices().Length; i++) { MqttIcueDevice mqttIcueDevice = MqttIcueDeviceList.GetDevices()[i]; if (mqttIcueDevice != null) { Logger.LogInformation(String.Format("Publishing device {0}", mqttIcueDevice.IcueDevice.CorsairDevice.Model)); MqttClientSubscribeOptions subscriptions = new MqttClientSubscribeOptions(); List <TopicFilter> topicFilters = new List <TopicFilter>(); topicFilters.Add(new TopicFilter() { Topic = mqttIcueDevice.CommandTopic, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }); subscriptions.TopicFilters = topicFilters; Client.SubscribeAsync(subscriptions); MqttApplicationMessage publishMessage = new MqttApplicationMessage() { Payload = Encoding.UTF8.GetBytes(mqttIcueDevice.Discovery.ToJson()), Topic = mqttIcueDevice.DiscoveryTopic, Retain = true, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; Client.PublishAsync(publishMessage).ContinueWith(e => { SendStateUpdate(mqttIcueDevice); }); } } if (MqttIcueDeviceList.GetDevices().Length > 0) { //publish the all device entity MqttClientSubscribeOptions subscriptions = new MqttClientSubscribeOptions(); List <TopicFilter> topicFilters = new List <TopicFilter>(); topicFilters.Add(new TopicFilter() { Topic = MqttIcueDeviceList.TOPIC_ALL_DEVICE_SET, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }); subscriptions.TopicFilters = topicFilters; Client.SubscribeAsync(subscriptions); MqttApplicationMessage publishMessage = new MqttApplicationMessage() { Payload = Encoding.UTF8.GetBytes(MqttIcueDeviceList.GetAllDeviceDiscovery().ToJson()), Topic = MqttIcueDeviceList.TOPIC_ALL_DEVICE_CONFIG, Retain = true, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; Client.PublishAsync(publishMessage).ContinueWith(e => { SendStateUpdate(MqttIcueDeviceList.TOPIC_ALL_DEVICE_STATE, MqttIcueDeviceList.GetAllDeviceAverageState()); }); //publish the icue control switch subscriptions = new MqttClientSubscribeOptions(); topicFilters = new List <TopicFilter>(); topicFilters.Add(new TopicFilter() { Topic = TOPIC_CONTROL_SWITCH_SET, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce }); subscriptions.TopicFilters = topicFilters; Client.SubscribeAsync(subscriptions); publishMessage = new MqttApplicationMessage() { Payload = Encoding.UTF8.GetBytes(new MqttIcueControlSwitchDiscovery(TOPIC_CONTROL_SWITCH_STATE, TOPIC_CONTROL_SWITCH_SET).ToJson()), Topic = TOPIC_CONTROL_SWITCH_CONFIG, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce }; Client.PublishAsync(publishMessage).ContinueWith(e => { SendControlSwitchUpdate(); }); } } else { Logger.LogInformation("MQTT broker connection lost."); } }
private async Task <bool> Init() { try { // var options = new MqttClientOptions() { ClientId = userInfo.Guid + "-" + userInfo.Name }; var options = new MqttClientOptions() { ClientId = Guid.NewGuid().ToString("D") }; options.ChannelOptions = new MqttClientTcpOptions() { Server = ServerIp, Port = Port }; options.Credentials = new MqttClientCredentials() { Username = "******", Password = "******" }; options.CleanSession = true; options.KeepAlivePeriod = TimeSpan.FromSeconds(100.5); options.KeepAliveSendInterval = TimeSpan.FromSeconds(20000); if (_mqttClient == null) { _mqttClient = new MqttFactory().CreateMqttClient(); } var handler = new MqttApplicationMessageReceivedHandler(); _mqttClient.ApplicationMessageReceivedHandler = handler; var r = await _mqttClient.ConnectAsync(options); if (r.ResultCode == MQTTnet.Client.Connecting.MqttClientConnectResultCode.Success) { var msgTopicFilter = new TopicFilterBuilder().WithTopic(MQTTTopic.Msg.ToString() + "-" + App.CurrentUser.Id) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build(); var onlineTopicFilter = new TopicFilterBuilder().WithTopic(MQTTTopic.Online.ToString()) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build(); var offlineTopicFilter = new TopicFilterBuilder().WithTopic(MQTTTopic.Offline.ToString()) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build(); var registerTopicFilter = new TopicFilterBuilder().WithTopic(MQTTTopic.Register.ToString()) .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce).Build(); var currentOptions = new MqttClientSubscribeOptions(); currentOptions.TopicFilters.Add(msgTopicFilter); currentOptions.TopicFilters.Add(onlineTopicFilter); currentOptions.TopicFilters.Add(offlineTopicFilter); currentOptions.TopicFilters.Add(registerTopicFilter); var cancel = new CancellationToken(); await _mqttClient.SubscribeAsync(currentOptions); return(true); } else { ToastHelper.Instance.ShortAlert("Server Error!"); return(false); } //r.Wait(cancel); } catch (Exception ex) { ToastHelper.Instance.ShortAlert("Exception!"); return(false); } }
public async Task SubscribeAsync(MqttClientSubscribeOptions options, CancellationToken cancellationToken) { await _mqttClient.SubscribeAsync(options, cancellationToken); }
public static MqttStatus Subscribe(Guid key, string topic, string gxproc, int qos) { try { if (string.IsNullOrEmpty(gxproc)) { throw new ArgumentNullException(nameof(gxproc), "GeneXus procedure parameter cannot be null"); } string fullPath = gxproc; if (!Path.IsPathRooted(gxproc)) { string fileName = $"a{gxproc}.dll"; string baseDir = !string.IsNullOrEmpty(AppDomain.CurrentDomain.RelativeSearchPath) ? AppDomain.CurrentDomain.RelativeSearchPath : AppDomain.CurrentDomain.BaseDirectory; fullPath = Path.Combine(baseDir, fileName); } if (!File.Exists(fullPath)) { throw new FileNotFoundException($"File not found at {fullPath}", fullPath); } MqttClient mqtt = GetClient(key); if (topic.Contains("*") || topic.Contains("+") || topic.Contains("#")) { if (!mqtt.m_config.AllowWildcardsInTopicFilters) { throw new InvalidDataException("Wildcards not allowed for this instance."); } } MqttClientSubscribeOptions options = new MqttClientSubscribeOptions { //TopicFilters = new List<MqttTopicFilter> { new MqttTopicFilter() { Topic = topic, QualityOfServiceLevel = (MQTTnet.Protocol.MqttQualityOfServiceLevel)Enum.ToObject(typeof(MQTTnet.Protocol.MqttQualityOfServiceLevel), qos) } }, TopicFilters = new List <TopicFilter> { new TopicFilter() { Topic = topic, QualityOfServiceLevel = (MQTTnet.Protocol.MqttQualityOfServiceLevel)Enum.ToObject(typeof(MQTTnet.Protocol.MqttQualityOfServiceLevel), qos) } }, UserProperties = new List <MqttUserProperty> { new MqttUserProperty("gxrocedure", $"{{\"gxrocedure\":\"{gxproc}\"}}") } }; if (mqtt.m_mqttClient.ApplicationMessageReceivedHandler == null) { mqtt.m_mqttClient.UseApplicationMessageReceivedHandler(mqtt.ProcessMessage); } MqttClientSubscribeResult result = mqtt.m_mqttClient.SubscribeAsync(options).GetAwaiter().GetResult(); mqtt.AddTopic(topic, fullPath); // GetClient s_topicProcs[GetProcKey(mqtt, topic)] = gxproc; } catch (Exception ex) { return(MqttStatus.Fail(key, ex)); } return(MqttStatus.Success(key)); }
/// <summary> /// Reads the topics from Wiren Board. /// </summary> private void ReadTopics() { IMqttClient mqttClient = null; try { MqttFactory mqttFactory = new(); mqttClient = mqttFactory.CreateMqttClient(); mqttClient.UseApplicationMessageReceivedHandler(MqttClient_ApplicationMessageReceived); logHelper.WriteMessage(string.Format(Locale.IsRussian ? "Соединение с {0}:{1}" : "Connect to {0}:{1}", connOptions.Server, connOptions.Port)); MqttClientConnectResultCode resultCode = mqttClient.ConnectAsync(connOptions.ToMqttClientOptions(), tokenSource.Token) .Result.ResultCode; if (resultCode == MqttClientConnectResultCode.Success) { logHelper.WriteMessage(Locale.IsRussian ? "Соединение установлено успешно" : "Connected successfully"); logHelper.WriteMessage(string.Format(Locale.IsRussian ? "Подписка на {0}" : "Subscribe to {0}", MainTopic)); MqttClientSubscribeOptions subscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder() .WithTopicFilter(f => f.WithTopic(MainTopic)).Build(); mqttClient.SubscribeAsync(subscribeOptions, tokenSource.Token).Wait(); while (!stopReading && !tokenSource.IsCancellationRequested) { Thread.Sleep(ScadaUtils.ThreadDelay); lock (mqttLock) { if (DateTime.UtcNow - messageDT > ReadTimeout) { stopReading = true; logHelper.WriteMessage(Locale.IsRussian ? "Таймаут чтения истёк" : "Read timeout expired"); } } } if (WirenBoardModel.Devices.Count > 0) { logHelper.WriteSuccess(Locale.IsRussian ? "Чтение топиков завершено успешно" : "Reading topics completed successfully"); ReadResult = true; } else { logHelper.WriteError(Locale.IsRussian ? "Подключенные устройства не найдены" : "Connected devices not found"); } } else { logHelper.WriteError(string.Format(Locale.IsRussian ? "Не удалось установить соединение: {0}" : "Unable to connect: {0}", resultCode)); } } catch (Exception ex) { logHelper.WriteError(ex.Message); } finally { Disconnect(mqttClient); OnCompleted(); } }