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); } }
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(); } } }
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)); }