MqttV311PacketFormatter.cs 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using MQTTnet.Exceptions;
  2. using MQTTnet.Packets;
  3. using MQTTnet.Protocol;
  4. namespace MQTTnet.Formatter.V3
  5. {
  6. public class MqttV311PacketFormatter : MqttV310PacketFormatter
  7. {
  8. public MqttV311PacketFormatter()
  9. : base()
  10. {
  11. }
  12. public MqttV311PacketFormatter(IMqttPacketWriter packetWriter)
  13. : base(packetWriter)
  14. {
  15. }
  16. protected override byte EncodeConnectPacket(MqttConnectPacket packet, IMqttPacketWriter packetWriter)
  17. {
  18. ValidateConnectPacket(packet);
  19. packetWriter.WriteWithLengthPrefix("MQTT");
  20. packetWriter.Write(4); // 3.1.2.2 Protocol Level 4
  21. byte connectFlags = 0x0;
  22. if (packet.CleanSession)
  23. {
  24. connectFlags |= 0x2;
  25. }
  26. if (packet.WillMessage != null)
  27. {
  28. connectFlags |= 0x4;
  29. connectFlags |= (byte)((byte)packet.WillMessage.QualityOfServiceLevel << 3);
  30. if (packet.WillMessage.Retain)
  31. {
  32. connectFlags |= 0x20;
  33. }
  34. }
  35. if (packet.Password != null && packet.Username == null)
  36. {
  37. 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].");
  38. }
  39. if (packet.Password != null)
  40. {
  41. connectFlags |= 0x40;
  42. }
  43. if (packet.Username != null)
  44. {
  45. connectFlags |= 0x80;
  46. }
  47. packetWriter.Write(connectFlags);
  48. packetWriter.Write(packet.KeepAlivePeriod);
  49. packetWriter.WriteWithLengthPrefix(packet.ClientId);
  50. if (packet.WillMessage != null)
  51. {
  52. packetWriter.WriteWithLengthPrefix(packet.WillMessage.Topic);
  53. packetWriter.WriteWithLengthPrefix(packet.WillMessage.Payload);
  54. }
  55. if (packet.Username != null)
  56. {
  57. packetWriter.WriteWithLengthPrefix(packet.Username);
  58. }
  59. if (packet.Password != null)
  60. {
  61. packetWriter.WriteWithLengthPrefix(packet.Password);
  62. }
  63. return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Connect);
  64. }
  65. protected override byte EncodeConnAckPacket(MqttConnAckPacket packet, IMqttPacketWriter packetWriter)
  66. {
  67. byte connectAcknowledgeFlags = 0x0;
  68. if (packet.IsSessionPresent)
  69. {
  70. connectAcknowledgeFlags |= 0x1;
  71. }
  72. packetWriter.Write(connectAcknowledgeFlags);
  73. packetWriter.Write((byte)packet.ReturnCode);
  74. return MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck);
  75. }
  76. protected override MqttBasePacket DecodeConnAckPacket(IMqttPacketBodyReader body)
  77. {
  78. ThrowIfBodyIsEmpty(body);
  79. var packet = new MqttConnAckPacket();
  80. var acknowledgeFlags = body.ReadByte();
  81. packet.IsSessionPresent = (acknowledgeFlags & 0x1) > 0;
  82. packet.ReturnCode = (MqttConnectReturnCode)body.ReadByte();
  83. return packet;
  84. }
  85. }
  86. }