예제 #1
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);
        }
        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);
        }
예제 #3
0
        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
            });
        }