/* =================================================== 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 */ } }