/// <summary>
 ///     Handles the MessageSent event of the connectionHandler control.
 /// </summary>
 private bool MessageSent(MqttMessage msg) {
     if (!this.disposed) {
         pingTimer.Change(keepAlivePeriod, keepAlivePeriod);
         return true;
     } else {
         return false;
     }
 }
        /// <summary>
        /// Invokes the serialization of a message to get an array of bytes that represent the message.
        /// </summary>
        /// <param name="msg">The MSG.</param>
        internal static byte[] GetMessageBytes(MqttMessage msg)
        {
            using (MemoryStream ms = new MemoryStream())
            {
                msg.WriteTo(ms);
                ms.Seek(0, SeekOrigin.Begin);
                byte[] msgBytes = new byte[ms.Length];
                ms.Read(msgBytes, 0, (int)ms.Length);

                return msgBytes;
            }
        }
Beispiel #3
0
        /// <summary>
        /// Sends a message to the broker through the current connection.
        /// </summary>
        /// <param name="message"></param>
        public void SendMessage(MqttMessage message)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                message.WriteTo(stream);
                stream.Seek(0, SeekOrigin.Begin);
                connection.Send(stream);
            }

            // let any registered people know we're doing a message.
            foreach (Func<MqttMessage, bool> callback in sentMessageCallbacks)
            {
                callback(message);
            }
        }
        /// <summary>
        ///     Processes the connect acknowledgement message.
        /// </summary>
        /// <param name="msg">The connect acknowledgement message.</param>
        private bool ConnectAckProcessor(MqttMessage msg) {
            try {
                var ackMsg = (MqttConnectAckMessage) msg;

                // drop the connection if our connect request has been rejected.
                if (ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.BrokerUnavailable ||
                    ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.IdentifierRejected ||
                    ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.UnacceptedProtocolVersion ||
                    ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.NotAuthorized ||
                    ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.BadUsernameOrPassword)
                {
                    // TODO: Decide on a way to let the client know why we have been rejected.
                    PerformConnectionDisconnect();
                } else {
                    // initialize the keepalive to start the ping based keepalive process.
                    connectionState = ConnectionState.Connected;
                }

                connectionResetEvent.Set();
            } catch (InvalidMessageException) {
                PerformConnectionDisconnect();

                // not exactly, ready, but we've reached an end state so we should signal a bad connection attempt.
                connectionResetEvent.Set();
            }

            return true;
        }
Beispiel #5
0
 /// <summary>
 /// Sends the message to the client connected to the broker.
 /// </summary>
 /// <param name="msg">The Mqtt Message.</param>
 public void SendMessage(MqttMessage msg)
 {
     msg.WriteTo(networkStream);
     networkStream.Flush();
 }
        /// <summary>
        /// Processes the connect acknowledgement message.
        /// </summary>
        /// <param name="msg">The connect acknowledgement message.</param>
        private bool ConnectAckProcessor(MqttMessage msg)
        {
            try
            {
                MqttConnectAckMessage ackMsg = (MqttConnectAckMessage)msg;

                // drop the connection if our connect request has been rejected.
                if (ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.BrokerUnavailable ||
                    ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.IdentifierRejected ||
                    ackMsg.VariableHeader.ReturnCode == MqttConnectReturnCode.UnacceptedProtocolVersion)
                {
                    // TODO: Decide on a way to let the client know why we have been rejected.
                    PerformConnectionDisconnect();
                }
                else
                {
                    // initialize the keepalive to start the ping based keepalive process.
                    connectionState = ConnectionState.Connected;
                }

                connectionResetEvent.Set();
            }
            catch (InvalidMessageException)
            {
                PerformConnectionDisconnect();

                // not exactly, ready, but we've reached an end state so we should signal a bad connection attempt.
                connectionResetEvent.Set();
            }
            finally
            {
                // connected or disconnected now, don't need to process no more.
                // TODO: Implement one time only message registrations
                //this.UnRegisterForMessage(MqttMessageType.ConnectAck, ConnectAckProcessor);
            }

            return true;
        }
 /// <summary>
 /// Processed ping response messages received from a message broker.
 /// </summary>
 /// <param name="pingMsg"></param>
 /// <returns></returns>
 private bool PingResponseReceived(MqttMessage pingMsg)
 {
     return true;
 }
        /// <summary>
        /// Signal to the keepalive that a ping request has been received from the message broker.
        /// </summary>
        /// <remarks>
        /// The effect of calling this method on the keepalive handler is the transmission of a ping response
        /// message to the message broker on the current connection.
        /// </remarks>
        private bool PingRequestReceived(MqttMessage pingMsg)
        {
            Monitor.Enter(shutdownPadlock);
            try
            {
                if (!disposed)
                {
                    MqttPingResponseMessage pingRespMessage = new MqttPingResponseMessage();
                    connectionHandler.SendMessage(pingRespMessage);

                    pingTimer.Change(keepAlivePeriod, keepAlivePeriod);
                }
            }
            finally
            {
                Monitor.Exit(shutdownPadlock);
            }

            return true;
        }
 /// <summary>
 ///     Processed ping response messages received from a message broker.
 /// </summary>
 /// <param name="pingMsg"></param>
 /// <returns></returns>
 private bool PingResponseReceived(MqttMessage pingMsg)
 {
     return(true);
 }