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); }
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 MqttClientSubscribeResult Subscribe(MqttSubscribePacket subscribePacket, string clientId) { if (subscribePacket == null) { throw new ArgumentNullException(nameof(subscribePacket)); } var responsePacket = subscribePacket.CreateResponse <MqttSubAckPacket>(); var closeConnection = false; lock (_subscriptions) { foreach (var topicFilter in subscribePacket.TopicFilters) { var interceptorContext = new MqttSubscriptionInterceptorContext(clientId, topicFilter); _options.SubscriptionsInterceptor?.Invoke(interceptorContext); responsePacket.SubscribeReturnCodes.Add(interceptorContext.AcceptSubscription ? MqttSubscribeReturnCode.SuccessMaximumQoS1 : MqttSubscribeReturnCode.Failure); if (interceptorContext.CloseConnection) { closeConnection = true; } if (interceptorContext.AcceptSubscription) { _subscriptions[topicFilter.Topic] = topicFilter.QualityOfServiceLevel; } } } return(new MqttClientSubscribeResult { ResponsePacket = responsePacket, CloseConnection = closeConnection }); }