static byte EncodeConnAckPacket(MqttConnAckPacket packet, IMqttPacketWriter packetWriter) { if (packet == null) { throw new ArgumentNullException(nameof(packet)); } if (packetWriter == null) { throw new ArgumentNullException(nameof(packetWriter)); } if (!packet.ReasonCode.HasValue) { ThrowReasonCodeNotSetException(); } byte connectAcknowledgeFlags = 0x0; if (packet.IsSessionPresent) { connectAcknowledgeFlags |= 0x1; } packetWriter.Write(connectAcknowledgeFlags); packetWriter.Write((byte)packet.ReasonCode.Value); var propertiesWriter = new MqttV500PropertiesWriter(); if (packet.Properties != null) { propertiesWriter.WriteSessionExpiryInterval(packet.Properties.SessionExpiryInterval); propertiesWriter.WriteAuthenticationMethod(packet.Properties.AuthenticationMethod); propertiesWriter.WriteAuthenticationData(packet.Properties.AuthenticationData); propertiesWriter.WriteRetainAvailable(packet.Properties.RetainAvailable); propertiesWriter.WriteReceiveMaximum(packet.Properties.ReceiveMaximum); propertiesWriter.WriteMaximumQoS(packet.Properties.MaximumQoS); propertiesWriter.WriteAssignedClientIdentifier(packet.Properties.AssignedClientIdentifier); propertiesWriter.WriteTopicAliasMaximum(packet.Properties.TopicAliasMaximum); propertiesWriter.WriteReasonString(packet.Properties.ReasonString); propertiesWriter.WriteMaximumPacketSize(packet.Properties.MaximumPacketSize); propertiesWriter.WriteWildcardSubscriptionAvailable(packet.Properties.WildcardSubscriptionAvailable); propertiesWriter.WriteSubscriptionIdentifiersAvailable(packet.Properties.SubscriptionIdentifiersAvailable); propertiesWriter.WriteSharedSubscriptionAvailable(packet.Properties.SharedSubscriptionAvailable); propertiesWriter.WriteServerKeepAlive(packet.Properties.ServerKeepAlive); propertiesWriter.WriteResponseInformation(packet.Properties.ResponseInformation); propertiesWriter.WriteServerReference(packet.Properties.ServerReference); propertiesWriter.WriteUserProperties(packet.Properties.UserProperties); } propertiesWriter.WriteTo(packetWriter); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.ConnAck)); }
static byte EncodeAuthPacket(MqttAuthPacket packet, IMqttPacketWriter packetWriter) { packetWriter.Write((byte)packet.ReasonCode); var propertiesWriter = new MqttV500PropertiesWriter(); if (packet.Properties != null) { propertiesWriter.WriteAuthenticationMethod(packet.Properties.AuthenticationMethod); propertiesWriter.WriteAuthenticationData(packet.Properties.AuthenticationData); propertiesWriter.WriteReasonString(packet.Properties.ReasonString); propertiesWriter.WriteUserProperties(packet.Properties.UserProperties); } propertiesWriter.WriteTo(packetWriter); return(MqttPacketWriter.BuildFixedHeader(MqttControlPacketType.Auth)); }
static byte EncodeConnectPacket(MqttConnectPacket packet, IMqttPacketWriter packetWriter) { if (packet == null) { throw new ArgumentNullException(nameof(packet)); } if (packetWriter == null) { throw new ArgumentNullException(nameof(packetWriter)); } if (string.IsNullOrEmpty(packet.ClientId) && !packet.CleanSession) { throw new MqttProtocolViolationException("CleanSession must be set if ClientId is empty [MQTT-3.1.3-7]."); } packetWriter.WriteWithLengthPrefix("MQTT"); packetWriter.Write(5); // [3.1.2.2 Protocol Version] 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); var propertiesWriter = new MqttV500PropertiesWriter(); if (packet.Properties != null) { propertiesWriter.WriteSessionExpiryInterval(packet.Properties.SessionExpiryInterval); propertiesWriter.WriteAuthenticationMethod(packet.Properties.AuthenticationMethod); propertiesWriter.WriteAuthenticationData(packet.Properties.AuthenticationData); propertiesWriter.WriteRequestProblemInformation(packet.Properties.RequestProblemInformation); propertiesWriter.WriteRequestResponseInformation(packet.Properties.RequestResponseInformation); propertiesWriter.WriteReceiveMaximum(packet.Properties.ReceiveMaximum); propertiesWriter.WriteTopicAliasMaximum(packet.Properties.TopicAliasMaximum); propertiesWriter.WriteMaximumPacketSize(packet.Properties.MaximumPacketSize); propertiesWriter.WriteUserProperties(packet.Properties.UserProperties); } propertiesWriter.WriteTo(packetWriter); packetWriter.WriteWithLengthPrefix(packet.ClientId); if (packet.WillMessage != null) { var willPropertiesWriter = new MqttV500PropertiesWriter(); willPropertiesWriter.WritePayloadFormatIndicator(packet.WillMessage.PayloadFormatIndicator); willPropertiesWriter.WriteMessageExpiryInterval(packet.WillMessage.MessageExpiryInterval); willPropertiesWriter.WriteTopicAlias(packet.WillMessage.TopicAlias); willPropertiesWriter.WriteResponseTopic(packet.WillMessage.ResponseTopic); willPropertiesWriter.WriteCorrelationData(packet.WillMessage.CorrelationData); willPropertiesWriter.WriteSubscriptionIdentifiers(packet.WillMessage.SubscriptionIdentifiers); willPropertiesWriter.WriteContentType(packet.WillMessage.ContentType); willPropertiesWriter.WriteUserProperties(packet.WillMessage.UserProperties); // This is a special case! willPropertiesWriter.WriteWillDelayInterval(packet.Properties?.WillDelayInterval); willPropertiesWriter.WriteTo(packetWriter); 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)); }