mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-14 16:06:51 +01:00
Update: Add Pre-defined-Topic
Signed-off-by: tomoaki <tomoaki@tomy-tech.com>
This commit is contained in:
@@ -41,160 +41,122 @@ void MQTTSNSubscribeHandler::handleSubscribe(Client* client, MQTTSNPacket* packe
|
||||
uint16_t msgId;
|
||||
MQTTSN_topicid topicFilter;
|
||||
Topic* topic = 0;
|
||||
uint16_t topicId = 0;
|
||||
MQTTGWPacket* subscribe;
|
||||
Event* ev1;
|
||||
Event* evsuback;
|
||||
|
||||
if ( packet->getSUBSCRIBE(&dup, &qos, &msgId, &topicFilter) == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (topicFilter.type <= MQTTSN_TOPIC_TYPE_SHORT)
|
||||
if ( msgId == 0 )
|
||||
{
|
||||
if (topicFilter.type == MQTTSN_TOPIC_TYPE_PREDEFINED)
|
||||
{
|
||||
/*----- Predefined TopicId ------*/
|
||||
MQTTSNPacket* sSuback = new MQTTSNPacket();
|
||||
|
||||
if (msgId)
|
||||
{
|
||||
int rc = MQTTSN_RC_ACCEPTED;
|
||||
|
||||
switch (topicFilter.data.id)
|
||||
{
|
||||
case PREDEFINEDID_OTA_REQ: // check topicIds are defined.
|
||||
case PREDEFINEDID_OTA_READY:
|
||||
case PREDEFINEDID_OTA_NO_CLIENT:
|
||||
break;
|
||||
default:
|
||||
rc = MQTTSN_RC_REJECTED_INVALID_TOPIC_ID;
|
||||
}
|
||||
sSuback->setSUBACK(qos, topicFilter.data.id, msgId, rc);
|
||||
Event* evsuback = new Event();
|
||||
evsuback->setClientSendEvent(client, sSuback);
|
||||
_gateway->getClientSendQue()->post(evsuback);
|
||||
}
|
||||
switch (topicFilter.data.id)
|
||||
{
|
||||
case 1:
|
||||
/*
|
||||
* ToDo: write here Predefined Topic 01 Procedures.
|
||||
*/
|
||||
break;
|
||||
case 2:
|
||||
/*
|
||||
* ToDo: write here Predefined Topic 02 Procedures. so on
|
||||
*/
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
uint16_t topicId = 0;
|
||||
MQTTGWPacket* subscribe = new MQTTGWPacket();
|
||||
topic = client->getTopics()->getTopic(&topicFilter);
|
||||
if (topic == 0)
|
||||
{
|
||||
if (topicFilter.type == MQTTSN_TOPIC_TYPE_NORMAL)
|
||||
{
|
||||
topic = client->getTopics()->add(&topicFilter);
|
||||
topicId = topic->getTopicId();
|
||||
subscribe->setSUBSCRIBE((char*)topic->getTopicName()->c_str(), (uint8_t)qos, (uint16_t)msgId);
|
||||
}
|
||||
else if (topicFilter.type == MQTTSN_TOPIC_TYPE_SHORT)
|
||||
{
|
||||
char topic[3];
|
||||
topic[0] = topicFilter.data.short_name[0];
|
||||
topic[1] = topicFilter.data.short_name[1];
|
||||
topic[2] = 0;
|
||||
topicId = topicFilter.data.id;
|
||||
subscribe->setSUBSCRIBE(topic, (uint8_t)qos, (uint16_t)msgId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
topicId = topic->getTopicId();
|
||||
subscribe->setSUBSCRIBE((char*)topic->getTopicName()->c_str(), (uint8_t)qos, (uint16_t)msgId);
|
||||
}
|
||||
|
||||
if ( msgId > 0 )
|
||||
{
|
||||
client->setWaitedSubTopicId(msgId, topicId, topicFilter.type);
|
||||
}
|
||||
|
||||
Event* ev1 = new Event();
|
||||
ev1->setBrokerSendEvent(client, subscribe);
|
||||
_gateway->getBrokerSendQue()->post(ev1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/*-- Invalid TopicIdType --*/
|
||||
if (msgId)
|
||||
{
|
||||
MQTTSNPacket* sSuback = new MQTTSNPacket();
|
||||
sSuback->setSUBACK(qos, topicFilter.data.id, msgId, MQTTSN_RC_REJECTED_INVALID_TOPIC_ID);
|
||||
Event* evsuback = new Event();
|
||||
evsuback->setClientSendEvent(client, sSuback);
|
||||
_gateway->getClientSendQue()->post(evsuback);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if ( topicFilter.type == MQTTSN_TOPIC_TYPE_PREDEFINED )
|
||||
{
|
||||
topic = client->getTopics()->getTopicById(&topicFilter);
|
||||
if ( topic )
|
||||
{
|
||||
topicId = topic->getTopicId();
|
||||
subscribe = new MQTTGWPacket();
|
||||
subscribe->setSUBSCRIBE((char*)topic->getTopicName()->c_str(), (uint8_t)qos, (uint16_t)msgId);
|
||||
}
|
||||
else
|
||||
{
|
||||
goto RespExit;
|
||||
}
|
||||
}
|
||||
else if (topicFilter.type == MQTTSN_TOPIC_TYPE_NORMAL)
|
||||
{
|
||||
topic = client->getTopics()->getTopicByName(&topicFilter);
|
||||
if ( topic == 0 )
|
||||
{
|
||||
topic = client->getTopics()->add(&topicFilter);
|
||||
if ( topic == 0 )
|
||||
{
|
||||
WRITELOG("%s Client(%s) can't add the Topic.%s\n", ERRMSG_HEADER, client->getClientId(), ERRMSG_FOOTER);
|
||||
return;
|
||||
}
|
||||
}
|
||||
topicId = topic->getTopicId();
|
||||
subscribe = new MQTTGWPacket();
|
||||
|
||||
subscribe->setSUBSCRIBE((char*)topic->getTopicName()->c_str(), (uint8_t)qos, (uint16_t)msgId);
|
||||
}
|
||||
else //MQTTSN_TOPIC_TYPE_SHORT
|
||||
{
|
||||
char topicstr[3];
|
||||
topicstr[0] = topicFilter.data.short_name[0];
|
||||
topicstr[1] = topicFilter.data.short_name[1];
|
||||
topicstr[2] = 0;
|
||||
topicId = 0;
|
||||
subscribe = new MQTTGWPacket();
|
||||
subscribe->setSUBSCRIBE(topicstr, (uint8_t)qos, (uint16_t)msgId);
|
||||
}
|
||||
|
||||
client->setWaitedSubTopicId(msgId, topicId, topicFilter.type);
|
||||
|
||||
ev1 = new Event();
|
||||
ev1->setBrokerSendEvent(client, subscribe);
|
||||
_gateway->getBrokerSendQue()->post(ev1);
|
||||
return;
|
||||
|
||||
|
||||
RespExit:
|
||||
MQTTSNPacket* sSuback = new MQTTSNPacket();
|
||||
sSuback->setSUBACK(qos, topicFilter.data.id, msgId, MQTTSN_RC_NOT_SUPPORTED);
|
||||
evsuback = new Event();
|
||||
evsuback->setClientSendEvent(client, sSuback);
|
||||
_gateway->getClientSendQue()->post(evsuback);
|
||||
}
|
||||
|
||||
void MQTTSNSubscribeHandler::handleUnsubscribe(Client* client, MQTTSNPacket* packet)
|
||||
{
|
||||
uint16_t msgId;
|
||||
MQTTSN_topicid topicFilter;
|
||||
MQTTGWPacket* unsubscribe = 0;;
|
||||
|
||||
if ( packet->getUNSUBSCRIBE(&msgId, &topicFilter) == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ( topicFilter.type == MQTTSN_TOPIC_TYPE_PREDEFINED )
|
||||
{
|
||||
/*
|
||||
* ToDo: procedures for Predefined Topic
|
||||
*/
|
||||
return;
|
||||
}
|
||||
if ( msgId == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Topic* topic = client->getTopics()->getTopic(&topicFilter);
|
||||
MQTTGWPacket* unsubscribe = new MQTTGWPacket();
|
||||
Topic* topic = client->getTopics()->getTopicById(&topicFilter);
|
||||
|
||||
if (topicFilter.type == MQTTSN_TOPIC_TYPE_NORMAL)
|
||||
if (topicFilter.type == MQTTSN_TOPIC_TYPE_SHORT)
|
||||
{
|
||||
if ( topic == 0 )
|
||||
{
|
||||
if (msgId)
|
||||
{
|
||||
MQTTSNPacket* sUnsuback = new MQTTSNPacket();
|
||||
sUnsuback->setUNSUBACK(msgId);
|
||||
Event* evsuback = new Event();
|
||||
evsuback->setClientSendEvent(client, sUnsuback);
|
||||
_gateway->getClientSendQue()->post(evsuback);
|
||||
}
|
||||
delete unsubscribe;
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsubscribe->setUNSUBSCRIBE(topic->getTopicName()->c_str(), msgId);
|
||||
}
|
||||
}
|
||||
else if (topicFilter.type == MQTTSN_TOPIC_TYPE_SHORT)
|
||||
{
|
||||
char shortTopic[3];
|
||||
shortTopic[0] = topicFilter.data.short_name[0];
|
||||
shortTopic[1] = topicFilter.data.short_name[1];
|
||||
shortTopic[2] = 0;
|
||||
unsubscribe->setUNSUBSCRIBE(shortTopic, msgId);
|
||||
char shortTopic[3];
|
||||
shortTopic[0] = topicFilter.data.short_name[0];
|
||||
shortTopic[1] = topicFilter.data.short_name[1];
|
||||
shortTopic[2] = 0;
|
||||
unsubscribe = new MQTTGWPacket();
|
||||
unsubscribe->setUNSUBSCRIBE(shortTopic, msgId);
|
||||
}
|
||||
else
|
||||
{
|
||||
delete unsubscribe;
|
||||
return;
|
||||
if ( topic == 0 )
|
||||
{
|
||||
MQTTSNPacket* sUnsuback = new MQTTSNPacket();
|
||||
sUnsuback->setUNSUBACK(msgId);
|
||||
Event* evsuback = new Event();
|
||||
evsuback->setClientSendEvent(client, sUnsuback);
|
||||
_gateway->getClientSendQue()->post(evsuback);
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
unsubscribe = new MQTTGWPacket();
|
||||
unsubscribe->setUNSUBSCRIBE(topic->getTopicName()->c_str(), msgId);
|
||||
}
|
||||
}
|
||||
|
||||
Event* ev1 = new Event();
|
||||
|
||||
Reference in New Issue
Block a user