private static byte Serialize(MqttSubscribePacket packet, MqttPacketWriter packetWriter) { if (!packet.TopicFilters.Any()) { throw new MqttProtocolViolationException("At least one topic filter must be set [MQTT-3.8.3-3]."); } if (!packet.PacketIdentifier.HasValue) { throw new MqttProtocolViolationException("Subscribe packet has no packet identifier."); } packetWriter.Write(packet.PacketIdentifier.Value); if (packet.TopicFilters?.Count > 0) { foreach (var topicFilter in packet.TopicFilters) { packetWriter.WriteWithLengthPrefix(topicFilter.Topic); packetWriter.Write((byte)topicFilter.QualityOfServiceLevel); } } return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Subscribe, 0x02)); }
private byte Serialize(MqttConnAckPacket packet, MqttPacketWriter packetWriter) { if (ProtocolVersion == MqttProtocolVersion.V310) { packetWriter.Write(0); } else if (ProtocolVersion == MqttProtocolVersion.V311) { byte connectAcknowledgeFlags = 0x0; if (packet.IsSessionPresent) { connectAcknowledgeFlags |= 0x1; } packetWriter.Write(connectAcknowledgeFlags); } else { throw new MqttProtocolViolationException("Protocol version not supported."); } packetWriter.Write((byte)packet.ConnectReturnCode); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck)); }
private byte Serialize(MqttConnectPacket packet, MqttPacketWriter writer) { ValidateConnectPacket(packet); // Write variable header writer.Write(0x00, 0x04); // 3.1.2.1 Protocol Name if (ProtocolVersion == MqttProtocolVersion.V311) { writer.Write(ProtocolVersionV311Name); writer.Write(0x04); // 3.1.2.2 Protocol Level (4) } else { writer.Write(ProtocolVersionV310Name); writer.Write(0x64, 0x70, 0x03); // Protocol Level (0x03) } var connectFlags = new ByteWriter(); // 3.1.2.3 Connect Flags connectFlags.Write(false); // Reserved connectFlags.Write(packet.CleanSession); connectFlags.Write(packet.WillMessage != null); if (packet.WillMessage != null) { connectFlags.Write((int)packet.WillMessage.QualityOfServiceLevel, 2); connectFlags.Write(packet.WillMessage.Retain); } else { connectFlags.Write(0, 2); connectFlags.Write(false); } connectFlags.Write(packet.Password != null); connectFlags.Write(packet.Username != null); writer.Write(connectFlags); writer.Write(packet.KeepAlivePeriod); writer.WriteWithLengthPrefix(packet.ClientId); if (packet.WillMessage != null) { writer.WriteWithLengthPrefix(packet.WillMessage.Topic); writer.WriteWithLengthPrefix(packet.WillMessage.Payload); } if (packet.Username != null) { writer.WriteWithLengthPrefix(packet.Username); } if (packet.Password != null) { writer.WriteWithLengthPrefix(packet.Password); } return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Connect)); }
private static byte Serialize(MqttUnsubAckPacket packet, MqttPacketWriter packetWriter) { if (!packet.PacketIdentifier.HasValue) { throw new MqttProtocolViolationException("UnsubAck packet has no packet identifier."); } packetWriter.Write(packet.PacketIdentifier.Value); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.UnsubAck)); }
private static byte Serialize(MqttPubRelPacket packet, MqttPacketWriter writer) { if (!packet.PacketIdentifier.HasValue) { throw new MqttProtocolViolationException("PubRel packet has no packet identifier."); } writer.Write(packet.PacketIdentifier.Value); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.PubRel, 0x02)); }
private static byte Serialize(MqttSubAckPacket packet, MqttPacketWriter writer) { writer.Write(packet.PacketIdentifier); if (packet.SubscribeReturnCodes?.Any() == true) { foreach (var packetSubscribeReturnCode in packet.SubscribeReturnCodes) { writer.Write((byte)packetSubscribeReturnCode); } } return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.SubAck)); }
private byte Serialize(MqttConnAckPacket packet, MqttPacketWriter writer) { var connectAcknowledgeFlags = new ByteWriter(); if (ProtocolVersion == MqttProtocolVersion.V311) { connectAcknowledgeFlags.Write(packet.IsSessionPresent); } writer.Write(connectAcknowledgeFlags); writer.Write((byte)packet.ConnectReturnCode); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck)); }
private static byte Serialize(MqttPublishPacket packet, MqttPacketWriter packetWriter) { ValidatePublishPacket(packet); packetWriter.WriteWithLengthPrefix(packet.Topic); if (packet.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce) { if (!packet.PacketIdentifier.HasValue) { throw new MqttProtocolViolationException("Publish packet has no packet identifier."); } packetWriter.Write(packet.PacketIdentifier.Value); } else { if (packet.PacketIdentifier > 0) { throw new MqttProtocolViolationException("Packet identifier must be empty if QoS == 0 [MQTT-2.3.1-5]."); } } if (packet.Payload?.Length > 0) { packetWriter.Write(packet.Payload, 0, packet.Payload.Length); } byte fixedHeader = 0; if (packet.Retain) { fixedHeader |= 0x01; } fixedHeader |= (byte)((byte)packet.QualityOfServiceLevel << 1); if (packet.Dup) { fixedHeader |= 0x08; } return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Publish, fixedHeader)); }
private static byte Serialize(MqttUnsubscribePacket packet, MqttPacketWriter writer) { if (!packet.TopicFilters.Any()) { throw new MqttProtocolViolationException("At least one topic filter must be set [MQTT-3.10.3-2]."); } writer.Write(packet.PacketIdentifier); if (packet.TopicFilters?.Any() == true) { foreach (var topicFilter in packet.TopicFilters) { writer.WriteWithLengthPrefix(topicFilter); } } return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Unsubscibe, 0x02)); }
private static byte Serialize(MqttSubAckPacket packet, MqttPacketWriter packetWriter) { if (!packet.PacketIdentifier.HasValue) { throw new MqttProtocolViolationException("SubAck packet has no packet identifier."); } packetWriter.Write(packet.PacketIdentifier.Value); if (packet.SubscribeReturnCodes?.Any() == true) { foreach (var packetSubscribeReturnCode in packet.SubscribeReturnCodes) { packetWriter.Write((byte)packetSubscribeReturnCode); } } return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.SubAck)); }
private static byte SerializeEmptyPacket(MqttControlPacketType type) { return(MqttPacketWriter.BuildFixedHeader(type)); }
private static byte Serialize(IMqttPacketWithIdentifier packet, BinaryWriter writer) { writer.Write(packet.PacketIdentifier); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.UnsubAck)); }
private static byte Serialize(MqttPubCompPacket packet, MqttPacketWriter writer) { writer.Write(packet.PacketIdentifier); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.PubComp)); }
private byte Serialize(MqttConnectPacket packet, MqttPacketWriter packetWriter) { ValidateConnectPacket(packet); // Write variable header if (ProtocolVersion == MqttProtocolVersion.V311) { packetWriter.WriteWithLengthPrefix("MQTT"); packetWriter.Write(4); // 3.1.2.2 Protocol Level 4 } else { packetWriter.WriteWithLengthPrefix("MQIsdp"); packetWriter.Write(3); // Protocol Level 3 } byte connectFlags = 0x0; if (packet.CleanSession) { connectFlags |= 0x2; } if (packet.WillMessage != null) { connectFlags |= 0x4; connectFlags |= (byte)((byte)packet.WillMessage.QualityOfServiceLevel << 3); if (packet.WillMessage.Retain) { connectFlags |= 0x20; } } if (packet.Password != null && packet.Username == null) { throw new MqttProtocolViolationException("If the User Name Flag is set to 0, the Password Flag MUST be set to 0 [MQTT-3.1.2-22]."); } if (packet.Password != null) { connectFlags |= 0x40; } if (packet.Username != null) { connectFlags |= 0x80; } packetWriter.Write(connectFlags); packetWriter.Write(packet.KeepAlivePeriod); packetWriter.WriteWithLengthPrefix(packet.ClientId); if (packet.WillMessage != null) { packetWriter.WriteWithLengthPrefix(packet.WillMessage.Topic); packetWriter.WriteWithLengthPrefix(packet.WillMessage.Payload); } if (packet.Username != null) { packetWriter.WriteWithLengthPrefix(packet.Username); } if (packet.Password != null) { packetWriter.WriteWithLengthPrefix(packet.Password); } return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Connect)); }