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); }
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); }
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); }
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); }
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); }
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)); }
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); }
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); }
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); }
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=="); }
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)); }
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); }
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); }