Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        public static Task <MqttClientSubscribeResult> SubscribeAsync(this IMqttClient client, MqttClientSubscribeOptions options)
        {
            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            return(client.SubscribeAsync(options, CancellationToken.None));
        }
Ejemplo n.º 5
0
        /// <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.");
            }
        }
Ejemplo n.º 6
0
        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);
            }
        }
Ejemplo n.º 7
0
 public async Task SubscribeAsync(MqttClientSubscribeOptions options, CancellationToken cancellationToken)
 {
     await _mqttClient.SubscribeAsync(options, cancellationToken);
 }
Ejemplo n.º 8
0
        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));
        }
Ejemplo n.º 9
0
        /// <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();
            }
        }