private Task SerializeAsync(MqttPublishPacket packet, IMqttCommunicationChannel destination) { ValidatePublishPacket(packet); using (var output = new MqttPacketWriter()) { output.WriteWithLengthPrefix(packet.Topic); if (packet.QualityOfServiceLevel > MqttQualityOfServiceLevel.AtMostOnce) { output.Write(packet.PacketIdentifier); } 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) { output.Write(packet.Payload); } var fixedHeader = new ByteWriter(); fixedHeader.Write(packet.Retain); fixedHeader.Write((byte)packet.QualityOfServiceLevel, 2); fixedHeader.Write(packet.Dup); output.InjectFixedHeader(MqttControlPacketType.Publish, fixedHeader.Value); return(output.WriteToAsync(destination)); } }
private Task SerializeEmptyPacketAsync(MqttControlPacketType type, IMqttCommunicationChannel destination) { using (var output = new MqttPacketWriter()) { output.InjectFixedHeader(type); return(output.WriteToAsync(destination)); } }
private Task SerializeAsync(MqttUnsubAckPacket packet, IMqttCommunicationChannel destination) { using (var output = new MqttPacketWriter()) { output.Write(packet.PacketIdentifier); output.InjectFixedHeader(MqttControlPacketType.UnsubAck); return(output.WriteToAsync(destination)); } }
private async Task SerializeAsync(MqttPubRelPacket packet, IMqttCommunicationChannel destination) { using (var output = new MqttPacketWriter()) { output.Write(packet.PacketIdentifier); output.InjectFixedHeader(MqttControlPacketType.PubRel, 0x02); await output.WriteToAsync(destination); } }
private Task SerializeAsync(MqttConnectPacket packet, IMqttCommunicationChannel destination) { ValidateConnectPacket(packet); using (var output = new MqttPacketWriter()) { // Write variable header output.Write(0x00, 0x04); // 3.1.2.1 Protocol Name output.Write(MqttPrefix); output.Write(0x04); // 3.1.2.2 Protocol Level 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); output.Write(connectFlags); output.Write(packet.KeepAlivePeriod); output.WriteWithLengthPrefix(packet.ClientId); if (packet.WillMessage != null) { output.WriteWithLengthPrefix(packet.WillMessage.Topic); output.WriteWithLengthPrefix(packet.WillMessage.Payload); } if (packet.Username != null) { output.WriteWithLengthPrefix(packet.Username); } if (packet.Password != null) { output.WriteWithLengthPrefix(packet.Password); } output.InjectFixedHeader(MqttControlPacketType.Connect); return(output.WriteToAsync(destination)); } }
private Task SerializeAsync(MqttConnAckPacket packet, IMqttCommunicationChannel destination) { using (var output = new MqttPacketWriter()) { var connectAcknowledgeFlags = new ByteWriter(); connectAcknowledgeFlags.Write(packet.IsSessionPresent); output.Write(connectAcknowledgeFlags); output.Write((byte)packet.ConnectReturnCode); output.InjectFixedHeader(MqttControlPacketType.ConnAck); return(output.WriteToAsync(destination)); } }
private Task SerializeAsync(MqttUnsubscribePacket packet, IMqttCommunicationChannel destination) { using (var output = new MqttPacketWriter()) { output.Write(packet.PacketIdentifier); if (packet.TopicFilters?.Any() == true) { foreach (var topicFilter in packet.TopicFilters) { output.WriteWithLengthPrefix(topicFilter); } } output.InjectFixedHeader(MqttControlPacketType.Unsubscibe, 0x02); return(output.WriteToAsync(destination)); } }
private Task SerializeAsync(MqttSubAckPacket packet, IMqttCommunicationChannel destination) { using (var output = new MqttPacketWriter()) { output.Write(packet.PacketIdentifier); if (packet.SubscribeReturnCodes?.Any() == true) { foreach (var packetSubscribeReturnCode in packet.SubscribeReturnCodes) { output.Write((byte)packetSubscribeReturnCode); } } output.InjectFixedHeader(MqttControlPacketType.SubAck); return(output.WriteToAsync(destination)); } }
private Task SerializeAsync(MqttSubscribePacket packet, IMqttCommunicationChannel destination) { using (var output = new MqttPacketWriter()) { output.Write(packet.PacketIdentifier); if (packet.TopicFilters?.Count > 0) { foreach (var topicFilter in packet.TopicFilters) { output.WriteWithLengthPrefix(topicFilter.Topic); output.Write((byte)topicFilter.QualityOfServiceLevel); } } output.InjectFixedHeader(MqttControlPacketType.Subscribe, 0x02); return(output.WriteToAsync(destination)); } }