Пример #1
0
        /// <inheritdoc cref="IMqttClient.UnsubscribeAsync" />
        public Task <MqttClientUnsubscribeResult> UnsubscribeAsync(
            MqttClientUnsubscribeOptions options,
            CancellationToken cancellationToken)
        {
            Check.NotNull(options, nameof(options));

            _broker.Unsubscribe(ClientId, options.TopicFilters);

            var result = new MqttClientUnsubscribeResult();

            options.TopicFilters.ForEach(filter => result.Items.Add(MapUnsubscribeResultItem(filter)));
            return(Task.FromResult(result));
        }
Пример #2
0
        public MqttUnsubscribePacket CreateUnsubscribePacket(MqttClientUnsubscribeOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var unsubscribePacket = new MqttUnsubscribePacket();

            unsubscribePacket.TopicFilters.AddRange(options.TopicFilters);

            return(unsubscribePacket);
        }
Пример #3
0
        public async Task UnsubscribeAsync(string topic)
        {
            if (!IsSubscribed(topic))
            {
                return;
            }

            var options = new MqttClientUnsubscribeOptions();

            options.TopicFilters = new List <string> {
                topic
            };
            await client.UnsubscribeAsync(options);

            mqttState.RemoveSubscription(s => s.Topic == topic);
        }
Пример #4
0
        public MqttUnsubscribePacket CreateUnsubscribePacket(MqttClientUnsubscribeOptions options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            var packet = new MqttUnsubscribePacket
            {
                Properties = new MqttUnsubscribePacketProperties()
            };

            packet.TopicFilters.AddRange(options.TopicFilters);
            packet.Properties.UserProperties = options.UserProperties;

            return(packet);
        }
Пример #5
0
        public static Task <MqttClientUnsubscribeResult> UnsubscribeAsync(this IMqttClient client, params string[] topicFilters)
        {
            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }
            if (topicFilters == null)
            {
                throw new ArgumentNullException(nameof(topicFilters));
            }

            var options = new MqttClientUnsubscribeOptions();

            options.TopicFilters.AddRange(topicFilters);

            return(client.UnsubscribeAsync(options));
        }
Пример #6
0
        public async Task <MqttClientUnsubscribeResult> UnsubscribeAsync(MqttClientUnsubscribeOptions options, CancellationToken cancellationToken)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            ThrowIfDisposed();
            ThrowIfNotConnected();

            var unsubscribePacket = _adapter.PacketFormatterAdapter.DataConverter.CreateUnsubscribePacket(options);

            unsubscribePacket.PacketIdentifier = _packetIdentifierProvider.GetNextPacketIdentifier();

            var unsubAckPacket = await SendAndReceiveAsync <MqttUnsubAckPacket>(unsubscribePacket, cancellationToken).ConfigureAwait(false);

            return(_adapter.PacketFormatterAdapter.DataConverter.CreateClientUnsubscribeResult(unsubscribePacket, unsubAckPacket));
        }
Пример #7
0
        public MqttUnsubscribePacket CreateUnsubscribePacket(MqttClientUnsubscribeOptions 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 unsubscribePacket = new MqttUnsubscribePacket();

            unsubscribePacket.TopicFilters.AddRange(options.TopicFilters);

            return(unsubscribePacket);
        }
Пример #8
0
        public MqttUnsubscribePacket Create(MqttClientUnsubscribeOptions clientUnsubscribeOptions)
        {
            if (clientUnsubscribeOptions == null)
            {
                throw new ArgumentNullException(nameof(clientUnsubscribeOptions));
            }

            var packet = new MqttUnsubscribePacket
            {
                UserProperties = clientUnsubscribeOptions.UserProperties
            };

            if (clientUnsubscribeOptions.TopicFilters != null)
            {
                packet.TopicFilters.AddRange(clientUnsubscribeOptions.TopicFilters);
            }

            return(packet);
        }
Пример #9
0
        public static Task <MqttClientUnsubscribeResult> UnsubscribeAsync(this IMqttClient client, MqttClientUnsubscribeOptions options)
        {
            if (client == null)
            {
                throw new ArgumentNullException(nameof(client));
            }

            return(client.UnsubscribeAsync(options, CancellationToken.None));
        }
Пример #10
0
        protected virtual void Dispose(bool disposing)
        {
            if (_disposed)
            {
                return;
            }

            _disposed = true;

            EventId eventId = GetNextEventId();

            CancellationTokenSource?cancellationTokenSource = null;

            try
            {
                try
                {
                    MqttClientUnsubscribeOptions mqttClientUnsubscribeOptions = new MqttClientUnsubscribeOptions
                    {
                        TopicFilters = new List <string>
                        {
                            MqttTopics.ClientJoinRequested,
                            MqttTopics.ClientJoinSucceeded,
                            MqttTopics.ClientJoinFailed,
                            MqttTopics.ClientGoodbye,
                            MqttTopics.FragmentDistributionRequested,
                            MqttTopics.FragmentDistributionObtained,
                            MqttTopics.FragmentDistributionFailed
                        }
                    };

                    _logger.LogInformation(eventId, "Unsubscribing from all events from remote Mqtt-Broker.");
                    cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5));
                    var result = _mqttClient.UnsubscribeAsync(mqttClientUnsubscribeOptions, cancellationTokenSource.Token).GetAwaiter().GetResult();

                    foreach (MqttClientUnsubscribeResultItem item in result.Items)
                    {
                        if (item.ReasonCode != MqttClientUnsubscribeResultCode.Success)
                        {
                            throw new Exception($"Expected UnsubscribeResultCode Success for topic \"{item.TopicFilter}\". Actual: {item.ReasonCode}");
                        }
                    }
                }
                catch (OperationCanceledException)
                {
                    _logger.LogError(eventId, "Unsubscribing from all events from remote Mqtt-Broker timed out.");
                }
                catch (Exception exception)
                {
                    _logger.LogError(eventId, exception, "Unsubscribing from all events from remote Mqtt-Broker failed.");
                }
                finally
                {
                    cancellationTokenSource?.Dispose();
                }

                _logger.LogInformation(eventId, "Disconnecting from remote Mqtt-Broker.");
                MqttClientDisconnectOptions disconnectOptions = new MqttClientDisconnectOptions()
                {
                    ReasonCode   = MqttClientDisconnectReason.NormalDisconnection,
                    ReasonString = "Client Disposed"
                };

                cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(5));
                _mqttClient.DisconnectAsync(disconnectOptions, cancellationTokenSource.Token).GetAwaiter().GetResult();
            }
            catch (OperationCanceledException)
            {
                _logger.LogError(eventId, "Disconnecting from remote Mqtt-Broker timed out.");
            }
            catch (Exception exception)
            {
                _logger.LogError(eventId, exception, "Disconnecting from remote Mqtt-Broker failed.");
            }
            finally
            {
                _mqttClient.Dispose();
                cancellationTokenSource?.Dispose();
            }
        }
Пример #11
0
 public async Task UnsubscribeAsync(MqttClientUnsubscribeOptions options, CancellationToken cancellationToken)
 {
     await _mqttClient.UnsubscribeAsync(options, cancellationToken);
 }