예제 #1
0
        public void ProcessReceivedMessage(MqttMessage mess)
        {
            try
            {
                // Check if the message is an acknowledgement
                if (mess is MqttLib.Core.Messages.MqttAcknowledgeMessage)
                {
                    MqttAcknowledgeMessage ackMess = (MqttAcknowledgeMessage)mess;
                    removeMessage(ackMess.AckID);
                }
                // Check if the message is a PUBREC
                else if (mess is MqttLib.Core.Messages.MqttPubrecMessage)
                {
                    MqttPubrecMessage pubrec = (MqttPubrecMessage)mess;
                    // Remove the initial publish message
                    removeMessage(pubrec.AckID);
                    // Send a pubrel message
                    _strManager.SendMessage(new MqttPubrelMessage(pubrec.AckID));
                }
                // Check if the message is a PUBCOMP
                else if (mess is MqttLib.Core.Messages.MqttPubcompMessage)
                {
                    MqttPubcompMessage pubcomp = (MqttPubcompMessage)mess;
                    // Remove the PUBREL message
                    removeMessage(pubcomp.AckID);
                }
                else if (mess is MqttLib.Core.Messages.MqttPubrelMessage)
                {
                    MqttPubrelMessage pubrel = (MqttPubrelMessage)mess;
                    _strManager.SendMessage(new MqttPubcompMessage(pubrel.AckID));
                }

                else if (mess is MqttLib.Core.Messages.MqttPublishMessage)
                {
                    if (mess.QualityOfService == QoS.AtLeastOnce)
                    {
                        // Queue an acknowlegement
                        _responses.Add(mess.MessageID, new MqttPubackMessage(mess.MessageID));
                    }
                    else if (mess.QualityOfService == QoS.OnceAndOnceOnly)
                    {
                        _responses.Add(mess.MessageID, new MqttPubrelMessage(mess.MessageID));
                    }
                }

                // Raise a MessageReceivedEvent
                OnMessageReceived(mess);
            }
            catch (Exception e)
            {
                // we may have just lost the connection
                Log.Write(LogLevel.ERROR, e.ToString());
                // important messages (>QoS0) will be resent by broker
                // we should just ignore the message with no further processing.
            }
        }
예제 #2
0
 public void ProcessSentMessage(MqttMessage mess)
 {
     // QoS > 0
     if (mess.QualityOfService > QoS.BestEfforts && !mess.Duplicate)
     {
         lock (_messages)
         {
             if (mess is MqttLib.Core.Messages.MqttAcknowledgeMessage)
             {
                 MqttAcknowledgeMessage ackMess = (MqttAcknowledgeMessage)mess;
                 _messages.Add(ackMess.AckID, mess);
             }
             else if (mess is MqttLib.Core.Messages.MqttPubrecMessage)
             {
                 MqttPubrecMessage pubrec = (MqttPubrecMessage)mess;
                 _messages.Add(pubrec.AckID, mess);
             }
             // Check if the message is a PUBCOMP
             else if (mess is MqttLib.Core.Messages.MqttPubcompMessage)
             {
                 MqttPubcompMessage pubcomp = (MqttPubcompMessage)mess;
                 _messages.Add(pubcomp.AckID, mess);
             }
             else if (mess is MqttLib.Core.Messages.MqttPubrelMessage)
             {
                 MqttPubrelMessage pubrel = (MqttPubrelMessage)mess;
                 _messages.Add(pubrel.AckID, mess);
             }
             else
             {
                 if (!_messages.Contains(mess.MessageID))
                 {
                     _messages.Add(mess.MessageID, mess);
                 }
             }
         }
     }
 }
예제 #3
0
        void qosManager_MessageReceived(object sender, MqttMessageReceivedEventArgs e)
        {
            if (e.Message == null)
            {
                //a null message means we have disconnected from the broker
                OnConnectionLost(new EventArgs());
                return;
            }

            switch (e.Message.MsgType)
            {
            case MessageType.CONNACK:
                var connack = ((MqttConnackMessage)e.Message);
                if (connack.Response == MqttConnectionResponse.Accepted)
                {
                    OnConnected(new EventArgs());
                }
                else
                {
                    OnConnectionLost(new MqttConnackEventArgs(connack.Response));
                }
                break;

            case MessageType.DISCONNECT:
                break;

            case MessageType.PINGREQ:
                manager.SendMessage(new MqttPingRespMessage());
                break;

            case MessageType.PUBACK:
                MqttPubackMessage puback = (MqttPubackMessage)e.Message;
                OnPublished(new CompleteArgs(puback.AckID));
                break;

            case MessageType.PUBCOMP:
                break;

            case MessageType.PUBLISH:
                MqttPublishMessage m = (MqttPublishMessage)e.Message;
                OnPublishArrived(m);
                break;

            case MessageType.PUBREC:
                break;

            case MessageType.PUBREL:
                MqttPubrelMessage pubrel = (MqttPubrelMessage)e.Message;
                OnPublished(new CompleteArgs(pubrel.AckID));
                break;

            case MessageType.SUBACK:
                MqttSubackMessage m1 = (MqttSubackMessage)e.Message;
                OnSubscribed(new CompleteArgs(m1.AckID));
                break;

            case MessageType.UNSUBACK:
                MqttUnsubackMessage m2 = (MqttUnsubackMessage)e.Message;
                OnUnsubscribed(new CompleteArgs(m2.AckID));
                break;

            case MessageType.PINGRESP:
                break;

            case MessageType.UNSUBSCRIBE:
            case MessageType.CONNECT:
            case MessageType.SUBSCRIBE:
            default:
                throw new Exception("Unsupported Message Type");
            }
        }