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); }
private static MqttBasePacket DeserializeUnsubscribe(MqttPacketReader reader) { var packet = new MqttUnsubscribePacket { PacketIdentifier = reader.ReadUInt16(), }; while (!reader.EndOfRemainingData) { packet.TopicFilters.Add(reader.ReadStringWithLengthPrefix()); } return(packet); }
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); }
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); }