/*------------------------------------------------------- Downstream MQTTPublish -------------------------------------------------------*/ void GatewayControlTask::handlePublish(Event* ev, ClientNode* clnode, MQTTMessage* msg){ MQTTPublish* mqMsg = static_cast<MQTTPublish*>(msg); MQTTSnPublish* snMsg = new MQTTSnPublish(); string* tp = mqMsg->getTopic(); uint16_t tpId; if(tp->size() == 2){ tpId = getUint16((uint8_t*)tp); snMsg->setFlags(MQTTSN_TOPIC_TYPE_SHORT); }else{ tpId = clnode->getTopics()->getTopicId(tp); snMsg->setFlags(MQTTSN_TOPIC_TYPE_NORMAL); } if(tpId == 0){ /* ----- may be a publish message response of subscribed with '#' or '+' -----*/ tpId = clnode->getTopics()->createTopic(tp); if(tpId > 0){ MQTTSnRegister* regMsg = new MQTTSnRegister(); regMsg->setTopicId(tpId); regMsg->setTopicName(tp); printf(FORMAT2, currentDateTime(), "REGISTER", RIGHTARROW, clnode->getNodeId()->c_str(), msgPrint(regMsg)); clnode->setClientSendMessage(regMsg); Event* evrg = new Event(); evrg->setClientSendEvent(clnode); _res->getClientSendQue()->post(evrg); // Send Register first. }else{ printf("GatewayControlTask Can't create Topic %s\n", tp->c_str()); return; } } snMsg->setTopicId(tpId); snMsg->setMsgId(mqMsg->getMessageId()); snMsg->setData(mqMsg->getPayload(),mqMsg->getPayloadLength()); snMsg->setQos(mqMsg->getQos()); if(mqMsg->isDup()){ snMsg->setDup(); } if(mqMsg->isRetain()){ snMsg->setDup(); } clnode->setClientSendMessage(snMsg); printf(GREEN_FORMAT1, currentDateTime(), "PUBLISH", RIGHTARROW, clnode->getNodeId()->c_str(), msgPrint(snMsg)); Event* ev1 = new Event(); ev1->setClientSendEvent(clnode); _res->getClientSendQue()->post(ev1); }
/*------------------------------------------------------- Upstream MQTTSnSubscribe -------------------------------------------------------*/ void GatewayControlTask::handleSnSubscribe(Event* ev, ClientNode* clnode, MQTTSnMessage* msg){ printf(FORMAT2, currentDateTime(), "SUBSCRIBE", LEFTARROW, clnode->getNodeId()->c_str(), msgPrint(msg)); MQTTSnSubscribe* sSubscribe = new MQTTSnSubscribe(); MQTTSubscribe* subscribe = new MQTTSubscribe(); sSubscribe->absorb(msg); uint8_t topicIdType = sSubscribe->getFlags() & 0x03; subscribe->setMessageId(sSubscribe->getMsgId()); if(sSubscribe->getFlags() & MQTTSN_FLAG_DUP ){ subscribe->setDup(); } if(sSubscribe->getFlags() & MQTTSN_FLAG_RETAIN){ subscribe->setRetain(); } subscribe->setQos(sSubscribe->getQos()); if(topicIdType != MQTTSN_FLAG_TOPICID_TYPE_RESV){ if(topicIdType == MQTTSN_FLAG_TOPICID_TYPE_PREDEFINED){ /*----- Predefined TopicId ------*/ MQTTSnSubAck* sSuback = new MQTTSnSubAck(); if(sSubscribe->getMsgId()){ // MessageID sSuback->setQos(sSubscribe->getQos()); sSuback->setTopicId(sSubscribe->getTopicId()); sSuback->setMsgId(sSubscribe->getMsgId()); if(sSubscribe->getTopicId() == MQTTSN_TOPICID_PREDEFINED_TIME){ sSuback->setReturnCode(MQTT_RC_ACCEPTED); }else{ sSuback->setReturnCode(MQTT_RC_REFUSED_IDENTIFIER_REJECTED); } clnode->setClientSendMessage(sSuback); Event* evsuback = new Event(); evsuback->setClientSendEvent(clnode); printf(FORMAT1, currentDateTime(), "SUBACK", RIGHTARROW, clnode->getNodeId()->c_str(), msgPrint(sSuback)); _res->getClientSendQue()->post(evsuback); } if(sSubscribe->getTopicId() == MQTTSN_TOPICID_PREDEFINED_TIME){ MQTTSnPublish* pub = new MQTTSnPublish(); pub->setTopicIdType(1); // pre-defined pub->setTopicId(MQTTSN_TOPICID_PREDEFINED_TIME); pub->setMsgId(clnode->getNextSnMsgId()); uint8_t buf[4]; uint32_t tm = time(0); setUint32(buf,tm); pub->setData(buf, 4); printf(GREEN_FORMAT1, currentDateTime(), "PUBLISH", RIGHTARROW, clnode->getNodeId()->c_str(), msgPrint(pub)); clnode->setClientSendMessage(pub); Event *evpub = new Event(); evpub->setClientSendEvent(clnode); _res->getClientSendQue()->post(evpub); } delete subscribe; }else{ uint16_t tpId; Topic* tp = clnode->getTopics()->getTopic(sSubscribe->getTopicName()); if (tp){ tpId = tp->getTopicId(); }else{ tpId = clnode->getTopics()->createTopic(sSubscribe->getTopicName()); } subscribe->setTopic(sSubscribe->getTopicName(), sSubscribe->getQos()); if(sSubscribe->getMsgId()){ MQTTSnSubAck* sSuback = new MQTTSnSubAck(); sSuback->setMsgId(sSubscribe->getMsgId()); sSuback->setTopicId(tpId); clnode->setWaitedSubAck(sSuback); } clnode->setBrokerSendMessage(subscribe); Event* ev1 = new Event(); ev1->setBrokerSendEvent(clnode); _res->getBrokerSendQue()->post(ev1); delete sSubscribe; return; } }else{ /*-- Irregular TopicIdType --*/ if(sSubscribe->getMsgId()){ MQTTSnSubAck* sSuback = new MQTTSnSubAck(); sSuback->setMsgId(sSubscribe->getMsgId()); sSuback->setTopicId(sSubscribe->getTopicId()); sSuback->setReturnCode(MQTT_RC_REFUSED_IDENTIFIER_REJECTED); clnode->setClientSendMessage(sSuback); Event* evun = new Event(); evun->setClientSendEvent(clnode); printf(FORMAT1, currentDateTime(), "SUBACK", RIGHTARROW, clnode->getNodeId()->c_str(), msgPrint(sSuback)); _res->getClientSendQue()->post(evun); // Send SUBACK to Client } delete subscribe; } delete sSubscribe; }