mirror of
https://github.com/dotnet/MQTTnet.git
synced 2026-10-15 00:15:15 +08:00
101 lines
3.1 KiB
C#
101 lines
3.1 KiB
C#
using MQTTnet.Exceptions;
|
|
using MQTTnet.Packets;
|
|
using MQTTnet.Packets.V3;
|
|
using MQTTnet.Protocol;
|
|
|
|
namespace MQTTnet.Serializer
|
|
{
|
|
public class MqttV311PacketSerializer : MqttV310PacketSerializer
|
|
{
|
|
protected override byte SerializeConnectPacket(MqttV3ConnectPacket packet, MqttPacketWriter packetWriter)
|
|
{
|
|
ValidateConnectPacket(packet);
|
|
|
|
packetWriter.WriteWithLengthPrefix("MQTT");
|
|
packetWriter.Write(4); // 3.1.2.2 Protocol Level 4
|
|
|
|
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);
|
|
}
|
|
|
|
protected override byte SerializeConnAckPacket(MqttV3ConnAckPacket packet, MqttPacketWriter packetWriter)
|
|
{
|
|
byte connectAcknowledgeFlags = 0x0;
|
|
if (packet.IsSessionPresent)
|
|
{
|
|
connectAcknowledgeFlags |= 0x1;
|
|
}
|
|
|
|
packetWriter.Write(connectAcknowledgeFlags);
|
|
packetWriter.Write((byte)packet.ConnectReturnCode);
|
|
|
|
return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck);
|
|
}
|
|
|
|
protected override MqttBasePacket DeserializeConnAckPacket(MqttPacketBodyReader body)
|
|
{
|
|
ThrowIfBodyIsEmpty(body);
|
|
|
|
var packet = new MqttV3ConnAckPacket();
|
|
|
|
var acknowledgeFlags = body.ReadByte();
|
|
|
|
packet.IsSessionPresent = (acknowledgeFlags & 0x1) > 0;
|
|
packet.ConnectReturnCode = (MqttConnectReturnCode)body.ReadByte();
|
|
|
|
return packet;
|
|
}
|
|
}
|
|
}
|