コード例 #1
0
        private async Task <MqttBasePacket> DeserializePublishAsync(MqttPacketReader reader)
        {
            var fixedHeader           = new ByteReader(reader.FixedHeader);
            var retain                = fixedHeader.Read();
            var qualityOfServiceLevel = (MqttQualityOfServiceLevel)fixedHeader.Read(2);
            var dup = fixedHeader.Read();

            var topic = await reader.ReadRemainingDataStringWithLengthPrefixAsync();

            ushort packetIdentifier = 0;

            if (qualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce)
            {
                packetIdentifier = await reader.ReadRemainingDataUShortAsync();
            }

            var packet = new MqttPublishPacket
            {
                Retain = retain,
                QualityOfServiceLevel = qualityOfServiceLevel,
                Dup              = dup,
                Topic            = topic,
                Payload          = await reader.ReadRemainingDataAsync(),
                PacketIdentifier = packetIdentifier
            };

            return(packet);
        }
コード例 #2
0
 private static MqttBasePacket DeserializePubAck(MqttPacketReader reader)
 {
     return(new MqttPubAckPacket
     {
         PacketIdentifier = reader.ReadUInt16()
     });
 }
コード例 #3
0
        private static MqttBasePacket DeserializePublish(MqttPacketReader reader, MqttPacketHeader mqttPacketHeader)
        {
            var fixedHeader           = new ByteReader(mqttPacketHeader.FixedHeader);
            var retain                = fixedHeader.Read();
            var qualityOfServiceLevel = (MqttQualityOfServiceLevel)fixedHeader.Read(2);
            var dup = fixedHeader.Read();

            var topic = reader.ReadStringWithLengthPrefix();

            ushort packetIdentifier = 0;

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

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

            return(packet);
        }
コード例 #4
0
        private static MqttBasePacket Deserialize(MqttPacketHeader header, MqttPacketReader reader)
        {
            switch (header.ControlPacketType)
            {
            case MqttControlPacketType.Connect: return(DeserializeConnect(reader));

            case MqttControlPacketType.ConnAck: return(DeserializeConnAck(reader));

            case MqttControlPacketType.Disconnect: return(new MqttDisconnectPacket());

            case MqttControlPacketType.Publish: return(DeserializePublish(reader, header));

            case MqttControlPacketType.PubAck: return(DeserializePubAck(reader));

            case MqttControlPacketType.PubRec: return(DeserializePubRec(reader));

            case MqttControlPacketType.PubRel: return(DeserializePubRel(reader));

            case MqttControlPacketType.PubComp: return(DeserializePubComp(reader));

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

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

            case MqttControlPacketType.Subscribe: return(DeserializeSubscribe(reader));

            case MqttControlPacketType.SubAck: return(DeserializeSubAck(reader));

            case MqttControlPacketType.Unsubscibe: return(DeserializeUnsubscribe(reader));

            case MqttControlPacketType.UnsubAck: return(DeserializeUnsubAck(reader));

            default: throw new MqttProtocolViolationException($"Packet type ({(int)header.ControlPacketType}) not supported.");
            }
        }
コード例 #5
0
        private static async Task <MqttBasePacket> DeserializeConnectAsync(MqttPacketReader reader)
        {
            await reader.ReadRemainingDataAsync(2); // Skip 2 bytes

            var protocolName = await reader.ReadRemainingDataAsync(4);

            if (Encoding.UTF8.GetString(protocolName, 0, protocolName.Length) != "MQTT")
            {
                throw new MqttProtocolViolationException("Protocol name is not 'MQTT'.");
            }

            var protocolLevel = await reader.ReadRemainingDataByteAsync();

            var connectFlags = await reader.ReadRemainingDataByteAsync();

            var connectFlagsReader = new ByteReader(connectFlags);

            connectFlagsReader.Read(); // Reserved.

            var packet = new MqttConnectPacket
            {
                CleanSession = connectFlagsReader.Read()
            };

            var willFlag     = connectFlagsReader.Read();
            var willQoS      = connectFlagsReader.Read(2);
            var willRetain   = connectFlagsReader.Read();
            var passwordFlag = connectFlagsReader.Read();
            var usernameFlag = connectFlagsReader.Read();

            packet.KeepAlivePeriod = await reader.ReadRemainingDataUShortAsync();

            packet.ClientId = await reader.ReadRemainingDataStringWithLengthPrefixAsync();

            if (willFlag)
            {
                packet.WillMessage = new MqttApplicationMessage(
                    await reader.ReadRemainingDataStringWithLengthPrefixAsync(),
                    await reader.ReadRemainingDataWithLengthPrefixAsync(),
                    (MqttQualityOfServiceLevel)willQoS,
                    willRetain);
            }

            if (usernameFlag)
            {
                packet.Username = await reader.ReadRemainingDataStringWithLengthPrefixAsync();
            }

            if (passwordFlag)
            {
                packet.Password = await reader.ReadRemainingDataStringWithLengthPrefixAsync();
            }

            ValidateConnectPacket(packet);
            return(packet);
        }
コード例 #6
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));
            }
        }
コード例 #7
0
        private static MqttBasePacket DeserializeConnAck(MqttPacketReader reader)
        {
            var variableHeader1 = reader.ReadByte();
            var variableHeader2 = reader.ReadByte();

            var packet = new MqttConnAckPacket
            {
                IsSessionPresent  = new ByteReader(variableHeader1).Read(),
                ConnectReturnCode = (MqttConnectReturnCode)variableHeader2
            };

            return(packet);
        }
コード例 #8
0
        private static MqttBasePacket DeserializeUnsubscribe(MqttPacketReader reader)
        {
            var packet = new MqttUnsubscribePacket
            {
                PacketIdentifier = reader.ReadUInt16(),
            };

            while (!reader.EndOfRemainingData)
            {
                packet.TopicFilters.Add(reader.ReadStringWithLengthPrefix());
            }

            return(packet);
        }
コード例 #9
0
        private static MqttBasePacket DeserializeSubAck(MqttPacketReader reader)
        {
            var packet = new MqttSubAckPacket
            {
                PacketIdentifier = reader.ReadUInt16()
            };

            while (!reader.EndOfRemainingData)
            {
                packet.SubscribeReturnCodes.Add((MqttSubscribeReturnCode)reader.ReadByte());
            }

            return(packet);
        }
コード例 #10
0
        private async Task <MqttBasePacket> DeserializeUnsubscribeAsync(MqttPacketReader reader)
        {
            var packet = new MqttUnsubscribePacket
            {
                PacketIdentifier = await reader.ReadRemainingDataUShortAsync(),
            };

            while (!reader.EndOfRemainingData)
            {
                packet.TopicFilters.Add(await reader.ReadRemainingDataStringWithLengthPrefixAsync());
            }

            return(packet);
        }
コード例 #11
0
        private async Task <MqttBasePacket> DeserializeSubAck(MqttPacketReader reader)
        {
            var packet = new MqttSubAckPacket
            {
                PacketIdentifier = await reader.ReadRemainingDataUShortAsync()
            };

            while (!reader.EndOfRemainingData)
            {
                packet.SubscribeReturnCodes.Add((MqttSubscribeReturnCode)await reader.ReadRemainingDataByteAsync());
            }

            return(packet);
        }
コード例 #12
0
        private async Task <MqttBasePacket> DeserializeConnAck(MqttPacketReader reader)
        {
            var variableHeader1 = await reader.ReadRemainingDataByteAsync();

            var variableHeader2 = await reader.ReadRemainingDataByteAsync();

            var packet = new MqttConnAckPacket
            {
                IsSessionPresent  = new ByteReader(variableHeader1).Read(),
                ConnectReturnCode = (MqttConnectReturnCode)variableHeader2
            };

            return(packet);
        }
コード例 #13
0
        private static async Task <MqttBasePacket> DeserializeSubscribeAsync(MqttPacketReader reader)
        {
            var packet = new MqttSubscribePacket
            {
                PacketIdentifier = await reader.ReadRemainingDataUShortAsync(),
            };

            while (!reader.EndOfRemainingData)
            {
                packet.TopicFilters.Add(new TopicFilter(
                                            await reader.ReadRemainingDataStringWithLengthPrefixAsync(),
                                            (MqttQualityOfServiceLevel)await reader.ReadRemainingDataByteAsync()));
            }

            return(packet);
        }
コード例 #14
0
        private static MqttBasePacket DeserializeSubscribe(MqttPacketReader reader)
        {
            var packet = new MqttSubscribePacket
            {
                PacketIdentifier = reader.ReadUInt16()
            };

            while (!reader.EndOfRemainingData)
            {
                packet.TopicFilters.Add(new TopicFilter(
                                            reader.ReadStringWithLengthPrefix(),
                                            (MqttQualityOfServiceLevel)reader.ReadByte()));
            }

            return(packet);
        }
コード例 #15
0
        private static MqttBasePacket DeserializeConnect(MqttPacketReader reader)
        {
            reader.ReadBytes(2); // Skip 2 bytes

            MqttProtocolVersion protocolVersion;
            var protocolName = reader.ReadBytes(4);

            if (protocolName.SequenceEqual(ProtocolVersionV310Name))
            {
                reader.ReadBytes(2);
                protocolVersion = MqttProtocolVersion.V310;
            }
            else if (protocolName.SequenceEqual(ProtocolVersionV311Name))
            {
                protocolVersion = MqttProtocolVersion.V311;
            }
            else
            {
                throw new MqttProtocolViolationException("Protocol name is not supported.");
            }

            reader.ReadByte(); // Skip protocol level
            var connectFlags = reader.ReadByte();

            var connectFlagsReader = new ByteReader(connectFlags);

            connectFlagsReader.Read(); // Reserved.

            var packet = new MqttConnectPacket
            {
                ProtocolVersion = protocolVersion,
                CleanSession    = connectFlagsReader.Read()
            };

            var willFlag     = connectFlagsReader.Read();
            var willQoS      = connectFlagsReader.Read(2);
            var willRetain   = connectFlagsReader.Read();
            var passwordFlag = connectFlagsReader.Read();
            var usernameFlag = connectFlagsReader.Read();

            packet.KeepAlivePeriod = reader.ReadUInt16();
            packet.ClientId        = reader.ReadStringWithLengthPrefix();

            if (willFlag)
            {
                packet.WillMessage = new MqttApplicationMessage
                {
                    Topic   = reader.ReadStringWithLengthPrefix(),
                    Payload = reader.ReadWithLengthPrefix(),
                    QualityOfServiceLevel = (MqttQualityOfServiceLevel)willQoS,
                    Retain = willRetain
                };
            }

            if (usernameFlag)
            {
                packet.Username = reader.ReadStringWithLengthPrefix();
            }

            if (passwordFlag)
            {
                packet.Password = reader.ReadStringWithLengthPrefix();
            }

            ValidateConnectPacket(packet);
            return(packet);
        }
コード例 #16
0
        public async Task <MqttBasePacket> DeserializeAsync(IMqttCommunicationChannel source)
        {
            if (source == null)
            {
                throw new ArgumentNullException(nameof(source));
            }

            using (var mqttPacketReader = new MqttPacketReader(source))
            {
                await mqttPacketReader.ReadToEndAsync();

                switch (mqttPacketReader.ControlPacketType)
                {
                case MqttControlPacketType.Connect:
                {
                    return(await DeserializeConnectAsync(mqttPacketReader));
                }

                case MqttControlPacketType.ConnAck:
                {
                    return(await DeserializeConnAck(mqttPacketReader));
                }

                case MqttControlPacketType.Disconnect:
                {
                    return(new MqttDisconnectPacket());
                }

                case MqttControlPacketType.Publish:
                {
                    return(await DeserializePublishAsync(mqttPacketReader));
                }

                case MqttControlPacketType.PubAck:
                {
                    return(new MqttPubAckPacket
                        {
                            PacketIdentifier = await mqttPacketReader.ReadRemainingDataUShortAsync()
                        });
                }

                case MqttControlPacketType.PubRec:
                {
                    return(new MqttPubRecPacket
                        {
                            PacketIdentifier = await mqttPacketReader.ReadRemainingDataUShortAsync()
                        });
                }

                case MqttControlPacketType.PubRel:
                {
                    return(new MqttPubRelPacket
                        {
                            PacketIdentifier = await mqttPacketReader.ReadRemainingDataUShortAsync()
                        });
                }

                case MqttControlPacketType.PubComp:
                {
                    return(new MqttPubCompPacket
                        {
                            PacketIdentifier = await mqttPacketReader.ReadRemainingDataUShortAsync()
                        });
                }

                case MqttControlPacketType.PingReq:
                {
                    return(new MqttPingReqPacket());
                }

                case MqttControlPacketType.PingResp:
                {
                    return(new MqttPingRespPacket());
                }

                case MqttControlPacketType.Subscribe:
                {
                    return(await DeserializeSubscribeAsync(mqttPacketReader));
                }

                case MqttControlPacketType.SubAck:
                {
                    return(await DeserializeSubAck(mqttPacketReader));
                }

                case MqttControlPacketType.Unsubscibe:
                {
                    return(await DeserializeUnsubscribeAsync(mqttPacketReader));
                }

                case MqttControlPacketType.UnsubAck:
                {
                    return(new MqttUnsubAckPacket
                        {
                            PacketIdentifier = await mqttPacketReader.ReadRemainingDataUShortAsync()
                        });
                }

                default:
                {
                    throw new MqttProtocolViolationException($"Packet type ({(int)mqttPacketReader.ControlPacketType}) not supported.");
                }
                }
            }
        }
コード例 #17
0
        private static MqttBasePacket Deserialize(MqttPacketHeader header, MqttPacketReader reader)
        {
            switch (header.ControlPacketType)
            {
            case MqttControlPacketType.Connect:
            {
                return(DeserializeConnect(reader));
            }

            case MqttControlPacketType.ConnAck:
            {
                return(DeserializeConnAck(reader));
            }

            case MqttControlPacketType.Disconnect:
            {
                return(new MqttDisconnectPacket());
            }

            case MqttControlPacketType.Publish:
            {
                return(DeserializePublish(reader, header));
            }

            case MqttControlPacketType.PubAck:
            {
                return(new MqttPubAckPacket
                    {
                        PacketIdentifier = reader.ReadUInt16()
                    });
            }

            case MqttControlPacketType.PubRec:
            {
                return(new MqttPubRecPacket
                    {
                        PacketIdentifier = reader.ReadUInt16()
                    });
            }

            case MqttControlPacketType.PubRel:
            {
                return(new MqttPubRelPacket
                    {
                        PacketIdentifier = reader.ReadUInt16()
                    });
            }

            case MqttControlPacketType.PubComp:
            {
                return(new MqttPubCompPacket
                    {
                        PacketIdentifier = reader.ReadUInt16()
                    });
            }

            case MqttControlPacketType.PingReq:
            {
                return(new MqttPingReqPacket());
            }

            case MqttControlPacketType.PingResp:
            {
                return(new MqttPingRespPacket());
            }

            case MqttControlPacketType.Subscribe:
            {
                return(DeserializeSubscribe(reader));
            }

            case MqttControlPacketType.SubAck:
            {
                return(DeserializeSubAck(reader));
            }

            case MqttControlPacketType.Unsubscibe:
            {
                return(DeserializeUnsubscribe(reader));
            }

            case MqttControlPacketType.UnsubAck:
            {
                return(new MqttUnsubAckPacket
                    {
                        PacketIdentifier = reader.ReadUInt16()
                    });
            }

            default:
            {
                throw new MqttProtocolViolationException($"Packet type ({(int)header.ControlPacketType}) not supported.");
            }
            }
        }