Exemplo n.º 1
0
        static MqttBasePacket DecodePublishPacket(ReceivedMqttPacket receivedMqttPacket)
        {
            ThrowIfBodyIsEmpty(receivedMqttPacket.Body);

            var retain = (receivedMqttPacket.FixedHeader & 0x1) > 0;
            var qualityOfServiceLevel = (MqttQualityOfServiceLevel)(receivedMqttPacket.FixedHeader >> 1 & 0x3);
            var dup = (receivedMqttPacket.FixedHeader & 0x8) > 0;

            var topic = receivedMqttPacket.Body.ReadStringWithLengthPrefix();

            ushort?packetIdentifier = null;

            if (qualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
            {
                packetIdentifier = receivedMqttPacket.Body.ReadTwoByteInteger();
            }

            var packet = new MqttPublishPacket
            {
                PacketIdentifier      = packetIdentifier,
                Retain                = retain,
                Topic                 = topic,
                QualityOfServiceLevel = qualityOfServiceLevel,
                Dup = dup
            };

            if (!receivedMqttPacket.Body.EndOfStream)
            {
                packet.Payload = receivedMqttPacket.Body.ReadRemainingData();
            }

            return(packet);
        }
Exemplo n.º 2
0
        private static MqttBasePacket DeserializePublish(ReceivedMqttPacket receivedMqttPacket)
        {
            ThrowIfBodyIsEmpty(receivedMqttPacket.Body);

            var retain = (receivedMqttPacket.FixedHeader & 0x1) > 0;
            var qualityOfServiceLevel = (MqttQualityOfServiceLevel)(receivedMqttPacket.FixedHeader >> 1 & 0x3);
            var dup = (receivedMqttPacket.FixedHeader & 0x8) > 0;

            var topic = receivedMqttPacket.Body.ReadStringWithLengthPrefix();

            ushort?packetIdentifier = null;

            if (qualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
            {
                packetIdentifier = receivedMqttPacket.Body.ReadUInt16();
            }

            var packet = new MqttPublishPacket
            {
                PacketIdentifier      = packetIdentifier,
                Retain                = retain,
                Topic                 = topic,
                Payload               = receivedMqttPacket.Body.ReadRemainingData().ToArray(),
                QualityOfServiceLevel = qualityOfServiceLevel,
                Dup = dup
            };

            return(packet);
        }
Exemplo n.º 3
0
        MqttPacket DecodePublishPacket(ReceivedMqttPacket receivedMqttPacket)
        {
            ThrowIfBodyIsEmpty(receivedMqttPacket.Body);

            _bufferReader.SetBuffer(receivedMqttPacket.Body.Array, receivedMqttPacket.Body.Offset, receivedMqttPacket.Body.Count);

            var retain = (receivedMqttPacket.FixedHeader & 0x1) > 0;
            var qualityOfServiceLevel = (MqttQualityOfServiceLevel)((receivedMqttPacket.FixedHeader >> 1) & 0x3);
            var dup = (receivedMqttPacket.FixedHeader & 0x8) > 0;

            var topic = _bufferReader.ReadString();

            ushort packetIdentifier = 0;

            if (qualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
            {
                packetIdentifier = _bufferReader.ReadTwoByteInteger();
            }

            var packet = new MqttPublishPacket
            {
                PacketIdentifier      = packetIdentifier,
                Retain                = retain,
                Topic                 = topic,
                QualityOfServiceLevel = qualityOfServiceLevel,
                Dup = dup
            };

            if (!_bufferReader.EndOfStream)
            {
                packet.Payload = _bufferReader.ReadRemainingData();
            }

            return(packet);
        }
        public MqttBasePacket Decode(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket == null)
            {
                throw new ArgumentNullException(nameof(receivedMqttPacket));
            }

            return(_decoder.Decode(receivedMqttPacket));
        }
Exemplo n.º 5
0
        public MqttBasePacket Decode(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket == null)
            {
                throw new ArgumentNullException(nameof(receivedMqttPacket));
            }

            ThrowIfFormatterNotSet();

            return(_formatter.Decode(receivedMqttPacket));
        }
Exemplo n.º 6
0
        public void DetectProtocolVersion(ReceivedMqttPacket receivedMqttPacket)
        {
            var protocolVersion = ParseProtocolVersion(receivedMqttPacket);

            // Reset the position of the stream because the protocol version is part of
            // the regular CONNECT packet. So it will not properly deserialized if this
            // data is missing.
            receivedMqttPacket.Body.Seek(0);

            UseProtocolVersion(protocolVersion);
        }
Exemplo n.º 7
0
        public MqttBasePacket Deserialize(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket == null)
            {
                throw new ArgumentNullException(nameof(receivedMqttPacket));
            }

            using (var reader = new MqttPacketReader(receivedMqttPacket))
            {
                return(Deserialize(receivedMqttPacket.Header, reader));
            }
        }
Exemplo n.º 8
0
        public MqttBasePacket Decode(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket == null)
            {
                throw new ArgumentNullException(nameof(receivedMqttPacket));
            }

            var controlPacketType = receivedMqttPacket.FixedHeader >> 4;

            if (controlPacketType < 1 || controlPacketType > 15)
            {
                throw new MqttProtocolViolationException($"The packet type is invalid ({controlPacketType}).");
            }

            switch ((MqttControlPacketType)controlPacketType)
            {
            case MqttControlPacketType.Connect: return(DecodeConnectPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.ConnAck: return(DecodeConnAckPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.Disconnect: return(DecodeDisconnectPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.Publish: return(DecodePublishPacket(receivedMqttPacket.FixedHeader, receivedMqttPacket.Body));

            case MqttControlPacketType.PubAck: return(DecodePubAckPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PubRec: return(DecodePubRecPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PubRel: return(DecodePubRelPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PubComp: return(DecodePubCompPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PingReq: return(DecodePingReqPacket());

            case MqttControlPacketType.PingResp: return(DecodePingRespPacket());

            case MqttControlPacketType.Subscribe: return(DecodeSubscribePacket(receivedMqttPacket.Body));

            case MqttControlPacketType.SubAck: return(DecodeSubAckPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.Unsubscibe: return(DecodeUnsubscribePacket(receivedMqttPacket.Body));

            case MqttControlPacketType.UnsubAck: return(DecodeUnsubAckPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.Auth: return(DecodeAuthPacket(receivedMqttPacket.Body));

            default: throw new MqttProtocolViolationException($"Packet type ({controlPacketType}) not supported.");
            }
        }
Exemplo n.º 9
0
        public void Serialize_LargePacket()
        {
            var serializer = new MqttPacketSerializer {
                ProtocolVersion = MqttProtocolVersion.V311
            };

            const int payloadLength = 80000;

            var payload = new byte[payloadLength];

            var value = 0;

            for (var i = 0; i < payloadLength; i++)
            {
                if (value > 255)
                {
                    value = 0;
                }

                payload[i] = (byte)value;
            }

            var publishPacket = new MqttPublishPacket
            {
                Topic   = "abcdefghijklmnopqrstuvwxyz0123456789",
                Payload = payload
            };

            var buffer      = serializer.Serialize(publishPacket);
            var testChannel = new TestMqttChannel(new MemoryStream(buffer.Array, buffer.Offset, buffer.Count));

            var header = MqttPacketReader.ReadFixedHeaderAsync(
                testChannel,
                new byte[2],
                new byte[1],
                CancellationToken.None).GetAwaiter().GetResult();

            var eof = buffer.Offset + buffer.Count;

            var receivedPacket = new ReceivedMqttPacket(
                header.Flags,
                new MqttPacketBodyReader(buffer.Array, eof - header.RemainingLength, buffer.Count + buffer.Offset));

            var packet = (MqttPublishPacket)serializer.Deserialize(receivedPacket);

            Assert.AreEqual(publishPacket.Topic, packet.Topic);
            Assert.IsTrue(publishPacket.Payload.SequenceEqual(packet.Payload));
        }
Exemplo n.º 10
0
        MqttProtocolVersion ParseProtocolVersion(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket.Body.Count < 7)
            {
                // 2 byte protocol name length
                // at least 4 byte protocol name
                // 1 byte protocol level
                throw new MqttProtocolViolationException("CONNECT packet must have at least 7 bytes.");
            }

            _bufferReader.SetBuffer(receivedMqttPacket.Body.Array, receivedMqttPacket.Body.Offset, receivedMqttPacket.Body.Count);

            var protocolName  = _bufferReader.ReadString();
            var protocolLevel = _bufferReader.ReadByte();

            // Remove the mosquitto try_private flag (MQTT 3.1.1 Bridge).
            // This flag is accepted but not yet used.
            protocolLevel &= 0x7F;

            if (protocolName == "MQTT")
            {
                if (protocolLevel == 5)
                {
                    return(MqttProtocolVersion.V500);
                }

                if (protocolLevel == 4)
                {
                    return(MqttProtocolVersion.V311);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            if (protocolName == "MQIsdp")
            {
                if (protocolLevel == 3)
                {
                    return(MqttProtocolVersion.V310);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            throw new MqttProtocolViolationException($"Protocol '{protocolName}' not supported.");
        }
Exemplo n.º 11
0
        static MqttProtocolVersion ParseProtocolVersion(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket == null)
            {
                throw new ArgumentNullException(nameof(receivedMqttPacket));
            }

            if (receivedMqttPacket.Body.Length < 7)
            {
                // 2 byte protocol name length
                // at least 4 byte protocol name
                // 1 byte protocol level
                throw new MqttProtocolViolationException("CONNECT packet must have at least 7 bytes.");
            }

            var protocolName  = receivedMqttPacket.Body.ReadStringWithLengthPrefix();
            var protocolLevel = receivedMqttPacket.Body.ReadByte();

            if (protocolName == "MQTT")
            {
                if (protocolLevel == 5)
                {
                    return(MqttProtocolVersion.V500);
                }

                if (protocolLevel == 4)
                {
                    return(MqttProtocolVersion.V311);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            if (protocolName == "MQIsdp")
            {
                if (protocolLevel == 3)
                {
                    return(MqttProtocolVersion.V310);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            throw new MqttProtocolViolationException($"Protocol '{protocolName}' not supported.");
        }
        private MqttProtocolVersion DeserializeAndDetectVersion(MqttPacketFormatterAdapter adapter, byte[] buffer)
        {
            using (var headerStream = new MemoryStream(buffer))
            {
                var channel     = new TestMqttChannel(headerStream);
                var fixedHeader = new byte[2];

                var header = new MqttPacketReader(channel).ReadFixedHeaderAsync(fixedHeader, CancellationToken.None).GetAwaiter().GetResult().FixedHeader;

                using (var bodyStream = new MemoryStream(buffer, (int)headerStream.Position, (int)header.RemainingLength))
                {
                    var reader = ReaderFactory(bodyStream.ToArray());
                    var packet = new ReceivedMqttPacket(header.Flags, reader, 0);
                    adapter.DetectProtocolVersion(packet);
                    return(adapter.ProtocolVersion);
                }
            }
        }
Exemplo n.º 13
0
        public void Deserialize_10000_Messages()
        {
            var channel          = new BenchmarkMqttChannel(_serializedPacket);
            var fixedHeader      = new byte[2];
            var singleByteBuffer = new byte[1];

            for (var i = 0; i < 10000; i++)
            {
                channel.Reset();

                var header = MqttPacketReader.ReadFixedHeaderAsync(channel, fixedHeader, singleByteBuffer, CancellationToken.None).GetAwaiter().GetResult();

                var receivedPacket = new ReceivedMqttPacket(
                    header.Flags,
                    new MqttPacketBodyReader(_serializedPacket.Array, _serializedPacket.Count - header.RemainingLength, _serializedPacket.Array.Length));

                _serializer.Deserialize(receivedPacket);
            }
        }
Exemplo n.º 14
0
        MqttProtocolVersion ParseProtocolVersion(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket.Body.Count < 7)
            {
                // 2 byte protocol name length
                // at least 4 byte protocol name
                // 1 byte protocol level
                throw new MqttProtocolViolationException("CONNECT packet must have at least 7 bytes.");
            }

            _bufferReader.SetBuffer(receivedMqttPacket.Body.Array, receivedMqttPacket.Body.Offset, receivedMqttPacket.Body.Count);

            var protocolName  = _bufferReader.ReadString();
            var protocolLevel = _bufferReader.ReadByte();

            if (protocolName == "MQTT")
            {
                if (protocolLevel == 5)
                {
                    return(MqttProtocolVersion.V500);
                }

                if (protocolLevel == 4)
                {
                    return(MqttProtocolVersion.V311);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            if (protocolName == "MQIsdp")
            {
                if (protocolLevel == 3)
                {
                    return(MqttProtocolVersion.V310);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            throw new MqttProtocolViolationException($"Protocol '{protocolName}' not supported.");
        }
Exemplo n.º 15
0
        private MqttProtocolVersion ParseProtocolVersion(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket == null)
            {
                throw new ArgumentNullException(nameof(receivedMqttPacket));
            }

            var protocolName  = receivedMqttPacket.Body.ReadStringWithLengthPrefix();
            var protocolLevel = receivedMqttPacket.Body.ReadByte();

            if (protocolName == "MQTT")
            {
                if (protocolLevel == 5)
                {
                    return(MqttProtocolVersion.V500);
                }

                if (protocolLevel == 4)
                {
                    return(MqttProtocolVersion.V311);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            if (protocolName == "MQIsdp")
            {
                if (protocolLevel == 3)
                {
                    return(MqttProtocolVersion.V310);
                }

                throw new MqttProtocolViolationException($"Protocol level '{protocolLevel}' not supported.");
            }

            throw new MqttProtocolViolationException($"Protocol '{protocolName}' not supported.");
        }
 public MqttPacket Decode(ReceivedMqttPacket receivedMqttPacket)
 {
     return(_decoder.Decode(receivedMqttPacket));
 }
Exemplo n.º 17
0
        public MqttPacket Decode(ReceivedMqttPacket receivedMqttPacket)
        {
            if (receivedMqttPacket.TotalLength == 0)
            {
                return(null);
            }

            var controlPacketType = receivedMqttPacket.FixedHeader >> 4;

            if (controlPacketType < 1 || controlPacketType > 14)
            {
                throw new MqttProtocolViolationException($"The packet type is invalid ({controlPacketType}).");
            }

            switch ((MqttControlPacketType)controlPacketType)
            {
            case MqttControlPacketType.Publish:
                return(DecodePublishPacket(receivedMqttPacket));

            case MqttControlPacketType.PubAck:
                return(DecodePubAckPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PubRec:
                return(DecodePubRecPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PubRel:
                return(DecodePubRelPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PubComp:
                return(DecodePubCompPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.PingReq:
                return(MqttPingReqPacket.Instance);

            case MqttControlPacketType.PingResp:
                return(MqttPingRespPacket.Instance);

            case MqttControlPacketType.Connect:
                return(DecodeConnectPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.ConnAck:
                if (_mqttProtocolVersion == MqttProtocolVersion.V311)
                {
                    return(DecodeConnAckPacketV311(receivedMqttPacket.Body));
                }
                else
                {
                    return(DecodeConnAckPacket(receivedMqttPacket.Body));
                }

            case MqttControlPacketType.Disconnect:
                return(DisconnectPacket);

            case MqttControlPacketType.Subscribe:
                return(DecodeSubscribePacket(receivedMqttPacket.Body));

            case MqttControlPacketType.SubAck:
                return(DecodeSubAckPacket(receivedMqttPacket.Body));

            case MqttControlPacketType.Unsubscibe:
                return(DecodeUnsubscribePacket(receivedMqttPacket.Body));

            case MqttControlPacketType.UnsubAck:
                return(DecodeUnsubAckPacket(receivedMqttPacket.Body));

            default:
                throw new MqttProtocolViolationException($"Packet type ({controlPacketType}) not supported.");
            }
        }
Exemplo n.º 18
0
 public MqttPacketReader(ReceivedMqttPacket receivedMqttPacket)
     : base(receivedMqttPacket.Body, Encoding.UTF8, true)
 {
     _receivedMqttPacket = receivedMqttPacket;
 }
Exemplo n.º 19
0
        public MqttPacket Decode(ReceivedMqttPacket receivedMqttPacket)
        {
            ThrowIfFormatterNotSet();

            return(_formatter.Decode(receivedMqttPacket));
        }
Exemplo n.º 20
0
        public void DetectProtocolVersion(ReceivedMqttPacket receivedMqttPacket)
        {
            var protocolVersion = ParseProtocolVersion(receivedMqttPacket);

            UseProtocolVersion(protocolVersion);
        }