Example #1
0
        private bool TryDecodePacket(IChannelHandlerContext context, IByteBuffer buffer, out Packet packet)
        {
            if (!buffer.IsReadable(2))
            {
                packet = default;
                return(false);
            }

            FixedHeader fixedHeader = default;

            fixedHeader.Decode(buffer);
            packet = fixedHeader.PacketType switch
            {
                PacketType.CONNECT => new ConnectPacket(),
                PacketType.CONNACK => new ConnAckPacket(),
                PacketType.DISCONNECT => new DisconnectPacket(),
                PacketType.PINGREQ => new PingReqPacket(),
                PacketType.PINGRESP => new PingRespPacket(),
                PacketType.PUBACK => new PubAckPacket(),
                PacketType.PUBCOMP => new PubCompPacket(),
                PacketType.PUBLISH => new PublishPacket(),
                PacketType.PUBREC => new PubRecPacket(),
                PacketType.PUBREL => new PubRelPacket(),
                PacketType.SUBSCRIBE => new SubscribePacket(),
                PacketType.SUBACK => new SubAckPacket(),
                PacketType.UNSUBSCRIBE => new UnsubscribePacket(),
                PacketType.UNSUBACK => new UnsubscribePacket(),
                _ => throw new DecoderException("Unsupported Message Type"),
            };
            packet.FixedHeader = fixedHeader;
            packet.Decode(buffer);

            return(true);
        }
Example #2
0
        internal PingResponse(FixedHeader header, byte[] payload)
            : base(header.MessageType)
        {
            // NOTE: PingResponse has no variable header and no payload

            VariableHeader = null;
        }
Example #3
0
        public void DeserializationTest_1()
        {
            var bytes  = new byte[] { 0x20, 0x02 };
            var header = FixedHeader.Deserialize(bytes);

            Assert.AreEqual(MessageType.ConnectAck, header.MessageType);
            Assert.AreEqual(2, header.RemainingLength);
        }
Example #4
0
 public PingReq(FixedHeader header)
     :  base(header)
 {
     if (header.RemainingLength != 0)
     {
         throw new ProtocolException(CommandMessage, "PingReq does not have any payload data");
     }
 }
Example #5
0
        MqttCommand ICommandReader.Read(NetworkConnection connection)
        {
            var header = FixedHeader.Load(connection);

            byte[] data = connection.ReadBytesOrFailAsync(header.RemainingLength).Await().Result;

            return(MqttCommand.Create(header, data));
        }
Example #6
0
        public void AuthenticationFailedTest()
        {
            VariableHeader vh = new ConnAckVariableHeader(true, ConnectReturnCode.AuthenticationFailed);
            FixedHeader    fh = FixedHeader.CreateStandardHeader(ControlPacketType.CONNACK, (UInt16)(vh.Encode().Count() + pn.Encode().Count()));

            Assert.IsTrue(CheckExpectedByteEncoding(fh, AuthenticationFailed.FixedHeader));
            Assert.IsTrue(CheckExpectedByteEncoding(vh, AuthenticationFailed.VariableHeader));
            Assert.IsTrue(CheckExpectedByteEncoding(pn, AuthenticationFailed.Payload));
        }
Example #7
0
        public void ServerUnavailableTest()
        {
            VariableHeader vh = new ConnAckVariableHeader(false, ConnectReturnCode.ServerUnavailable);
            FixedHeader    fh = FixedHeader.CreateStandardHeader(ControlPacketType.CONNACK, (UInt16)(vh.Encode().Count() + pn.Encode().Count()));

            Assert.IsTrue(CheckExpectedByteEncoding(fh, ServerUnavailable.FixedHeader));
            Assert.IsTrue(CheckExpectedByteEncoding(vh, ServerUnavailable.VariableHeader));
            Assert.IsTrue(CheckExpectedByteEncoding(pn, ServerUnavailable.Payload));
        }
Example #8
0
        public void Connection_accepted_response_encoded_correctly()
        {
            VariableHeader vh = new ConnAckVariableHeader(true, ConnectReturnCode.Accepted);
            FixedHeader    fh = FixedHeader.CreateStandardHeader(ControlPacketType.CONNACK, (UInt16)(vh.Encode().Count() + pn.Encode().Count()));

            Assert.IsTrue(CheckExpectedByteEncoding(fh, Accepted.FixedHeader));
            Assert.IsTrue(CheckExpectedByteEncoding(vh, Accepted.VariableHeader));
            Assert.IsTrue(CheckExpectedByteEncoding(pn, Accepted.Payload));
        }
Example #9
0
        public void Packet_encodes_correct_fixed_header_bytes()
        {
            FixedHeader fh = FixedHeader.CreateStandardHeader(ControlPacketType.CONNECT, (UInt16)(cp.VariableHeader.Encode().Count() + cp.Payload.Encode().Count()));

            byte[] expectedBytes = fh.Encode().ToArray();
            for (int i = 0; i < expectedBytes.Count(); i++)
            {
                Assert.AreEqual(expectedBytes[i], cp.FixedHeader.Encode().ToArray()[i]);
            }
        }
Example #10
0
        public static MqttCommand Create(FixedHeader header, byte[] data)
        {
            switch (header.Message)
            {
            case CommandMessage.CONNACK:
                return(new ConnAck(header, data));

            case CommandMessage.CONNECT:
                return(new Connect(header, data));

            case CommandMessage.DISCONNECT:
                return(new Disconnect(header));

            case CommandMessage.PINGREQ:
                return(new PingReq(header));

            case CommandMessage.PINGRESP:
                return(new PingResp(header));

            case CommandMessage.PUBACK:
                return(new PubAck(header, data));

            case CommandMessage.PUBCOMP:
                return(new PubComp(header, data));

            case CommandMessage.PUBLISH:
                return(new Publish(header, data));

            case CommandMessage.PUBREC:
                return(new PubRec(header, data));

            case CommandMessage.PUBREL:
                return(new PubRel(header, data));

            case CommandMessage.SUBACK:
                return(new SubAck(header, data));

            case CommandMessage.SUBSCRIBE:
                return(new Subscribe(header, data));

            case CommandMessage.UNSUBACK:
                return(new UnSubAck(header, data));

            case CommandMessage.UNSUBSCRIBE:
                return(new Unsubscribe(header, data));

            default:
                throw new InvalidOperationException("Unknown command message");
            }
        }
Example #11
0
 public Connect(FixedHeader header, byte[] data)
     : base(header)
 {
     if (data != null)
     {
         using (var stream = new MemoryStream(data))
         {
             Details = V3ConnectVariableHeader.FromStream(stream);
             LoadPayload(stream);
         }
     }
     else
     {
         Details = new V3ConnectVariableHeader(180, new ConnectFlags());
     }
 }
Example #12
0
        MqttCommand ICommandReader.Read(NetworkConnection connection)
        {
            byte[] data = null;

            FixedHeader header = FixedHeader.Load(connection);

            if (header.RemainingLength > 0)
            {
                data = connection.Stream.ReadBytesOrFailAsync(header.RemainingLength).Await().Result;
            }

            MqttCommand cmd = MqttCommand.Create(header, data);

            System.Diagnostics.Debug.WriteLine("RECV {0}", cmd);

            return(cmd);
        }
Example #13
0
        public ConnAck(FixedHeader header, byte[] data)
            : base(header)
        {
            if (data != null)
            {
                if (header.RemainingLength != data.Length)
                {
                    throw new ProtocolException(CommandMessage, "The declared and actual data lengths did not match");
                }

                if (header.RemainingLength != 2)
                {
                    throw new ProtocolException(CommandMessage, "The declared data length must be 2");
                }

                Result = (ConnectionAckResult)data[1];
            }
        }
Example #14
0
        public Unsubscribe(FixedHeader header, byte[] data)
            : base(header)
        {
            if (header.RemainingLength > 0)
            {
                using (var stream = new MemoryStream(data))
                {
                    if (Header.QualityOfService != QualityOfService.AtMostOnce)
                    {
                        MessageId = MessageId.FromStream(stream);

                        while (stream.Position < stream.Length)
                        {
                            _topics.Add(MqString.FromStream(stream));
                        }
                    }
                }
            }
        }
Example #15
0
        public Publish(FixedHeader header, byte[] data)
            : base(header)
        {
            if (header.RemainingLength > 0)
            {
                using (var stream = new MemoryStream(data))
                {
                    Topic = MQString.FromStream(stream);

                    if (Header.QualityOfService == QualityOfService.AtLeastOnce ||
                        Header.QualityOfService == QualityOfService.ExactlyOnce)
                    {
                        MessageId = MessageId.FromStream(stream);
                    }

                    Message = stream.Position < stream.Length ? stream.ReadRest() : new byte[0];
                }
            }
        }
Example #16
0
        Packet DecodePacketInternal(IByteBuffer buffer, byte packetSignature, ref int remainingLength)
        {
            Packet packet;
            var    fixedHeader = new FixedHeader(packetSignature, remainingLength);

            switch (fixedHeader.PacketType)
            {
            case PacketType.CONNECT: packet = new ConnectPacket(); break;

            case PacketType.CONNACK: packet = new ConnAckPacket(); break;

            case PacketType.DISCONNECT: packet = new DisconnectPacket(); break;

            case PacketType.PINGREQ: packet = new PingReqPacket(); break;

            case PacketType.PINGRESP: packet = new PingRespPacket(); break;

            case PacketType.PUBACK: packet = new PubAckPacket(); break;

            case PacketType.PUBCOMP: packet = new PubCompPacket(); break;

            case PacketType.PUBLISH: packet = new PublishPacket(); break;

            case PacketType.PUBREC: packet = new PubRecPacket(); break;

            case PacketType.PUBREL: packet = new PubRelPacket(); break;

            case PacketType.SUBSCRIBE: packet = new SubscribePacket(); break;

            case PacketType.SUBACK: packet = new SubAckPacket(); break;

            case PacketType.UNSUBSCRIBE: packet = new UnsubscribePacket(); break;

            case PacketType.UNSUBACK: packet = new UnsubscribePacket(); break;

            default:
                throw new DecoderException("Unsupported Message Type");
            }
            packet.FixedHeader = fixedHeader;
            packet.Decode(buffer);
            remainingLength = packet.RemaingLength;
            return(packet);
        }
Example #17
0
        public SubAck(FixedHeader header, byte[] data)
            : base(header)
        {
            if (data == null)
            {
                throw new ArgumentNullException("data");
            }

            using (var stream = new MemoryStream(data))
            {
                _grants = new List <QualityOfService>();

                MessageId = MessageId.FromStream(stream);

                while (stream.Position < stream.Length)
                {
                    byte qosByte = stream.ReadBytesOrFailAsync(1).Await().Result[0];
                    qosByte = (byte)(qosByte & 0x03); // 00000011
                    _grants.Add((QualityOfService)qosByte);
                }
            }
        }
Example #18
0
 protected MqttCommand(FixedHeader header)
 {
     MessageId = MessageId.Any;
     Header    = header;
 }
Example #19
0
 internal ConnectAck(FixedHeader header, byte[] payload)
     : base(header)
 {
     m_payload = payload;
 }
Example #20
0
 public string GetScriptToInitialFixedHeader()
 {
     return($"CreateFixedHeader($get('{Journal.ClientID}'), {FixedHeader.ToString().ToLower()}, {FixedRowsCount}, {FixedColumnsCount});");
 }