Beispiel #1
0
int  blinkIndicator(MqttsPublish* msg){
  MQString sw = MQString();
  sw.readBuf(msg->getData());
  if( sw == *on){
    indicator = 1;
  }else if( sw == *off){
    indicator = 0;
  }
  return 0;
}
Beispiel #2
0
/* ===================================================
          Procedures for  Received Messages
 =====================================================*/
void MqttsnClient::recieveMessageHandler(NWResponse* recvMsg, int* returnCode){
	uint8_t msgType = recvMsg->getType();
    if ( _clientStatus.isSearching() && (msgType != MQTTSN_TYPE_GWINFO)){
        *returnCode = MQTTSN_ERR_NO_ERROR;

/*---------  GWINFO  ----------*/
	}else if (msgType == MQTTSN_TYPE_GWINFO){
		D_MQTTW("GWINFO recv\r\n");
		MqttsnGwInfo mqMsg = MqttsnGwInfo();
		copyMsg(&mqMsg, recvMsg);
		if (getMsgRequestType() == MQTTSN_TYPE_SEARCHGW){
			if(_clientStatus.recvGWINFO(&mqMsg)){
				setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
			}else{
				setMsgRequestStatus(MQTTSN_MSG_REJECTED);
			}
			_network->setGwAddress();
		}
/*---------  REGISTER  ----------*/
	}else if (msgType == MQTTSN_TYPE_REGISTER){

		if(_clientStatus.isAvailableToSend()){
			D_MQTTW("REGISTER recv\r\n");
			MqttsnRegister mqMsg = MqttsnRegister();

			mqMsg.setFrame(recvMsg);
			uint16_t topicId = _topics.getTopicId(mqMsg.getTopicName());
			if (topicId == 0){
				if (_topics.match(mqMsg.getTopicName())){
					MQString* mqStr = mqMsg.getTopicName()->create();
					_topics.addTopic(mqStr);
					_topics.setTopicId(mqStr,mqMsg.getTopicId());
					_topics.setCallback(mqMsg.getTopicId(),_topics.match(mqStr)->getCallback());
				}
			}

			if (mqMsg.getMsgId() != 0){
				regAck(mqMsg.getTopicId(), mqMsg.getMsgId(), MQTTSN_RC_ACCEPTED);
				if(getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK){
					*returnCode = MQTTSN_READ_RESP_ONCE_MORE;
				}
			}else{
				D_MQTTW("RegAck is not required\r\n");
			}
		}else{
			D_MQTTW("REGISTER recv. Client is not Active\r\n");
		}
/*---------  PUBLISH  --------*/
    }else if (msgType == MQTTSN_TYPE_PUBLISH){

    	if(_clientStatus.isAvailableToSend()){
    		D_MQTTW("PUBLISH recv\r\n");
			MqttsnPublish mqMsg = MqttsnPublish();
			mqMsg.setFrame(recvMsg);
			_pubHdl.exec(&mqMsg,&_topics);   //  Execute Callback routine

			if (mqMsg.getQos() == MQTTSN_FLAG_QOS_1){
				pubAck(mqMsg.getTopicId(), mqMsg.getMsgId(), MQTTSN_RC_ACCEPTED);
				unicast(MQTTSN_TIME_RETRY);
			}else if(mqMsg.getQos() == MQTTSN_FLAG_QOS_2){
				pubRec(mqMsg.getMsgId());
				unicast(MQTTSN_TIME_RETRY);
			}

			if(getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK){
				*returnCode = MQTTSN_READ_RESP_ONCE_MORE;
			}
    	}else{
    		D_MQTTW("PUBLISH recv Client is not Active\r\n");
    	}

/*===========  Response  =========*/

/*---------  PUBACK  ----------*/
    }else if (msgType == MQTTSN_TYPE_PUBACK &&
    		(getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK &&
    		 getMsgRequestType() == MQTTSN_TYPE_PUBLISH)){
        MqttsnPubAck mqMsg = MqttsnPubAck();
        copyMsg(&mqMsg, recvMsg);

        D_MQTTW("\nPUBACK recv RC=");
        D_MQTTLN(mqMsg.getReturnCode(),DEC);
        D_MQTTF("%d\r\n", mqMsg.getReturnCode());

        if (mqMsg.getMsgId() == getUint16(_sendQ->getMessage(0)->getBody() + 3)){
            if (mqMsg.getReturnCode() == MQTTSN_RC_ACCEPTED){
                setMsgRequestStatus(MQTTSN_MSG_COMPLETE);

            }else if (mqMsg.getReturnCode() == MQTTSN_RC_REJECTED_CONGESTION){
                  setMsgRequestStatus(MQTTSN_MSG_RESEND_REQ);

            }else if (mqMsg.getReturnCode() == MQTTSN_RC_REJECTED_INVALID_TOPIC_ID){
                *returnCode = MQTTSN_ERR_INVALID_TOPICID;
                setMsgRequestStatus(MQTTSN_MSG_REJECTED);
            }
        }else{
        	//D_MQTTW("MsgId dosn't match.\r\n");
        }

/*---------  PINGRESP  ----------*/
    }else if (msgType == MQTTSN_TYPE_PINGRESP){
        D_MQTTW("PINGRESP recv\r\n");

        if (getMsgRequestType() == MQTTSN_TYPE_PINGREQ){
        	_clientStatus.recvPINGRESP();
            setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
        }

/*---------  ADVERTISE  ----------*/
    }else if (msgType == MQTTSN_TYPE_ADVERTISE){
        D_MQTTW("ADVERTISE recv\r\n");

        MqttsnAdvertise mqMsg = MqttsnAdvertise();
        copyMsg(&mqMsg, recvMsg);
        _clientStatus.recvADVERTISE(&mqMsg);
        if(getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK){
        	*returnCode = MQTTSN_READ_RESP_ONCE_MORE;
        }

/*---------  CONNACK  ----------*/
    }else if (msgType == MQTTSN_TYPE_CONNACK){
        if ((getMsgRequestType() == MQTTSN_TYPE_CONNECT || getMsgRequestType() == MQTTSN_TYPE_WILLMSG)){
            MqttsnConnack mqMsg = MqttsnConnack();
            copyMsg(&mqMsg, recvMsg);

            D_MQTTW("CONNACK recv RC=");
			D_MQTTLN(mqMsg.getReturnCode(),DEC);
			D_MQTTF("%d\r\n", mqMsg.getReturnCode());

            if (mqMsg.getReturnCode() == MQTTSN_RC_ACCEPTED){
                setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
                _clientStatus.recvCONNACK();

            }else if (mqMsg.getReturnCode() == MQTTSN_RC_REJECTED_CONGESTION){
            	setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
           		_clientStatus.recvDISCONNECT();
           		*returnCode = MQTTSN_ERR_REJECTED;
            }else{
               setMsgRequestStatus(MQTTSN_MSG_REJECTED);
               *returnCode = MQTTSN_ERR_REJECTED;          // Return Code
               _clientStatus.recvDISCONNECT();
            }
        }
        D_MQTTW("\r\n");

/*---------  REGACK  ----------*/
    }else if (msgType == MQTTSN_TYPE_REGACK){
         D_MQTTW("REGACK recv\r\n");

        if (getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK &&
            getMsgRequestType() == MQTTSN_TYPE_REGISTER){
            MqttsnRegAck mqMsg = MqttsnRegAck();
            copyMsg(&mqMsg, recvMsg);
            if (mqMsg.getMsgId() == getUint16(_sendQ->getMessage(0)->getBody() + 2)){
				if (getUint16((uint8_t*)_sendQ->getMessage(0)->getBody()+4)){
					if (mqMsg.getReturnCode() == MQTTSN_RC_ACCEPTED){
						setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
						MQString topic;
						topic.readBuf(_sendQ->getMessage(0)->getBody() + 4);
						_topics.setTopicId(&topic, mqMsg.getTopicId());
					}else if (mqMsg.getReturnCode() == MQTTSN_RC_REJECTED_CONGESTION){
					  setMsgRequestStatus(MQTTSN_MSG_RESEND_REQ);
					}else{
						*returnCode = MQTTSN_ERR_REJECTED;
					}
				}
            }
        }

/*---------  SUBACK  ----------*/
    }else if (msgType == MQTTSN_TYPE_SUBACK && getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK){
        MqttsnSubAck mqMsg = MqttsnSubAck();
        copyMsg(&mqMsg, recvMsg);

        D_MQTT("\nSUBACK RC=");
        D_MQTTLN(mqMsg.getReturnCode(),HEX);
        D_MQTTF("\nSUBACK RC=%d\r\n", mqMsg.getReturnCode());

        if (mqMsg.getMsgId() == getUint16(_sendQ->getMessage(0)->getBody() + 1)){
            if (mqMsg.getReturnCode() == MQTTSN_RC_ACCEPTED){
                setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
                if (_sendQ->getMessage(0)->getBodyLength() > 5){ // TopicName is not Id
                    MQString topic;
                    topic.copy(_sendQ->getMessage(0)->getBody() + 3,
                    		_sendQ->getMessage(0)->getBodyLength() - 3);
                    _topics.setTopicId(&topic, mqMsg.getTopicId());
                }
            }else if (mqMsg.getReturnCode() == MQTTSN_RC_REJECTED_CONGESTION){
                setMsgRequestStatus(MQTTSN_MSG_RESEND_REQ);
            }else{
                *returnCode = MQTTSN_ERR_REJECTED;       // Return Code
            }
        }

/*---------  UNSUBACK  ----------*/
    }else if (msgType == MQTTSN_TYPE_UNSUBACK && getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK){
        D_MQTTW("UNSUBACK recv\r\n");
        MqttsnUnSubAck mqMsg = MqttsnUnSubAck();
        copyMsg(&mqMsg, recvMsg);
        if (mqMsg.getMsgId() == getUint16(_sendQ->getMessage(0)->getBody() + 1)){
              setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
        }

/*---------  DISCONNECT  ----------*/
    }else if (msgType == MQTTSN_TYPE_DISCONNECT){
         D_MQTTW("DISCONNECT recv\r\n");
         setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
         _clientStatus.recvDISCONNECT();


/*---------  WILLTOPICREQ  ----------*/
    }else if (msgType == MQTTSN_TYPE_WILLTOPICREQ){
        D_MQTTW("WILLTOPICREQ recv\r\n");
        if (getMsgRequestType() == MQTTSN_TYPE_CONNECT){
            clearMsgRequest();
        	//setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
            MqttsnWillTopic mqMsg = MqttsnWillTopic();
            mqMsg.setFlags(0);                               // ToDo:  add  WillQoS, WillRetain to appConfig
            mqMsg.setWillTopic(_willTopic);
            requestPrioritySendMsg((MqttsnMessage*)&mqMsg);
        }

/*---------  WILLMSGREQ  -----------*/
    }else if (msgType == MQTTSN_TYPE_WILLMSGREQ){
        D_MQTTW("WILLMSGREQ recv\r\n");
        if (getMsgRequestType() == MQTTSN_TYPE_WILLTOPIC){
            clearMsgRequest();
        	//setMsgRequestStatus(MQTTSN_MSG_COMPLETE);
            MqttsnWillMsg mqMsg = MqttsnWillMsg();
            mqMsg.setWillMsg(_willMessage);
            requestPrioritySendMsg((MqttsnMessage*)&mqMsg);
        }

/*---------  PUBREC  ----------*/
	}else if (msgType == MQTTSN_TYPE_PUBREC &&
			(getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK &&
			 getMsgRequestType() == MQTTSN_TYPE_PUBLISH)){
		MqttsnPubRec mqMsg = MqttsnPubRec();
		copyMsg(&mqMsg, recvMsg);

		D_MQTTW("\nPUBREC recv\r\n");

		if (mqMsg.getMsgId() == getUint16(_sendQ->getMessage(0)->getBody() + 3)){
			MqttsnPubRel mqrMsg = MqttsnPubRel();
			mqrMsg.setMsgId(mqMsg.getMsgId());
			requestPrioritySendMsg((MqttsnMessage*)&mqrMsg);
		}

/*---------  PUBREL  ----------*/
	}else if (msgType == MQTTSN_TYPE_PUBREL &&
			(getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK &&
			 getMsgRequestType() == MQTTSN_TYPE_PUBREC)){
		MqttsnPubRel mqMsg = MqttsnPubRel();
		copyMsg(&mqMsg, recvMsg);

		D_MQTTW("\nPUBREL recv\r\n");

		if (mqMsg.getMsgId() == getUint16(_sendQ->getMessage(0)->getBody())){
			clearMsgRequest();  // delete PUBREC
			MqttsnPubComp mqrMsg = MqttsnPubComp();
			mqrMsg.setMsgId(mqMsg.getMsgId());
			requestPrioritySendMsg((MqttsnMessage*)&mqMsg);
		}

/*---------  PUBCOMP  ----------*/
	}else if (msgType == MQTTSN_TYPE_PUBCOMP &&
			(getMsgRequestStatus() == MQTTSN_MSG_WAIT_ACK &&
			 getMsgRequestType() == MQTTSN_TYPE_PUBREL)){
		MqttsnPubComp mqMsg = MqttsnPubComp();
		copyMsg(&mqMsg, recvMsg);

		D_MQTTW("\nPUBCOMP recv\r\n");

		if (mqMsg.getMsgId() == getUint16(_sendQ->getMessage(0)->getBody())){
			clearMsgRequest();    // delete request of PUBREL
			setMsgRequestStatus(MQTTSN_MSG_COMPLETE);  // PUBLISH complete
		}
    }else{
		*returnCode = PACKET_ERROR_NODATA;
	}
}
Beispiel #3
0
/* ===================================================
          Procedures for  Received Messages
 =====================================================*/
void MqttsClient::recieveMessageHandler(ZBRxResponse* recvMsg, int* returnCode){
    if ( _gwHdl.isSearching() && (recvMsg->getData()[1] != MQTTS_TYPE_GWINFO)){
        *returnCode = MQTTS_ERR_NO_ERROR;

/*---------  PUBLISH  --------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_PUBLISH){

        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
              debug.println("PUBLISH Received");
            #endif
            #ifdef MBED
                debug.fprintf(stdout,"PUBLISH received\n");
            #endif
            #ifdef LINUX
                fprintf(stdout,"PUBLISH received\n");
            #endif
        #endif  /* DEBUG_MQTTS */

        MqttsPublish mqMsg = MqttsPublish();
        mqMsg.setFrame(recvMsg);
        if ( _gwHdl.getAddress16() == getRxRemoteAddress16()){
            *returnCode = _pubHdl.exec(&mqMsg,&_topics);
            if (mqMsg.getQos() && MQTTS_FLAG_QOS_1){
                pubAck(mqMsg.getTopicId(), mqMsg.getMsgId(), MQTTS_RC_ACCEPTED);
            }
        }


/*---------  PUBACK  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_PUBACK && getMsgRequestStatus() == MQTTS_MSG_WAIT_ACK){
        MqttsPubAck mqMsg = MqttsPubAck();
        copyMsg(&mqMsg, recvMsg);

        if (mqMsg.getMsgId() == getLong(_sendQ->getMessage(0)->getBody() + 3)){
            if (mqMsg.getReturnCode() == MQTTS_RC_ACCEPTED){
                setMsgRequestStatus(MQTTS_MSG_COMPLETE);

            }else if (mqMsg.getReturnCode() == MQTTS_RC_REJECTED_CONGESTION){
                  setMsgRequestStatus(MQTTS_MSG_RESEND_REQ);

            }else{
                *returnCode = MQTTS_ERR_REJECTED;
                setMsgRequestStatus(MQTTS_MSG_REJECTED);
            }
        }
          #ifdef DEBUG_MQTTS
              #ifdef ARDUINO
                debug.print("\nPUBACK ReturnCode=");
                debug.println(mqMsg.getReturnCode(),HEX);
                debug.println();
              #endif
              #ifdef MBED
                  debug.fprintf(stdout,"\nPUBACK ReturnCode=%d\n", mqMsg.getReturnCode());
              #endif
              #ifdef LINUX
                  fprintf(stdout,"\nPUBACK ReturnCode=%d\n", mqMsg.getReturnCode());
              #endif
          #endif /* DEBUG_MQTTS */


/*---------  PINGRESP  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_PINGRESP){

        _gwHdl.recvPingResp();
        if (getMsgRequestType() == MQTTS_TYPE_PINGREQ){
            setMsgRequestStatus(MQTTS_MSG_COMPLETE);
        }
        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
                debug.println(" PINGRESP received");
            #endif
            #ifdef MBED
                debug.fprintf(stdout," PINGRESP received\n");
            #endif
            #ifdef LINUX
                fprintf(stdout," PINGRESP received\n");
            #endif
        #endif /* DEBUG_MQTTS */

/*---------  PINGREQ  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_PINGREQ){

        pingResp();
          #ifdef DEBUG_MQTTS
             #ifdef ARDUINO
                 debug.println(" PINGREQ received");
             #endif
                 #ifdef MBED
                 debug.fprintf(stdout," PINGREQ received\n");
                 #endif
                 #ifdef LINUX
                 fprintf(stdout," PINGREQ received\n");
             #endif
         #endif /* DEBUG_MQTTS */
/*---------  ADVERTISE  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_ADVERTISE){

        *returnCode = MQTTS_ERR_NO_ERROR;

        MqttsAdvertise mqMsg = MqttsAdvertise();
        copyMsg(&mqMsg, recvMsg);
        _gwHdl.recvAdvertise(&mqMsg);
        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
                debug.println(" ADVERTISE received");
            #endif
                #ifdef MBED
                debug.fprintf(stdout," ADVERTISE received\n");
                #endif
                #ifdef LINUX
                fprintf(stdout," ADVERTISE received\n");
            #endif
        #endif /* DEBUG_MQTTS */
        // ToDo  Update list of gateways.  elements are ZBNode

/*---------  GWINFO  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_GWINFO){

        MqttsGwInfo mqMsg = MqttsGwInfo();
        copyMsg(&mqMsg, recvMsg);
        _gwHdl.recvGwInfo(&mqMsg);
        if (getMsgRequestType() == MQTTS_TYPE_SEARCHGW){
            setMsgRequestStatus(MQTTS_MSG_COMPLETE);
        }
        #ifdef DEBUG_MQTTS
           #ifdef ARDUINO
               debug.println(" GWINFO received");
           #endif
               #ifdef MBED
               debug.fprintf(stdout," GWINFO received\n");
               #endif
               #ifdef LINUX
               fprintf(stdout," GWINFO received\n");
           #endif
       #endif /* DEBUG_MQTTS */

/*---------  CANNACK  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_CONNACK){

        if (_qos == 1 && getMsgRequestStatus() == MQTTS_MSG_WAIT_ACK){
            MqttsConnack mqMsg = MqttsConnack();
            copyMsg(&mqMsg, recvMsg);

            if (mqMsg.getReturnCode() == MQTTS_RC_ACCEPTED){
                setMsgRequestStatus(MQTTS_MSG_COMPLETE);
                _gwHdl.setStatus(MQTTS_GW_CONNECTED);
            }else if (mqMsg.getReturnCode() == MQTTS_RC_REJECTED_CONGESTION){
               setMsgRequestStatus(MQTTS_MSG_RESEND_REQ);
            }else{
               setMsgRequestStatus(MQTTS_MSG_REJECTED);
               *returnCode = MQTTS_ERR_REJECTED;
            }
        }
        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
                debug.println(" CONNACK received");
            #endif
                #ifdef MBED
                debug.fprintf(stdout," CONNACK received\n");
                #endif
                #ifdef LINUX
                fprintf(stdout," CONNACK received\n");
            #endif
        #endif /* DEBUG_MQTTS */
/*---------  REGISTER  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_REGISTER){

        MqttsRegister mqMsg = MqttsRegister();

        mqMsg.setFrame(recvMsg);

        if (_topics.match(mqMsg.getTopicName())){
            _topics.addTopic(mqMsg.getTopicName());
            _topics.setTopicId(mqMsg.getTopicName(),mqMsg.getTopicId());
            _topics.setCallback(mqMsg.getTopicId(),_topics.match(mqMsg.getTopicName())->getCallback());
        }
        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
                debug.println(" REGISTER received");
            #endif
            #ifdef MBED
                  debug.fprintf(stdout," REGISTER received\n");
            #endif
            #ifdef LINUX
                  fprintf(stdout," REGISTER received\n");
            #endif
        #endif /* DEBUG_MQTTS */

/*---------  REGACK  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_REGACK){
        if (getMsgRequestStatus() == MQTTS_MSG_WAIT_ACK &&
            getMsgRequestType() == MQTTS_TYPE_REGISTER){
            // ToDo   Debug

            MqttsRegAck mqMsg = MqttsRegAck();
            copyMsg(&mqMsg, recvMsg);
            if (mqMsg.getMsgId() == getLong(_sendQ->getMessage(0)->getBody() + 2)){
                if (getLong((uint8_t*)_sendQ->getMessage(0)->getBody()+4)){
                    if (mqMsg.getReturnCode() == MQTTS_RC_ACCEPTED){
                        MQString topic;
                        topic.readBuf(_sendQ->getMessage(0)->getBody() + 4);
                        _topics.setTopicId(&topic, mqMsg.getTopicId());
                        setMsgRequestStatus(MQTTS_MSG_COMPLETE);
                    }else if (mqMsg.getReturnCode() == MQTTS_RC_REJECTED_CONGESTION){
                      setMsgRequestStatus(MQTTS_MSG_RESEND_REQ);
                    }else{
                        *returnCode = MQTTS_ERR_REJECTED;
                    }
                }
            }
        }
        #ifdef DEBUG_MQTTS
           #ifdef ARDUINO
               debug.println(" REGACK received");
           #endif
           #ifdef MBED
                 debug.fprintf(stdout," REGACK received\n");
           #endif
           #ifdef LINUX
                 fprintf(stdout," REGACK received\n");
           #endif
       #endif /* DEBUG_MQTTS */

/*---------  SUBACK  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_SUBACK && getMsgRequestStatus() == MQTTS_MSG_WAIT_ACK){
        // ToDo   Debug
        MqttsSubAck mqMsg = MqttsSubAck();
        copyMsg(&mqMsg, recvMsg);



        if (mqMsg.getMsgId() == getLong(_sendQ->getMessage(0)->getBody() + 1)){
            if (mqMsg.getReturnCode() == MQTTS_RC_ACCEPTED){
                setMsgRequestStatus(MQTTS_MSG_COMPLETE);
                if (_sendQ->getMessage(0)->getBodyLength() > 5){ // TopicName is not Id
                    MQString topic;
                    topic.readBuf(_sendQ->getMessage(0)->getBody() + 3);
                    _topics.setTopicId(&topic, mqMsg.getTopicId());

                }
            }else if (mqMsg.getReturnCode() == MQTTS_RC_REJECTED_CONGESTION){
                setMsgRequestStatus(MQTTS_MSG_REQUEST);
            }else{
                *returnCode = MQTTS_ERR_REJECTED;
            }
        }
        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
                debug.println();
                debug.print("SUBACK ReturnCode=");
                debug.println(mqMsg.getReturnCode(),HEX);
            #endif
            #if MBED
                debug.fprintf(stdout,"\nSUBACK ReturnCode=%d\n", mqMsg.getReturnCode());
            #endif
            #ifdef LINUX
                fprintf(stdout,"\nSUBACK ReturnCode=%d\n", mqMsg.getReturnCode());
            #endif
        #endif /* DEBUG_MQTTS */

/*---------  UNSUBACK  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_UNSUBACK && getMsgRequestStatus() == MQTTS_MSG_WAIT_ACK){

        MqttsUnSubAck mqMsg = MqttsUnSubAck();
        copyMsg(&mqMsg, recvMsg);
        if (mqMsg.getMsgId() == getLong(_sendQ->getMessage(0)->getBody() + 1)){
              setMsgRequestStatus(MQTTS_MSG_COMPLETE);
        }
        #ifdef DEBUG_MQTTS
           #ifdef ARDUINO
               debug.println(" UNSUBACK received");
           #endif
           #ifdef MBED
                 debug.fprintf(stdout," UNSUBACK received\n");
           #endif
           #ifdef LINUX
                 fprintf(stdout," UNSUBACK received\n");
           #endif
       #endif /* DEBUG_MQTTS */

/*---------  DISCONNECT  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_DISCONNECT && getMsgRequestStatus() == MQTTS_MSG_WAIT_ACK){
         setMsgRequestStatus(MQTTS_MSG_COMPLETE);
         _gwHdl.setStatus(MQTTS_GW_DISCONNECTED);
              #ifdef DEBUG_MQTTS
                   #ifdef ARDUINO
                       debug.println(" DISCONNECT received");
                   #endif
                   #ifdef MBED
                         debug.fprintf(stdout," DISCONNECT received\n");
                   #endif
                   #ifdef LINUX
                         fprintf(stdout," UNSUBACK received\n");
                   #endif
               #endif /* DEBUG_MQTTS */

/*---------  WILLMSGRESP  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_WILLMSGRESP && getMsgRequestStatus() == MQTTS_MSG_WAIT_ACK){
            #ifdef DEBUG_MQTTS
                 #ifdef ARDUINO
                     debug.println(" WILLMSGRESP received");
                 #endif
                 #ifdef MBED
                       debug.fprintf(stdout," WILLMSGRESP received\n");
                 #endif
                 #ifdef LINUX
                       fprintf(stdout," WILLMSGRESP received\n");
                 #endif
             #endif /* DEBUG_MQTTS */

/*---------  WILLTOPICREQ  ----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_WILLTOPICREQ){

        if (getMsgRequestType() == MQTTS_TYPE_CONNECT){
            setMsgRequestStatus(MQTTS_MSG_COMPLETE);
            MqttsWillTopic mqMsg = MqttsWillTopic();
            mqMsg.setWillTopic(_willTopic);

            if (  _sendQ->addPriorityRequest((MqttsMessage*)&mqMsg) == 0){
                setMsgRequestStatus(MQTTS_MSG_REQUEST);
            }else{
                *returnCode = MQTTS_ERR_OUT_OF_MEMORY;
            }
        }
        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
                debug.println(" WILLTOPICREQ received");
            #endif
            #ifdef MBED
                  debug.fprintf(stdout," WILLTOPICREQ received\n");
            #endif
            #ifdef LINUX
                  fprintf(stdout," WILLTOPICREQ received\n");
            #endif
        #endif /* DEBUG_MQTTS */

/*---------  WILLMSGREQ  -----------*/
    }else if (recvMsg->getData()[1] == MQTTS_TYPE_WILLMSGREQ){

        if (getMsgRequestType() == MQTTS_TYPE_WILLTOPIC){
            setMsgRequestStatus(MQTTS_MSG_COMPLETE);
            MqttsWillMsg mqMsg = MqttsWillMsg();
            mqMsg.setWillMsg(_willMessage);
            if (  _sendQ->addPriorityRequest((MqttsMessage*)&mqMsg) == 0){
                setMsgRequestStatus(MQTTS_MSG_REQUEST);
            }else{
                *returnCode = MQTTS_ERR_OUT_OF_MEMORY;
            }
        }
        #ifdef DEBUG_MQTTS
            #ifdef ARDUINO
                debug.println(" WILLMSGREQ received");
            #endif
            #ifdef MBED
                  debug.fprintf(stdout," WILLMSGREQ received\n");
            #endif
            #ifdef LINUX
                  fprintf(stdout," WILLMSGREQ received\n");
            #endif
        #endif /* DEBUG_MQTTS */
    }
}