Beispiel #1
0
        private void Stop(MqttClientDisconnectType type, bool isInsideSession)
        {
            try
            {
                var cts = _cancellationTokenSource;
                if (cts == null || cts.IsCancellationRequested)
                {
                    return;
                }

                _cancellationTokenSource?.Cancel(false);

                _wasCleanDisconnect = type == MqttClientDisconnectType.Clean;

                if (_willMessage != null && !_wasCleanDisconnect)
                {
                    _sessionsManager.EnqueueApplicationMessage(this, _willMessage.ToPublishPacket());
                }

                _willMessage = null;

                if (!isInsideSession)
                {
                    _workerTask?.GetAwaiter().GetResult();
                }
            }
            finally
            {
                _logger.Info("Client '{0}': Disconnected (clean={1}).", ClientId, _wasCleanDisconnect);
                _eventDispatcher.OnClientDisconnected(ClientId, _wasCleanDisconnect);
            }
        }
Beispiel #2
0
        public Task PublishAsync(MqttMessage applicationMessage)
        {
            ThrowIfNotConnected();

            var publishPacket = applicationMessage.ToPublishPacket();

            switch (applicationMessage.QualityOfServiceLevel)
            {
            case MqttQualityOfServiceLevel.AtMostOnce:
            {
                // No packet identifier is used for QoS 0 [3.3.2.2 Packet Identifier]
                return(SendAsync(publishPacket, _cancellationTokenSource.Token));
            }

            case MqttQualityOfServiceLevel.AtLeastOnce:
            {
                publishPacket.PacketIdentifier = _packetIdentifierProvider.GetNewPacketIdentifier();
                return(SendAndReceiveAsync <MqttPubAckPacket>(publishPacket, _cancellationTokenSource.Token));
            }

            case MqttQualityOfServiceLevel.ExactlyOnce:
            {
                return(PublishExactlyOnce(publishPacket, _cancellationTokenSource.Token));
            }

            default:
            {
                throw new NotSupportedException();
            }
            }
        }
Beispiel #3
0
        public Task PublishAsync(MqttMessage applicationMessage)
        {
            if (applicationMessage == null)
            {
                throw new ArgumentNullException(nameof(applicationMessage));
            }

            if (_cancellationTokenSource == null)
            {
                throw new InvalidOperationException("The server is not started.");
            }

            _clientSessionsManager.EnqueueApplicationMessage(null, applicationMessage.ToPublishPacket());

            return(Task.FromResult(0));
        }