public async Task <MqttClientSubscribeResult> SubscribeAsync(MqttSubscribePacket subscribePacket, MqttConnectPacket connectPacket) { if (subscribePacket == null) { throw new ArgumentNullException(nameof(subscribePacket)); } if (connectPacket == null) { throw new ArgumentNullException(nameof(connectPacket)); } var result = new MqttClientSubscribeResult { ResponsePacket = new MqttSubAckPacket { PacketIdentifier = subscribePacket.PacketIdentifier }, CloseConnection = false }; foreach (var originalTopicFilter in subscribePacket.TopicFilters) { var interceptorContext = await InterceptSubscribeAsync(originalTopicFilter).ConfigureAwait(false); var finalTopicFilter = interceptorContext.TopicFilter; if (finalTopicFilter == null || string.IsNullOrEmpty(finalTopicFilter.Topic) || !interceptorContext.AcceptSubscription) { result.ResponsePacket.ReturnCodes.Add(MqttSubscribeReturnCode.Failure); result.ResponsePacket.ReasonCodes.Add(MqttSubscribeReasonCode.UnspecifiedError); } else { result.ResponsePacket.ReturnCodes.Add(ConvertToSubscribeReturnCode(finalTopicFilter.QualityOfServiceLevel)); result.ResponsePacket.ReasonCodes.Add(ConvertToSubscribeReasonCode(finalTopicFilter.QualityOfServiceLevel)); } if (interceptorContext.CloseConnection) { result.CloseConnection = true; } if (interceptorContext.AcceptSubscription && !string.IsNullOrEmpty(finalTopicFilter?.Topic)) { lock (_subscriptions) { _subscriptions[finalTopicFilter.Topic] = finalTopicFilter; } await _eventDispatcher.SafeNotifyClientSubscribedTopicAsync(_clientSession.ClientId, finalTopicFilter).ConfigureAwait(false); } } return(result); }
public async Task <MqttClientSubscribeResult> SubscribeAsync(MqttSubscribePacket subscribePacket) { if (subscribePacket == null) { throw new ArgumentNullException(nameof(subscribePacket)); } var result = new MqttClientSubscribeResult { ResponsePacket = new MqttSubAckPacket { PacketIdentifier = subscribePacket.PacketIdentifier }, 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); }
public async Task <MqttClientSubscribeResult> SubscribeAsync(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 = await InterceptSubscribeAsync(topicFilter).ConfigureAwait(false); if (!interceptorContext.AcceptSubscription) { result.ResponsePacket.ReturnCodes.Add(MqttSubscribeReturnCode.Failure); result.ResponsePacket.ReasonCodes.Add(MqttSubscribeReasonCode.UnspecifiedError); } else { result.ResponsePacket.ReturnCodes.Add(ConvertToSubscribeReturnCode(topicFilter.QualityOfServiceLevel)); result.ResponsePacket.ReasonCodes.Add(ConvertToSubscribeReasonCode(topicFilter.QualityOfServiceLevel)); } if (interceptorContext.CloseConnection) { result.CloseConnection = true; } if (interceptorContext.AcceptSubscription) { lock (_subscriptions) { _subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel; } await _eventDispatcher.HandleClientSubscribedTopicAsync(_clientId, topicFilter).ConfigureAwait(false); } } return(result); }
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); }