public void WriteUserProperties(List <MqttUserProperty> userProperties) { if (userProperties == null || userProperties.Count == 0) { return; } foreach (var property in userProperties) { _bufferWriter.WriteByte((byte)MqttPropertyId.UserProperty); _bufferWriter.WriteString(property.Name); _bufferWriter.WriteString(property.Value); } }
static byte EncodeSubscribePacket(MqttSubscribePacket packet, MqttBufferWriter bufferWriter) { if (!packet.TopicFilters.Any()) { throw new MqttProtocolViolationException("At least one topic filter must be set [MQTT-3.8.3-3]."); } if (packet.PacketIdentifier == 0) { throw new MqttProtocolViolationException("Subscribe packet has no packet identifier."); } bufferWriter.WriteTwoByteInteger(packet.PacketIdentifier); if (packet.TopicFilters?.Count > 0) { foreach (var topicFilter in packet.TopicFilters) { bufferWriter.WriteString(topicFilter.Topic); bufferWriter.WriteByte((byte)topicFilter.QualityOfServiceLevel); } } return(MqttBufferWriter.BuildFixedHeader(MqttControlPacketType.Subscribe, 0x02)); }
public void Write_And_Read_Multiple_Times() { var writer = new MqttBufferWriter(4096, 65535); writer.WriteString("A relative short string."); writer.WriteBinaryData(new byte[1234]); writer.WriteByte(0x01); writer.WriteByte(0x02); writer.WriteVariableByteInteger(5647382); writer.WriteString("A relative short string."); writer.WriteVariableByteInteger(8574489); writer.WriteBinaryData(new byte[48]); writer.WriteByte(2); writer.WriteByte(0x02); writer.WriteString("fjgffiogfhgfhoihgoireghreghreguhreguireoghreouighreouighreughreguiorehreuiohruiorehreuioghreug"); writer.WriteBinaryData(new byte[3]); var readPayload = new ArraySegment <byte>(writer.GetBuffer(), 0, writer.Length).ToArray(); var reader = new MqttBufferReader(); reader.SetBuffer(readPayload, 0, readPayload.Length); for (var i = 0; i < 100000; i++) { reader.Seek(0); reader.ReadString(); reader.ReadBinaryData(); reader.ReadByte(); reader.ReadByte(); reader.ReadVariableByteInteger(); reader.ReadString(); reader.ReadVariableByteInteger(); reader.ReadBinaryData(); reader.ReadByte(); reader.ReadByte(); reader.ReadString(); reader.ReadBinaryData(); } }
public void Write_100_000_Messages() { var writer = new MqttBufferWriter(4096, 65535); for (var i = 0; i < 100000; i++) { writer.WriteString("A relative short string."); writer.WriteByte(0x01); writer.WriteByte(0x02); writer.WriteVariableByteInteger(5647382); writer.WriteString("A relative short string."); writer.WriteVariableByteInteger(8574589); writer.WriteBinaryData(_demoPayload); writer.WriteByte(2); writer.WriteByte(0x02); writer.WriteString("fjgffiogfhgfhoihgoireghreghreguhreguireoghreouighreouighreughreguiorehreuiohruiorehreuioghreug"); writer.WriteBinaryData(_demoPayload); writer.Reset(0); } }
public void GlobalSetup() { TestEnvironment.EnableLogger = false; var writer = new MqttBufferWriter(4096, 65535); writer.WriteString("A relative short string."); writer.WriteBinaryData(_demoPayload); writer.WriteByte(0x01); writer.WriteByte(0x02); writer.WriteVariableByteInteger(5647382); writer.WriteString("A relative short string."); writer.WriteVariableByteInteger(8574489); writer.WriteBinaryData(_demoPayload); writer.WriteByte(2); writer.WriteByte(0x02); writer.WriteString("fjgffiogfhgfhoihgoireghreghreguhreguireoghreouighreouighreughreguiorehreuiohruiorehreuioghreug"); writer.WriteBinaryData(_demoPayload); _readPayload = new ArraySegment <byte>(writer.GetBuffer(), 0, writer.Length).ToArray(); }
public void Reset_After_Usage() { var writer = new MqttBufferWriter(4096, 65535); writer.WriteString("AString"); writer.WriteByte(0x1); writer.WriteByte(0x0); writer.WriteByte(0x1); writer.WriteVariableByteInteger(1234U); writer.WriteVariableByteInteger(9876U); writer.Reset(0); Assert.AreEqual(0, writer.Length); }
static byte EncodePublishPacket(MqttPublishPacket packet, MqttBufferWriter bufferWriter) { ValidatePublishPacket(packet); bufferWriter.WriteString(packet.Topic); if (packet.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce) { if (packet.PacketIdentifier == 0) { throw new MqttProtocolViolationException("Publish packet has no packet identifier."); } bufferWriter.WriteTwoByteInteger(packet.PacketIdentifier); } else { if (packet.PacketIdentifier > 0) { throw new MqttProtocolViolationException("Packet identifier must be empty if QoS == 0 [MQTT-2.3.1-5]."); } } // The payload is the past part of the packet. But it is not added here in order to keep // memory allocation low. byte fixedHeader = 0; if (packet.Retain) { fixedHeader |= 0x01; } fixedHeader |= (byte)((byte)packet.QualityOfServiceLevel << 1); if (packet.Dup) { fixedHeader |= 0x08; } return(MqttBufferWriter.BuildFixedHeader(MqttControlPacketType.Publish, fixedHeader)); }
static byte EncodeUnsubscribePacket(MqttUnsubscribePacket packet, MqttBufferWriter bufferWriter) { if (!packet.TopicFilters.Any()) { throw new MqttProtocolViolationException("At least one topic filter must be set [MQTT-3.10.3-2]."); } if (packet.PacketIdentifier == 0) { throw new MqttProtocolViolationException("Unsubscribe packet has no packet identifier."); } bufferWriter.WriteTwoByteInteger(packet.PacketIdentifier); if (packet.TopicFilters?.Any() == true) { foreach (var topicFilter in packet.TopicFilters) { bufferWriter.WriteString(topicFilter); } } return(MqttBufferWriter.BuildFixedHeader(MqttControlPacketType.Unsubscibe, 0x02)); }
public void Use_All_Data_Types() { var writer = new MqttBufferWriter(4096, 65535); writer.WriteString("AString"); writer.WriteByte(0x1); writer.WriteByte(0x0); writer.WriteByte(0x1); writer.WriteVariableByteInteger(1234U); writer.WriteVariableByteInteger(9876U); var buffer = writer.GetBuffer(); var reader = new MqttBufferReader(); reader.SetBuffer(buffer, 0, writer.Length); Assert.AreEqual("AString", reader.ReadString()); Assert.IsTrue(reader.ReadByte() == 1); Assert.IsTrue(reader.ReadByte() == 0); Assert.IsTrue(reader.ReadByte() == 1); Assert.AreEqual(1234U, reader.ReadVariableByteInteger()); Assert.AreEqual(9876U, reader.ReadVariableByteInteger()); }
byte EncodeConnectPacketV311(MqttConnectPacket packet, MqttBufferWriter bufferWriter) { ValidateConnectPacket(packet); bufferWriter.WriteString("MQTT"); bufferWriter.WriteByte(4); // 3.1.2.2 Protocol Level 4 byte connectFlags = 0x0; if (packet.CleanSession) { connectFlags |= 0x2; } if (packet.WillFlag) { connectFlags |= 0x4; connectFlags |= (byte)((byte)packet.WillQoS << 3); if (packet.WillRetain) { 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; } bufferWriter.WriteByte(connectFlags); bufferWriter.WriteTwoByteInteger(packet.KeepAlivePeriod); bufferWriter.WriteString(packet.ClientId); if (packet.WillFlag) { bufferWriter.WriteString(packet.WillTopic); bufferWriter.WriteBinaryData(packet.WillMessage); } if (packet.Username != null) { bufferWriter.WriteString(packet.Username); } if (packet.Password != null) { bufferWriter.WriteBinaryData(packet.Password); } return(MqttBufferWriter.BuildFixedHeader(MqttControlPacketType.Connect)); }
byte EncodeConnectPacket(MqttConnectPacket packet) { if (string.IsNullOrEmpty(packet.ClientId) && !packet.CleanSession) { throw new MqttProtocolViolationException("CleanSession must be set if ClientId is empty [MQTT-3.1.3-7]."); } _bufferWriter.WriteString("MQTT"); _bufferWriter.WriteByte(5); // [3.1.2.2 Protocol Version] byte connectFlags = 0x0; if (packet.CleanSession) { connectFlags |= 0x2; } if (packet.WillFlag) { connectFlags |= 0x4; connectFlags |= (byte)((byte)packet.WillQoS << 3); if (packet.WillRetain) { 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; } _bufferWriter.WriteByte(connectFlags); _bufferWriter.WriteTwoByteInteger(packet.KeepAlivePeriod); _propertiesWriter.WriteSessionExpiryInterval(packet.SessionExpiryInterval); _propertiesWriter.WriteAuthenticationMethod(packet.AuthenticationMethod); _propertiesWriter.WriteAuthenticationData(packet.AuthenticationData); _propertiesWriter.WriteRequestProblemInformation(packet.RequestProblemInformation); _propertiesWriter.WriteRequestResponseInformation(packet.RequestResponseInformation); _propertiesWriter.WriteReceiveMaximum(packet.ReceiveMaximum); _propertiesWriter.WriteTopicAliasMaximum(packet.TopicAliasMaximum); _propertiesWriter.WriteMaximumPacketSize(packet.MaximumPacketSize); _propertiesWriter.WriteUserProperties(packet.UserProperties); _propertiesWriter.WriteTo(_bufferWriter); _propertiesWriter.Reset(); _bufferWriter.WriteString(packet.ClientId); if (packet.WillFlag) { _propertiesWriter.WritePayloadFormatIndicator(packet.WillPayloadFormatIndicator); _propertiesWriter.WriteMessageExpiryInterval(packet.WillMessageExpiryInterval); _propertiesWriter.WriteResponseTopic(packet.WillResponseTopic); _propertiesWriter.WriteCorrelationData(packet.WillCorrelationData); _propertiesWriter.WriteContentType(packet.WillContentType); _propertiesWriter.WriteUserProperties(packet.WillUserProperties); _propertiesWriter.WriteWillDelayInterval(packet.WillDelayInterval); _propertiesWriter.WriteTo(_bufferWriter); _propertiesWriter.Reset(); _bufferWriter.WriteString(packet.WillTopic); _bufferWriter.WriteBinaryData(packet.WillMessage); } if (packet.Username != null) { _bufferWriter.WriteString(packet.Username); } if (packet.Password != null) { _bufferWriter.WriteBinaryData(packet.Password); } return(MqttBufferWriter.BuildFixedHeader(MqttControlPacketType.Connect)); }