/// <summary>
        /// Publish a message asynchronously
        /// </summary>
        /// <param name="topic">Message topic</param>
        /// <param name="message">Message data (payload)</param>
        /// <param name="qosLevel">QoS Level</param>
        /// <param name="retain">Retain flag</param>
        /// <returns>Message Id related to PUBLISH message</returns>
        public static ushort Publish(MqttClientConnection clientConnection, string topic, byte[] message, byte qosLevel, bool retain)
        {
            MqttMsgPublish publish = new MqttMsgPublish(topic, message, false, qosLevel, retain);

            publish.MessageId = clientConnection.GetMessageId();

            // enqueue message to publish into the inflight queue
            EnqueueInflight(clientConnection, publish, MqttMsgFlow.ToPublish);

            return(publish.MessageId);
        }