Beispiel #1
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 */
    }
}