Exemple #1
0
        public async Task MqttSubscriptionsManager_SubscribeSingleNoSuccess()
        {
            var s = new MqttClientSession("", new ConcurrentDictionary <object, object>(),
                                          new MqttServerEventDispatcher(new TestLogger()), new MqttServerOptions(), new TestLogger());

            var sm = new MqttClientSubscriptionsManager(s, new MqttServerEventDispatcher(new TestLogger()), new MqttServerOptions());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilterBuilder().WithTopic("A/B/C").Build());

            await sm.SubscribeAsync(sp, new MqttConnectPacket());

            Assert.IsFalse(sm.CheckSubscriptions("A/B/X", MqttQualityOfServiceLevel.AtMostOnce).IsSubscribed);
        }
        public void MqttSubscriptionsManager_SubscribeSingleSuccess()
        {
            var sm = new MqttClientSubscriptionsManager("", new MqttServerEventDispatcher(new TestLogger()), new MqttServerOptions());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilterBuilder().WithTopic("A/B/C").Build());

            sm.SubscribeAsync(sp).GetAwaiter().GetResult();

            var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce);

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
        }
        private async Task HandleIncomingSubscribePacketAsync(MqttSubscribePacket subscribePacket)
        {
            // TODO: Let the channel adapter create the packet.
            var subscribeResult = await Session.SubscriptionsManager.SubscribeAsync(subscribePacket, ConnectPacket).ConfigureAwait(false);

            await SendAsync(subscribeResult.ResponsePacket).ConfigureAwait(false);

            if (subscribeResult.CloseConnection)
            {
                StopInternal();
                return;
            }

            await EnqueueSubscribedRetainedMessagesAsync(subscribePacket.TopicFilters).ConfigureAwait(false);
        }
Exemple #4
0
        public async Task <MqttClientSubscribeResult> SubscribeAsync(MqttSubscribePacket subscribePacket)
        {
            if (subscribePacket == null)
            {
                throw new ArgumentNullException(nameof(subscribePacket));
            }

            var result = new MqttClientSubscribeResult
            {
                ResponsePacket  = subscribePacket.CreateResponse <MqttSubAckPacket>(),
                CloseConnection = false
            };

            await _semaphore.WaitAsync().ConfigureAwait(false);

            try
            {
                foreach (var topicFilter in subscribePacket.TopicFilters)
                {
                    var interceptorContext = InterceptSubscribe(topicFilter);
                    if (!interceptorContext.AcceptSubscription)
                    {
                        result.ResponsePacket.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.Failure);
                    }
                    else
                    {
                        result.ResponsePacket.SubscribeReturnCodes.Add(ConvertToMaximumQoS(topicFilter.QualityOfServiceLevel));
                    }

                    if (interceptorContext.CloseConnection)
                    {
                        result.CloseConnection = true;
                    }

                    if (interceptorContext.AcceptSubscription)
                    {
                        _subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
                        TopicSubscribedCallback?.Invoke(_clientId, topicFilter);
                    }
                }
            }
            finally
            {
                _semaphore.Release();
            }

            return(result);
        }
Exemple #5
0
        private static MqttBasePacket DeserializeSubscribe(MqttPacketReader reader)
        {
            var packet = new MqttSubscribePacket
            {
                PacketIdentifier = reader.ReadUInt16()
            };

            while (!reader.EndOfRemainingData)
            {
                packet.TopicFilters.Add(new TopicFilter(
                                            reader.ReadStringWithLengthPrefix(),
                                            (MqttQualityOfServiceLevel)reader.ReadByte()));
            }

            return(packet);
        }
        public void MqttSubscriptionsManager_SubscribeTwoTimesSuccess()
        {
            var sm = new MqttClientSubscriptionsManager("", new MqttServerOptions(), new MqttServerEventDispatcher());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilter("#", MqttQualityOfServiceLevel.AtMostOnce));
            sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtLeastOnce));

            sm.Subscribe(sp);

            var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce);

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtLeastOnce);
        }
        private async Task <MqttBasePacket> DeserializeSubscribeAsync(MqttPacketReader reader)
        {
            var packet = new MqttSubscribePacket
            {
                PacketIdentifier = await reader.ReadRemainingDataUShortAsync(),
            };

            while (!reader.EndOfRemainingData)
            {
                packet.TopicFilters.Add(new TopicFilter(
                                            await reader.ReadRemainingDataStringWithLengthPrefixAsync(),
                                            (MqttQualityOfServiceLevel)await reader.ReadRemainingDataByteAsync()));
            }

            return(packet);
        }
Exemple #8
0
        async Task HandleIncomingSubscribePacketAsync(MqttSubscribePacket subscribePacket, CancellationToken cancellationToken)
        {
            var subscribeResult = await Session.SubscriptionsManager.SubscribeAsync(subscribePacket, ConnectPacket).ConfigureAwait(false);

            var subAckPacket = _channelAdapter.PacketFormatterAdapter.DataConverter.CreateSubAckPacket(subscribePacket, subscribeResult);

            await SendAsync(subAckPacket, cancellationToken).ConfigureAwait(false);

            if (subscribeResult.CloseConnection)
            {
                StopInternal();
                return;
            }

            await EnqueueSubscribedRetainedMessagesAsync(subscribePacket.TopicFilters).ConfigureAwait(false);
        }
        public MqttSubscribePacket Create(MqttClientSubscribeOptions clientSubscribeOptions)
        {
            if (clientSubscribeOptions == null)
            {
                throw new ArgumentNullException(nameof(clientSubscribeOptions));
            }

            var packet = new MqttSubscribePacket
            {
                TopicFilters           = clientSubscribeOptions.TopicFilters,
                SubscriptionIdentifier = clientSubscribeOptions.SubscriptionIdentifier,
                UserProperties         = clientSubscribeOptions.UserProperties
            };

            return(packet);
        }
        public MqttClientSubscribeResult Subscribe(MqttSubscribePacket subscribePacket)
        {
            if (subscribePacket == null)
            {
                throw new ArgumentNullException(nameof(subscribePacket));
            }

            var result = new MqttClientSubscribeResult
            {
                ResponsePacket = new MqttSubAckPacket
                {
                    PacketIdentifier = subscribePacket.PacketIdentifier
                },

                CloseConnection = false
            };

            foreach (var topicFilter in subscribePacket.TopicFilters)
            {
                var interceptorContext = InterceptSubscribe(topicFilter);
                if (!interceptorContext.AcceptSubscription)
                {
                    result.ResponsePacket.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.Failure);
                }
                else
                {
                    result.ResponsePacket.SubscribeReturnCodes.Add(ConvertToMaximumQoS(topicFilter.QualityOfServiceLevel));
                }

                if (interceptorContext.CloseConnection)
                {
                    result.CloseConnection = true;
                }

                if (interceptorContext.AcceptSubscription)
                {
                    lock (_subscriptions)
                    {
                        _subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
                    }

                    _eventDispatcher.OnClientSubscribedTopic(_clientId, topicFilter);
                }
            }

            return(result);
        }
        public async Task MqttSubscriptionsManager_SubscribeSingleSuccess()
        {
            var sp = new MqttSubscribePacket
            {
                TopicFilters = new List <MqttTopicFilter>
                {
                    new MqttTopicFilterBuilder().WithTopic("A/B/C").Build()
                }
            };

            await _subscriptionsManager.Subscribe(sp, CancellationToken.None);

            var result = CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "");

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
        }
        public void MqttSubscriptionsManager_SubscribeDifferentQoSSuccess()
        {
            var sm = new MqttClientSubscriptionsManager("", new MqttServerEventDispatcher(), new MqttServerOptions());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilter {
                Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
            });

            sm.SubscribeAsync(sp).GetAwaiter().GetResult();

            var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce);

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
        }
        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.UserProperties.AddRange(options.UserProperties);

            return(packet);
        }
        public MqttSubAckPacket Subscribe(MqttSubscribePacket subscribePacket)
        {
            if (subscribePacket == null)
            {
                throw new ArgumentNullException(nameof(subscribePacket));
            }

            var responsePacket = subscribePacket.CreateResponse <MqttSubAckPacket>();

            foreach (var topicFilter in subscribePacket.TopicFilters)
            {
                _subscribedTopics[topicFilter.Topic] = topicFilter.QualityOfServiceLevel;
                responsePacket.SubscribeReturnCodes.Add(MqttSubscribeReturnCode.SuccessMaximumQoS1); // TODO: Add support for QoS 2.
            }

            return(responsePacket);
        }
Exemple #15
0
        public static async Task WaitForRetainedMessage(this IServiceProvider services, string topic)
        {
            var retainMessagemanager = services.GetRequiredService <IMqttClientRetainedMessageManager>();

            var subscribe = new MqttSubscribePacket()
            {
                TopicFilters = new List <TopicFilter>()
                {
                    new TopicFilter(topic, MqttQualityOfServiceLevel.AtMostOnce)
                }
            };

            while (!(await retainMessagemanager.GetSubscribedMessagesAsync(subscribe)).Any())
            {
                await Task.Delay(TimeSpan.FromMilliseconds(10));
            }
        }
        public async Task MqttSubscriptionsManager_SubscribeSingleSuccess()
        {
            var s = CreateSession();

            var sm = new MqttClientSubscriptionsManager(s, new MqttServerOptions(), new MqttServerEventDispatcher(new TestLogger()), new MqttRetainedMessagesManager());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new MqttTopicFilterBuilder().WithTopic("A/B/C").Build());

            await sm.Subscribe(sp);

            var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce, "");

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
        }
Exemple #17
0
        public void MqttSubscriptionsManager_SubscribeSingleSuccess()
        {
            var sm = new MqttClientSubscriptionsManager(new MqttServerOptions());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilter("A/B/C"));

            sm.Subscribe(sp, "");

            var pp = new MqttPublishPacket
            {
                Topic = "A/B/C",
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
            };

            Assert.IsTrue(sm.CheckSubscriptions(pp).IsSubscribed);
        }
        public void MqttSubscriptionsManager_SubscribeSingleNoSuccess()
        {
            var sm = new MqttClientSubscriptionsManager(new OptionsWrapper <MqttServerOptions>(new MqttServerOptions()));

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce));

            sm.Subscribe(sp, "");

            var pp = new MqttPublishPacket
            {
                Topic = "A/B/X",
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
            };

            Assert.IsFalse(sm.IsSubscribed(pp));
        }
Exemple #19
0
        public void MqttSubscriptionsManager_SubscribeSingleNoSuccess()
        {
            var sm = new MqttClientSubscriptionsManager(new MqttServerOptions(), "");

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilterBuilder().WithTopic("A/B/C").Build());

            sm.SubscribeAsync(sp).Wait();

            var pp = new MqttApplicationMessage
            {
                Topic = "A/B/X",
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
            };

            Assert.IsFalse(sm.CheckSubscriptionsAsync(pp).Result.IsSubscribed);
        }
        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);
        }
Exemple #21
0
        private static MqttBasePacket DeserializeSubscribe(MqttPacketBodyReader body)
        {
            ThrowIfBodyIsEmpty(body);

            var packet = new MqttSubscribePacket
            {
                PacketIdentifier = body.ReadUInt16()
            };

            while (!body.EndOfStream)
            {
                packet.TopicFilters.Add(new TopicFilter(
                                            body.ReadStringWithLengthPrefix(),
                                            (MqttQualityOfServiceLevel)body.ReadByte()));
            }

            return(packet);
        }
        public void MqttSubscriptionsManager_SubscribeAndUnsubscribeSingle()
        {
            var sm = new MqttClientSubscriptionsManager("", new MqttServerOptions(), new MqttServerEventDispatcher());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilterBuilder().WithTopic("A/B/C").Build());

            sm.Subscribe(sp);

            Assert.IsTrue(sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce).IsSubscribed);

            var up = new MqttUnsubscribePacket();

            up.TopicFilters.Add("A/B/C");
            sm.Unsubscribe(up);

            Assert.IsFalse(sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.AtMostOnce).IsSubscribed);
        }
        private Task SerializeAsync(MqttSubscribePacket packet, IMqttCommunicationChannel destination)
        {
            using (var output = new MqttPacketWriter())
            {
                output.Write(packet.PacketIdentifier);

                if (packet.TopicFilters?.Count > 0)
                {
                    foreach (var topicFilter in packet.TopicFilters)
                    {
                        output.WriteWithLengthPrefix(topicFilter.Topic);
                        output.Write((byte)topicFilter.QualityOfServiceLevel);
                    }
                }

                output.InjectFixedHeader(MqttControlPacketType.Subscribe, 0x02);
                return(output.WriteToAsync(destination));
            }
        }
        public async Task MqttSubscriptionsManager_SubscribeDifferentQoSSuccess()
        {
            var sp = new MqttSubscribePacket
            {
                TopicFilters = new List <MqttTopicFilter>
                {
                    new MqttTopicFilter {
                        Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
                    }
                }
            };

            await _subscriptionsManager.Subscribe(sp, CancellationToken.None);

            var result = CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce, "");

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
        }
Exemple #25
0
        public async Task MqttSubscriptionsManager_SubscribeDifferentQoSSuccess()
        {
            var s = CreateSession();

            var sm = new MqttClientSubscriptionsManager(s, new MqttServerEventDispatcher(new TestLogger()), new MqttServerOptions());

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new MqttTopicFilter {
                Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
            });

            await sm.SubscribeAsync(sp, new MqttConnectPacket());

            var result = sm.CheckSubscriptions("A/B/C", MqttQualityOfServiceLevel.ExactlyOnce);

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
        }
Exemple #26
0
        async Task HandleIncomingSubscribePacket(MqttSubscribePacket subscribePacket, CancellationToken cancellationToken)
        {
            var subscribeResult = await Session.SubscriptionsManager.Subscribe(subscribePacket).ConfigureAwait(false);

            var subAckPacket = _channelAdapter.PacketFormatterAdapter.DataConverter.CreateSubAckPacket(subscribePacket, subscribeResult);

            await SendPacketAsync(subAckPacket, cancellationToken).ConfigureAwait(false);

            if (subscribeResult.CloseConnection)
            {
                StopInternal();
                return;
            }

            foreach (var retainedApplicationMessage in subscribeResult.RetainedApplicationMessages)
            {
                Session.ApplicationMessagesQueue.Enqueue(retainedApplicationMessage);
            }
        }
        public void DeserializeV311_MqttSubscribePacket()
        {
            var p = new MqttSubscribePacket
            {
                PacketIdentifier = 123
            };

            p.TopicFilters.Add(new MqttTopicFilter {
                Topic = "A/B/C", QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce
            });
            p.TopicFilters.Add(new MqttTopicFilter {
                Topic = "1/2/3", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce
            });
            p.TopicFilters.Add(new MqttTopicFilter {
                Topic = "x/y/z", QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce
            });

            DeserializeAndCompare(p, "ghoAewAFQS9CL0MCAAUxLzIvMwEABXgveS96AA==");
        }
Exemple #28
0
        private static byte Serialize(MqttSubscribePacket packet, MqttPacketWriter writer)
        {
            if (!packet.TopicFilters.Any())
            {
                throw new MqttProtocolViolationException("At least one topic filter must be set [MQTT-3.8.3-3].");
            }

            writer.Write(packet.PacketIdentifier);

            if (packet.TopicFilters?.Count > 0)
            {
                foreach (var topicFilter in packet.TopicFilters)
                {
                    writer.WriteWithLengthPrefix(topicFilter.Topic);
                    writer.Write((byte)topicFilter.QualityOfServiceLevel);
                }
            }

            return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Subscribe, 0x02));
        }
Exemple #29
0
        public MqttSubAckPacket CreateSubAckPacket(MqttSubscribePacket subscribePacket, Server.MqttClientSubscribeResult subscribeResult)
        {
            if (subscribePacket == null)
            {
                throw new ArgumentNullException(nameof(subscribePacket));
            }
            if (subscribeResult == null)
            {
                throw new ArgumentNullException(nameof(subscribeResult));
            }

            var subackPacket = new MqttSubAckPacket
            {
                PacketIdentifier = subscribePacket.PacketIdentifier
            };

            subackPacket.ReturnCodes.AddRange(subscribeResult.ReturnCodes);

            return(subackPacket);
        }
Exemple #30
0
        public void MqttSubscriptionsManager_SubscribeDifferentQoSSuccess()
        {
            var sm = new MqttClientSubscriptionsManager(new MqttServerOptions(), "");

            var sp = new MqttSubscribePacket();

            sp.TopicFilters.Add(new TopicFilter("A/B/C", MqttQualityOfServiceLevel.AtMostOnce));

            sm.SubscribeAsync(sp).Wait();

            var pp = new MqttApplicationMessage
            {
                Topic = "A/B/C",
                QualityOfServiceLevel = MqttQualityOfServiceLevel.ExactlyOnce
            };

            var result = sm.CheckSubscriptionsAsync(pp).Result;

            Assert.IsTrue(result.IsSubscribed);
            Assert.AreEqual(result.QualityOfServiceLevel, MqttQualityOfServiceLevel.AtMostOnce);
        }