Task ProcessReceivedPubRecPacket(MqttPubRecPacket pubRecPacket, CancellationToken cancellationToken) { if (!_packetDispatcher.TryDispatch(pubRecPacket)) { // The packet is unknown. Probably due to a restart of the client. // So wen send this to the server to trigger a full resend of the message. return(SendAsync(new MqttPubRelPacket { PacketIdentifier = pubRecPacket.PacketIdentifier, ReasonCode = MqttPubRelReasonCode.PacketIdentifierNotFound }, cancellationToken)); } return(PlatformAbstractionLayer.CompletedTask); }
async Task TryProcessReceivedPacketAsync(MqttBasePacket packet, CancellationToken cancellationToken) { try { if (packet is MqttPublishPacket publishPacket) { EnqueueReceivedPublishPacket(publishPacket); } else if (packet is MqttPubRecPacket pubRecPacket) { await ProcessReceivedPubRecPacket(pubRecPacket, cancellationToken).ConfigureAwait(false); } else if (packet is MqttPubRelPacket pubRelPacket) { await ProcessReceivedPubRelPacket(pubRelPacket, cancellationToken).ConfigureAwait(false); } else if (packet is MqttDisconnectPacket disconnectPacket) { await ProcessReceivedDisconnectPacket(disconnectPacket).ConfigureAwait(false); } else if (packet is MqttAuthPacket authPacket) { await ProcessReceivedAuthPacket(authPacket).ConfigureAwait(false); } else if (packet is MqttPingRespPacket) { _packetDispatcher.TryDispatch(packet); } else if (packet is MqttPingReqPacket) { throw new MqttProtocolViolationException("The PINGREQ Packet is sent from a Client to the Server only."); } else { if (!_packetDispatcher.TryDispatch(packet)) { throw new MqttProtocolViolationException($"Received packet '{packet}' at an unexpected time."); } } } catch (Exception exception) { if (_cleanDisconnectInitiated) { return; } if (exception is OperationCanceledException) { } else if (exception is MqttCommunicationException) { _logger.Warning(exception, "Communication error while receiving packets."); } else { _logger.Error(exception, "Error while receiving packets."); } _packetDispatcher.FailAll(exception); await DisconnectInternalAsync(_packetReceiverTask, exception, null).ConfigureAwait(false); } }