示例#1
0
        private Task HandleIncomingPubRelPacketAsync(IMqttChannelAdapter adapter, MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
        {
            var response = new MqttPubCompPacket {
                PacketIdentifier = pubRelPacket.PacketIdentifier
            };

            return(adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new[] { response }));
        }
示例#2
0
 Task ProcessReceivedPubRelPacket(MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
 {
     return(SendAsync(new MqttPubCompPacket
     {
         PacketIdentifier = pubRelPacket.PacketIdentifier,
         ReasonCode = MqttPubCompReasonCode.Success
     }, cancellationToken));
 }
示例#3
0
        private Task ProcessReceivedPubRelPacket(MqttPubRelPacket pubRelPacket)
        {
            var response = new MqttPubCompPacket
            {
                PacketIdentifier = pubRelPacket.PacketIdentifier
            };

            return(SendAsync(response));
        }
示例#4
0
        private async Task ProcessReceivedPubRelPacket(MqttPubRelPacket pubRelPacket)
        {
            lock (_unacknowledgedPublishPackets)
            {
                _unacknowledgedPublishPackets.Remove(pubRelPacket.PacketIdentifier);
            }

            await SendAsync(pubRelPacket.CreateResponse <MqttPubCompPacket>());
        }
        public void DeserializeV311_MqttPubRelPacket()
        {
            var p = new MqttPubRelPacket
            {
                PacketIdentifier = 123
            };

            DeserializeAndCompare(p, "YgIAew==");
        }
示例#6
0
文件: MqttClient.cs 项目: pangfd/SAEA
        private Task ProcessReceivedPubRelPacket(MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
        {
            var response = new MqttPubCompPacket
            {
                PacketIdentifier = pubRelPacket.PacketIdentifier
            };

            return(SendAsync(response, cancellationToken));
        }
示例#7
0
        private Task ProcessReceivedPacketAsync(IMqttChannelAdapter adapter, MqttBasePacket packet, CancellationToken cancellationToken)
        {
            if (packet is MqttPublishPacket publishPacket)
            {
                return(HandleIncomingPublishPacketAsync(adapter, publishPacket, cancellationToken));
            }

            if (packet is MqttPingReqPacket)
            {
                return(adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new[] { new MqttPingRespPacket() }));
            }

            if (packet is MqttPubRelPacket pubRelPacket)
            {
                return(HandleIncomingPubRelPacketAsync(adapter, pubRelPacket, cancellationToken));
            }

            if (packet is MqttPubRecPacket pubRecPacket)
            {
                var responsePacket = new MqttPubRelPacket
                {
                    PacketIdentifier = pubRecPacket.PacketIdentifier
                };

                return(adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, cancellationToken, new[] { responsePacket }));
            }

            if (packet is MqttPubAckPacket || packet is MqttPubCompPacket)
            {
                // Discard message.
                return(Task.FromResult(0));
            }

            if (packet is MqttSubscribePacket subscribePacket)
            {
                return(HandleIncomingSubscribePacketAsync(adapter, subscribePacket, cancellationToken));
            }

            if (packet is MqttUnsubscribePacket unsubscribePacket)
            {
                return(HandleIncomingUnsubscribePacketAsync(adapter, unsubscribePacket, cancellationToken));
            }

            if (packet is MqttDisconnectPacket)
            {
                return(StopAsync(true));
            }

            if (packet is MqttConnectPacket)
            {
                return(StopAsync());
            }

            _logger.Warning <MqttClientSession>("Client '{0}': Received not supported packet ({1}). Closing connection.", ClientId, packet);
            return(StopAsync());
        }
示例#8
0
        public async Task PublishAsync(IEnumerable <MqttApplicationMessage> applicationMessages)
        {
            ThrowIfNotConnected();

            var publishPackets = applicationMessages.Select(m => m.ToPublishPacket());
            var packetGroups   = publishPackets.GroupBy(p => p.QualityOfServiceLevel).OrderBy(g => g.Key);

            foreach (var qosGroup in packetGroups)
            {
                switch (qosGroup.Key)
                {
                case MqttQualityOfServiceLevel.AtMostOnce:
                {
                    // No packet identifier is used for QoS 0 [3.3.2.2 Packet Identifier]
                    await SendAsync(qosGroup.Cast <MqttBasePacket>().ToArray()).ConfigureAwait(false);

                    break;
                }

                case MqttQualityOfServiceLevel.AtLeastOnce:
                {
                    foreach (var publishPacket in qosGroup)
                    {
                        publishPacket.PacketIdentifier = _packetIdentifierProvider.GetNewPacketIdentifier();
                        await SendAndReceiveAsync <MqttPubAckPacket>(publishPacket).ConfigureAwait(false);
                    }

                    break;
                }

                case MqttQualityOfServiceLevel.ExactlyOnce:
                {
                    foreach (var publishPacket in qosGroup)
                    {
                        publishPacket.PacketIdentifier = _packetIdentifierProvider.GetNewPacketIdentifier();

                        var pubRecPacket = await SendAndReceiveAsync <MqttPubRecPacket>(publishPacket).ConfigureAwait(false);

                        var pubRelPacket = new MqttPubRelPacket
                        {
                            PacketIdentifier = pubRecPacket.PacketIdentifier
                        };

                        await SendAndReceiveAsync <MqttPubCompPacket>(pubRelPacket).ConfigureAwait(false);
                    }

                    break;
                }

                default:
                {
                    throw new InvalidOperationException();
                }
                }
            }
        }
示例#9
0
        Task HandleIncomingPubRelPacketAsync(MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
        {
            var pubCompPacket = new MqttPubCompPacket
            {
                PacketIdentifier = pubRelPacket.PacketIdentifier,
                ReasonCode       = MqttPubCompReasonCode.Success
            };

            return(SendAsync(pubCompPacket, cancellationToken));
        }
        private async Task SerializeAsync(MqttPubRelPacket packet, IMqttCommunicationChannel destination)
        {
            using (var output = new MqttPacketWriter())
            {
                output.Write(packet.PacketIdentifier);

                output.InjectFixedHeader(MqttControlPacketType.PubRel, 0x02);
                await output.WriteToAsync(destination);
            }
        }
示例#11
0
        static byte EncodePubRelPacket(MqttPubRelPacket packet, MqttBufferWriter bufferWriter)
        {
            if (packet.PacketIdentifier == 0)
            {
                throw new MqttProtocolViolationException("PubRel packet has no packet identifier.");
            }

            bufferWriter.WriteTwoByteInteger(packet.PacketIdentifier);

            return(MqttBufferWriter.BuildFixedHeader(MqttControlPacketType.PubRel, 0x02));
        }
示例#12
0
        private Task HandleIncomingPubRelPacketAsync(MqttPubRelPacket pubRelPacket)
        {
            lock (_unacknowledgedPublishPackets)
            {
                _unacknowledgedPublishPackets.Remove(pubRelPacket.PacketIdentifier);
            }

            return(Adapter.SendPacketsAsync(_options.DefaultCommunicationTimeout, _cancellationTokenSource.Token, new MqttPubCompPacket {
                PacketIdentifier = pubRelPacket.PacketIdentifier
            }));
        }
示例#13
0
        static byte EncodePubRelPacket(MqttPubRelPacket packet, IMqttPacketWriter packetWriter)
        {
            if (!packet.PacketIdentifier.HasValue)
            {
                throw new MqttProtocolViolationException("PubRel packet has no packet identifier.");
            }

            packetWriter.Write(packet.PacketIdentifier.Value);

            return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.PubRel, 0x02));
        }
示例#14
0
        private Task HandleIncomingPubRelPacketAsync(MqttPubRelPacket pubRelPacket)
        {
            lock (_unacknowledgedPublishPackets)
            {
                _unacknowledgedPublishPackets.Remove(pubRelPacket.PacketIdentifier);
            }

            return(_adapter.SendPacketAsync(new MqttPubCompPacket {
                PacketIdentifier = pubRelPacket.PacketIdentifier
            }, _options.DefaultCommunicationTimeout));
        }
示例#15
0
        public MqttPubCompPacket CreatePubCompPacket(MqttPubRelPacket pubRelPacket, MqttApplicationMessageReceivedReasonCode reasonCode)
        {
            if (pubRelPacket == null)
            {
                throw new ArgumentNullException(nameof(pubRelPacket));
            }

            return(new MqttPubCompPacket
            {
                PacketIdentifier = pubRelPacket.PacketIdentifier
            });
        }
示例#16
0
文件: MqttClient.cs 项目: pangfd/SAEA
        private async Task PublishExactlyOnce(MqttPublishPacket publishPacket, CancellationToken cancellationToken)
        {
            publishPacket.PacketIdentifier = _packetIdentifierProvider.GetNewPacketIdentifier();

            var pubRecPacket = await SendAndReceiveAsync <MqttPubRecPacket>(publishPacket, cancellationToken).ConfigureAwait(false);

            var pubRelPacket = new MqttPubRelPacket
            {
                PacketIdentifier = pubRecPacket.PacketIdentifier
            };

            await SendAndReceiveAsync <MqttPubCompPacket>(pubRelPacket, cancellationToken).ConfigureAwait(false);
        }
示例#17
0
        private async Task ProcessReceivedPubRelPacket(MqttPubRelPacket pubRelPacket)
        {
            MqttPublishPacket originalPublishPacket;

            if (!_pendingExactlyOncePublishPackets.TryRemove(pubRelPacket.PacketIdentifier, out originalPublishPacket))
            {
                throw new MqttCommunicationException();
            }

            await SendAsync(originalPublishPacket.CreateResponse <MqttPubCompPacket>());

            FireApplicationMessageReceivedEvent(originalPublishPacket);
        }
示例#18
0
        private async Task HandleIncomingPubRelPacketAsync(MqttPubRelPacket pubRelPacket)
        {
            MqttPublishPacket publishPacket;

            if (!_pendingIncomingPublications.TryRemove(pubRelPacket.PacketIdentifier, out publishPacket))
            {
                return;
            }

            await _adapter.SendPacketAsync(new MqttPubCompPacket { PacketIdentifier = publishPacket.PacketIdentifier }, _options.DefaultCommunicationTimeout);

            _publishPacketReceivedCallback(this, publishPacket);
        }
示例#19
0
        async Task <MqttClientPublishResult> PublishExactlyOnceAsync(MqttPublishPacket publishPacket, CancellationToken cancellationToken)
        {
            publishPacket.PacketIdentifier = _packetIdentifierProvider.GetNextPacketIdentifier();

            var pubRecPacket = await SendAndReceiveAsync <MqttPubRecPacket>(publishPacket, cancellationToken).ConfigureAwait(false);

            var pubRelPacket = new MqttPubRelPacket
            {
                PacketIdentifier = publishPacket.PacketIdentifier,
                ReasonCode       = MqttPubRelReasonCode.Success
            };

            var pubCompPacket = await SendAndReceiveAsync <MqttPubCompPacket>(pubRelPacket, cancellationToken).ConfigureAwait(false);

            return(_adapter.PacketFormatterAdapter.DataConverter.CreatePublishResult(pubRecPacket, pubCompPacket));
        }
示例#20
0
        private static MqttBasePacket DecodePubRelPacket(IMqttPacketBodyReader body)
        {
            ThrowIfBodyIsEmpty(body);

            var packet = new MqttPubRelPacket
            {
                PacketIdentifier = body.ReadTwoByteInteger()
            };

            if (body.EndOfStream)
            {
                packet.ReasonCode = MqttPubRelReasonCode.Success;
                return(packet);
            }

            packet.ReasonCode = (MqttPubRelReasonCode)body.ReadByte();

            var propertiesReader = new MqttV500PropertiesReader(body);

            while (propertiesReader.MoveNext())
            {
                if (packet.Properties == null)
                {
                    packet.Properties = new MqttPubRelPacketProperties();
                }

                if (propertiesReader.CurrentPropertyId == MqttPropertyId.ReasonString)
                {
                    packet.Properties.ReasonString = propertiesReader.ReadReasonString();
                }
                else if (propertiesReader.CurrentPropertyId == MqttPropertyId.UserProperty)
                {
                    if (packet.Properties.UserProperties == null)
                    {
                        packet.Properties.UserProperties = new List <MqttUserProperty>();
                    }

                    propertiesReader.AddUserPropertyTo(packet.Properties.UserProperties);
                }
                else
                {
                    propertiesReader.ThrowInvalidPropertyIdException(typeof(MqttPubRelPacket));
                }
            }

            return(packet);
        }
示例#21
0
        byte EncodePubRelPacket(MqttPubRelPacket packet)
        {
            ThrowIfPacketIdentifierIsInvalid(packet.PacketIdentifier, packet);

            _propertiesWriter.WriteReasonString(packet.ReasonString);
            _propertiesWriter.WriteUserProperties(packet.UserProperties);

            _bufferWriter.WriteTwoByteInteger(packet.PacketIdentifier);

            if (_propertiesWriter.Length > 0 || packet.ReasonCode != MqttPubRelReasonCode.Success)
            {
                _bufferWriter.WriteByte((byte)packet.ReasonCode);
                _propertiesWriter.WriteTo(_bufferWriter);
                _propertiesWriter.Reset();
            }

            return(MqttBufferWriter.BuildFixedHeader(MqttControlPacketType.PubRel, 0x02));
        }
示例#22
0
        public void Serialize_Full_MqttPubRelPacket_V500()
        {
            var pubRelPacket = new MqttPubRelPacket
            {
                PacketIdentifier = 123,
                ReasonCode       = MqttPubRelReasonCode.PacketIdentifierNotFound,
                ReasonString     = "ReasonString",
                UserProperties   = new List <MqttUserProperty>
                {
                    new MqttUserProperty("Foo", "Bar")
                }
            };

            var deserialized = MqttPacketSerializationHelper.EncodeAndDecodePacket(pubRelPacket, MqttProtocolVersion.V500);

            Assert.AreEqual(pubRelPacket.PacketIdentifier, deserialized.PacketIdentifier);
            Assert.AreEqual(pubRelPacket.ReasonCode, deserialized.ReasonCode);
            Assert.AreEqual(pubRelPacket.ReasonString, deserialized.ReasonString);
            CollectionAssert.AreEqual(pubRelPacket.UserProperties, deserialized.UserProperties);
        }
        public void Serialize_Full_MqttPubRelPacket_V311()
        {
            var pubRelPacket = new MqttPubRelPacket
            {
                PacketIdentifier = 123,
                ReasonCode       = MqttPubRelReasonCode.PacketIdentifierNotFound,
                ReasonString     = "ReasonString",
                UserProperties   = new List <MqttUserProperty>
                {
                    new MqttUserProperty("Foo", "Bar")
                }
            };

            var deserialized = MqttPacketSerializationHelper.EncodeAndDecodePacket(pubRelPacket, MqttProtocolVersion.V311);

            Assert.AreEqual(pubRelPacket.PacketIdentifier, deserialized.PacketIdentifier);
            // ReasonCode not available in MQTTv3.
            // ReasonString not available in MQTTv3.
            // UserProperties not available in MQTTv3.
            Assert.IsNull(deserialized.UserProperties);
        }
        MqttPacket DecodePubRelPacket(ArraySegment <byte> body)
        {
            ThrowIfBodyIsEmpty(body);

            _bufferReader.SetBuffer(body.Array, body.Offset, body.Count);

            var packet = new MqttPubRelPacket
            {
                PacketIdentifier = _bufferReader.ReadTwoByteInteger()
            };

            if (_bufferReader.EndOfStream)
            {
                packet.ReasonCode = MqttPubRelReasonCode.Success;
                return(packet);
            }

            packet.ReasonCode = (MqttPubRelReasonCode)_bufferReader.ReadByte();

            var propertiesReader = new MqttV5PropertiesReader(_bufferReader);

            while (propertiesReader.MoveNext())
            {
                if (propertiesReader.CurrentPropertyId == MqttPropertyId.ReasonString)
                {
                    packet.ReasonString = propertiesReader.ReadReasonString();
                }
                else
                {
                    propertiesReader.ThrowInvalidPropertyIdException(typeof(MqttPubRelPacket));
                }
            }

            packet.UserProperties = propertiesReader.CollectedUserProperties;

            return(packet);
        }
示例#25
0
        Task HandleIncomingPubRelPacket(MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
        {
            var pubCompPacket = _channelAdapter.PacketFormatterAdapter.DataConverter.CreatePubCompPacket(pubRelPacket, MqttApplicationMessageReceivedReasonCode.Success);

            return(SendPacketAsync(pubCompPacket, cancellationToken));
        }
示例#26
0
        void HandleIncomingPubRelPacket(MqttPubRelPacket pubRelPacket)
        {
            var pubCompPacket = _packetFactories.PubComp.Create(pubRelPacket, MqttApplicationMessageReceivedReasonCode.Success);

            Session.EnqueueControlPacket(new MqttPacketBusItem(pubCompPacket));
        }
示例#27
0
 private Task ProcessReceivedPubRelPacket(MqttPubRelPacket pubRelPacket)
 {
     return(SendAsync(pubRelPacket.CreateResponse <MqttPubCompPacket>()));
 }
示例#28
0
        private static byte Serialize(MqttPubRelPacket packet, MqttPacketWriter writer)
        {
            writer.Write(packet.PacketIdentifier);

            return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.PubRel, 0x02));
        }
        private void ProcessReceivedPacket(IMqttChannelAdapter adapter, MqttBasePacket packet, CancellationToken cancellationToken)
        {
            if (packet is MqttPublishPacket publishPacket)
            {
                HandleIncomingPublishPacket(adapter, publishPacket, cancellationToken);
                return;
            }

            if (packet is MqttPingReqPacket)
            {
                adapter.SendPacketAsync(new MqttPingRespPacket(), cancellationToken).GetAwaiter().GetResult();
                return;
            }

            if (packet is MqttPubRelPacket pubRelPacket)
            {
                var responsePacket = new MqttPubCompPacket
                {
                    PacketIdentifier = pubRelPacket.PacketIdentifier
                };

                adapter.SendPacketAsync(responsePacket, cancellationToken).GetAwaiter().GetResult();
                return;
            }

            if (packet is MqttPubRecPacket pubRecPacket)
            {
                var responsePacket = new MqttPubRelPacket
                {
                    PacketIdentifier = pubRecPacket.PacketIdentifier
                };

                adapter.SendPacketAsync(responsePacket, cancellationToken).GetAwaiter().GetResult();
                return;
            }

            if (packet is MqttPubAckPacket || packet is MqttPubCompPacket)
            {
                return;
            }

            if (packet is MqttSubscribePacket subscribePacket)
            {
                HandleIncomingSubscribePacket(adapter, subscribePacket, cancellationToken);
                return;
            }

            if (packet is MqttUnsubscribePacket unsubscribePacket)
            {
                HandleIncomingUnsubscribePacket(adapter, unsubscribePacket, cancellationToken);
                return;
            }

            if (packet is MqttDisconnectPacket)
            {
                Stop(MqttClientDisconnectType.Clean, true);
                return;
            }

            if (packet is MqttConnectPacket)
            {
                Stop(MqttClientDisconnectType.NotClean, true);
                return;
            }

            _logger.Warning(null, "Client '{0}': Received not supported packet ({1}). Closing connection.", ClientId, packet);
            Stop(MqttClientDisconnectType.NotClean, true);
        }
示例#30
0
        Task ProcessReceivedPubRelPacket(MqttPubRelPacket pubRelPacket, CancellationToken cancellationToken)
        {
            var pubCompPacket = _adapter.PacketFormatterAdapter.DataConverter.CreatePubCompPacket(pubRelPacket, MqttApplicationMessageReceivedReasonCode.Success);

            return(SendAsync(pubCompPacket, cancellationToken));
        }