mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-16 17:06:51 +01:00
@@ -28,7 +28,7 @@ using namespace MQTTSNGW;
|
||||
=====================================*/
|
||||
MQTTSNConnectionHandler::MQTTSNConnectionHandler(Gateway* gateway)
|
||||
{
|
||||
_gateway = gateway;
|
||||
_gateway = gateway;
|
||||
}
|
||||
|
||||
MQTTSNConnectionHandler::~MQTTSNConnectionHandler()
|
||||
@@ -41,11 +41,12 @@ MQTTSNConnectionHandler::~MQTTSNConnectionHandler()
|
||||
*/
|
||||
void MQTTSNConnectionHandler::sendADVERTISE()
|
||||
{
|
||||
MQTTSNPacket* adv = new MQTTSNPacket();
|
||||
adv->setADVERTISE(_gateway->getGWParams()->gatewayId, _gateway->getGWParams()->keepAlive);
|
||||
Event* ev1 = new Event();
|
||||
ev1->setBrodcastEvent(adv); //broadcast
|
||||
_gateway->getClientSendQue()->post(ev1);
|
||||
MQTTSNPacket* adv = new MQTTSNPacket();
|
||||
adv->setADVERTISE(_gateway->getGWParams()->gatewayId,
|
||||
_gateway->getGWParams()->keepAlive);
|
||||
Event* ev1 = new Event();
|
||||
ev1->setBrodcastEvent(adv); //broadcast
|
||||
_gateway->getClientSendQue()->post(ev1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -53,182 +54,191 @@ void MQTTSNConnectionHandler::sendADVERTISE()
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handleSearchgw(MQTTSNPacket* packet)
|
||||
{
|
||||
if (packet->getType() == MQTTSN_SEARCHGW)
|
||||
{
|
||||
MQTTSNPacket* gwinfo = new MQTTSNPacket();
|
||||
gwinfo->setGWINFO(_gateway->getGWParams()->gatewayId);
|
||||
Event* ev1 = new Event();
|
||||
ev1->setBrodcastEvent(gwinfo);
|
||||
_gateway->getClientSendQue()->post(ev1);
|
||||
}
|
||||
if (packet->getType() == MQTTSN_SEARCHGW)
|
||||
{
|
||||
MQTTSNPacket* gwinfo = new MQTTSNPacket();
|
||||
gwinfo->setGWINFO(_gateway->getGWParams()->gatewayId);
|
||||
Event* ev1 = new Event();
|
||||
ev1->setBrodcastEvent(gwinfo);
|
||||
_gateway->getClientSendQue()->post(ev1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* CONNECT
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handleConnect(Client* client, MQTTSNPacket* packet)
|
||||
void MQTTSNConnectionHandler::handleConnect(Client* client,
|
||||
MQTTSNPacket* packet)
|
||||
{
|
||||
MQTTSNPacket_connectData data;
|
||||
if ( packet->getCONNECT(&data) == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
MQTTSNPacket_connectData data;
|
||||
if (packet->getCONNECT(&data) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
/* return CONNACK when the client is sleeping */
|
||||
if ( client->isSleep() || client->isAwake() )
|
||||
{
|
||||
MQTTSNPacket* packet = new MQTTSNPacket();
|
||||
packet->setCONNACK(MQTTSN_RC_ACCEPTED);
|
||||
Event* ev = new Event();
|
||||
ev->setClientSendEvent(client, packet);
|
||||
_gateway->getClientSendQue()->post(ev);
|
||||
/* return CONNACK when the client is sleeping */
|
||||
if (client->isSleep() || client->isAwake())
|
||||
{
|
||||
MQTTSNPacket* packet = new MQTTSNPacket();
|
||||
packet->setCONNACK(MQTTSN_RC_ACCEPTED);
|
||||
Event* ev = new Event();
|
||||
ev->setClientSendEvent(client, packet);
|
||||
_gateway->getClientSendQue()->post(ev);
|
||||
|
||||
sendStoredPublish(client);
|
||||
return;
|
||||
}
|
||||
sendStoredPublish(client);
|
||||
return;
|
||||
}
|
||||
|
||||
//* clear ConnectData of Client */
|
||||
Connect* connectData = client->getConnectData();
|
||||
memset(connectData, 0, sizeof(Connect));
|
||||
if ( !client->isAdapter() )
|
||||
{
|
||||
client->disconnected();
|
||||
}
|
||||
//* clear ConnectData of Client */
|
||||
Connect* connectData = client->getConnectData();
|
||||
memset(connectData, 0, sizeof(Connect));
|
||||
if (!client->isAdapter())
|
||||
{
|
||||
client->disconnected();
|
||||
}
|
||||
|
||||
Topics* topics = client->getTopics();
|
||||
Topics* topics = client->getTopics();
|
||||
|
||||
/* CONNECT was not sent yet. prepare Connect data */
|
||||
connectData->header.bits.type = CONNECT;
|
||||
connectData->clientID = client->getClientId();
|
||||
connectData->version = _gateway->getGWParams()->mqttVersion;
|
||||
connectData->keepAliveTimer = data.duration;
|
||||
connectData->flags.bits.will = data.willFlag;
|
||||
/* CONNECT was not sent yet. prepare Connect data */
|
||||
connectData->header.bits.type = CONNECT;
|
||||
connectData->clientID = client->getClientId();
|
||||
connectData->version = _gateway->getGWParams()->mqttVersion;
|
||||
connectData->keepAliveTimer = data.duration;
|
||||
connectData->flags.bits.will = data.willFlag;
|
||||
|
||||
if ((const char*) _gateway->getGWParams()->loginId != nullptr)
|
||||
{
|
||||
connectData->flags.bits.username = 1;
|
||||
}
|
||||
if ((const char*) _gateway->getGWParams()->loginId != nullptr)
|
||||
{
|
||||
connectData->flags.bits.username = 1;
|
||||
}
|
||||
|
||||
if ((const char*) _gateway->getGWParams()->password != 0)
|
||||
{
|
||||
connectData->flags.bits.password = 1;
|
||||
}
|
||||
if ((const char*) _gateway->getGWParams()->password != 0)
|
||||
{
|
||||
connectData->flags.bits.password = 1;
|
||||
}
|
||||
|
||||
client->setSessionStatus(false);
|
||||
if (data.cleansession)
|
||||
{
|
||||
connectData->flags.bits.cleanstart = 1;
|
||||
/* reset the table of msgNo and TopicId pare */
|
||||
client->clearWaitedPubTopicId();
|
||||
client->clearWaitedSubTopicId();
|
||||
client->setSessionStatus(false);
|
||||
if (data.cleansession)
|
||||
{
|
||||
connectData->flags.bits.cleanstart = 1;
|
||||
/* reset the table of msgNo and TopicId pare */
|
||||
client->clearWaitedPubTopicId();
|
||||
client->clearWaitedSubTopicId();
|
||||
|
||||
/* renew the TopicList */
|
||||
if (topics)
|
||||
{
|
||||
topics->eraseNormal();;
|
||||
}
|
||||
client->setSessionStatus(true);
|
||||
}
|
||||
/* renew the TopicList */
|
||||
if (topics)
|
||||
{
|
||||
topics->eraseNormal();
|
||||
;
|
||||
}
|
||||
client->setSessionStatus(true);
|
||||
}
|
||||
|
||||
if (data.willFlag)
|
||||
{
|
||||
/* create & send WILLTOPICREQ message to the client */
|
||||
MQTTSNPacket* reqTopic = new MQTTSNPacket();
|
||||
reqTopic->setWILLTOPICREQ();
|
||||
Event* evwr = new Event();
|
||||
evwr->setClientSendEvent(client, reqTopic);
|
||||
if (data.willFlag)
|
||||
{
|
||||
/* create & send WILLTOPICREQ message to the client */
|
||||
MQTTSNPacket* reqTopic = new MQTTSNPacket();
|
||||
reqTopic->setWILLTOPICREQ();
|
||||
Event* evwr = new Event();
|
||||
evwr->setClientSendEvent(client, reqTopic);
|
||||
|
||||
/* Send WILLTOPICREQ to the client */
|
||||
_gateway->getClientSendQue()->post(evwr);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* CONNECT message was not qued in.
|
||||
* create CONNECT message & send it to the broker */
|
||||
MQTTGWPacket* mqMsg = new MQTTGWPacket();
|
||||
mqMsg->setCONNECT(client->getConnectData(), (unsigned char*)_gateway->getGWParams()->loginId, (unsigned char*)_gateway->getGWParams()->password);
|
||||
Event* ev1 = new Event();
|
||||
ev1->setBrokerSendEvent(client, mqMsg);
|
||||
_gateway->getBrokerSendQue()->post(ev1);
|
||||
}
|
||||
/* Send WILLTOPICREQ to the client */
|
||||
_gateway->getClientSendQue()->post(evwr);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* CONNECT message was not qued in.
|
||||
* create CONNECT message & send it to the broker */
|
||||
MQTTGWPacket* mqMsg = new MQTTGWPacket();
|
||||
mqMsg->setCONNECT(client->getConnectData(),
|
||||
(unsigned char*) _gateway->getGWParams()->loginId,
|
||||
(unsigned char*) _gateway->getGWParams()->password);
|
||||
Event* ev1 = new Event();
|
||||
ev1->setBrokerSendEvent(client, mqMsg);
|
||||
_gateway->getBrokerSendQue()->post(ev1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* WILLTOPIC
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handleWilltopic(Client* client, MQTTSNPacket* packet)
|
||||
void MQTTSNConnectionHandler::handleWilltopic(Client* client,
|
||||
MQTTSNPacket* packet)
|
||||
{
|
||||
int willQos;
|
||||
uint8_t willRetain;
|
||||
MQTTSNString willTopic = MQTTSNString_initializer;
|
||||
int willQos;
|
||||
uint8_t willRetain;
|
||||
MQTTSNString willTopic = MQTTSNString_initializer;
|
||||
|
||||
if ( packet->getWILLTOPIC(&willQos, &willRetain, &willTopic) == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
client->setWillTopic(willTopic);
|
||||
Connect* connectData = client->getConnectData();
|
||||
if (packet->getWILLTOPIC(&willQos, &willRetain, &willTopic) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
client->setWillTopic(willTopic);
|
||||
Connect* connectData = client->getConnectData();
|
||||
|
||||
/* add the connectData for MQTT CONNECT message */
|
||||
connectData->willTopic = client->getWillTopic();
|
||||
connectData->flags.bits.willQoS = willQos;
|
||||
connectData->flags.bits.willRetain = willRetain;
|
||||
/* add the connectData for MQTT CONNECT message */
|
||||
connectData->willTopic = client->getWillTopic();
|
||||
connectData->flags.bits.willQoS = willQos;
|
||||
connectData->flags.bits.willRetain = willRetain;
|
||||
|
||||
/* Send WILLMSGREQ to the client */
|
||||
client->setWaitWillMsgFlg(true);
|
||||
MQTTSNPacket* reqMsg = new MQTTSNPacket();
|
||||
reqMsg->setWILLMSGREQ();
|
||||
Event* evt = new Event();
|
||||
evt->setClientSendEvent(client, reqMsg);
|
||||
_gateway->getClientSendQue()->post(evt);
|
||||
/* Send WILLMSGREQ to the client */
|
||||
client->setWaitWillMsgFlg(true);
|
||||
MQTTSNPacket* reqMsg = new MQTTSNPacket();
|
||||
reqMsg->setWILLMSGREQ();
|
||||
Event* evt = new Event();
|
||||
evt->setClientSendEvent(client, reqMsg);
|
||||
_gateway->getClientSendQue()->post(evt);
|
||||
}
|
||||
|
||||
/*
|
||||
* WILLMSG
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handleWillmsg(Client* client, MQTTSNPacket* packet)
|
||||
void MQTTSNConnectionHandler::handleWillmsg(Client* client,
|
||||
MQTTSNPacket* packet)
|
||||
{
|
||||
if ( !client->isWaitWillMsg() )
|
||||
{
|
||||
DEBUGLOG(" MQTTSNConnectionHandler::handleWillmsg WaitWillMsgFlg is off.\n");
|
||||
return;
|
||||
}
|
||||
if (!client->isWaitWillMsg())
|
||||
{
|
||||
DEBUGLOG(" MQTTSNConnectionHandler::handleWillmsg WaitWillMsgFlg is off.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
MQTTSNString willmsg = MQTTSNString_initializer;
|
||||
Connect* connectData = client->getConnectData();
|
||||
MQTTSNString willmsg = MQTTSNString_initializer;
|
||||
Connect* connectData = client->getConnectData();
|
||||
|
||||
if( client->isConnectSendable() )
|
||||
{
|
||||
/* save WillMsg in the client */
|
||||
if ( packet->getWILLMSG(&willmsg) == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
client->setWillMsg(willmsg);
|
||||
if (client->isConnectSendable())
|
||||
{
|
||||
/* save WillMsg in the client */
|
||||
if (packet->getWILLMSG(&willmsg) == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
client->setWillMsg(willmsg);
|
||||
|
||||
/* create CONNECT message */
|
||||
MQTTGWPacket* mqttPacket = new MQTTGWPacket();
|
||||
connectData->willMsg = client->getWillMsg();
|
||||
mqttPacket->setCONNECT(connectData, (unsigned char*)_gateway->getGWParams()->loginId, (unsigned char*)_gateway->getGWParams()->password);
|
||||
/* create CONNECT message */
|
||||
MQTTGWPacket* mqttPacket = new MQTTGWPacket();
|
||||
connectData->willMsg = client->getWillMsg();
|
||||
mqttPacket->setCONNECT(connectData,
|
||||
(unsigned char*) _gateway->getGWParams()->loginId,
|
||||
(unsigned char*) _gateway->getGWParams()->password);
|
||||
|
||||
/* Send CONNECT to the broker */
|
||||
Event* evt = new Event();
|
||||
evt->setBrokerSendEvent(client, mqttPacket);
|
||||
client->setWaitWillMsgFlg(false);
|
||||
_gateway->getBrokerSendQue()->post(evt);
|
||||
}
|
||||
/* Send CONNECT to the broker */
|
||||
Event* evt = new Event();
|
||||
evt->setBrokerSendEvent(client, mqttPacket);
|
||||
client->setWaitWillMsgFlg(false);
|
||||
_gateway->getBrokerSendQue()->post(evt);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* DISCONNECT
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handleDisconnect(Client* client, MQTTSNPacket* packet)
|
||||
void MQTTSNConnectionHandler::handleDisconnect(Client* client,
|
||||
MQTTSNPacket* packet)
|
||||
{
|
||||
uint16_t duration = 0;
|
||||
|
||||
if ( packet->getDISCONNECT(&duration) != 0 )
|
||||
if (packet->getDISCONNECT(&duration) != 0)
|
||||
{
|
||||
if ( duration == 0 )
|
||||
if (duration == 0)
|
||||
{
|
||||
MQTTGWPacket* mqMsg = new MQTTGWPacket();
|
||||
mqMsg->setHeader(DISCONNECT);
|
||||
@@ -248,59 +258,63 @@ void MQTTSNConnectionHandler::handleDisconnect(Client* client, MQTTSNPacket* pac
|
||||
/*
|
||||
* WILLTOPICUPD
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handleWilltopicupd(Client* client, MQTTSNPacket* packet)
|
||||
void MQTTSNConnectionHandler::handleWilltopicupd(Client* client,
|
||||
MQTTSNPacket* packet)
|
||||
{
|
||||
/* send NOT_SUPPORTED responce to the client */
|
||||
MQTTSNPacket* respMsg = new MQTTSNPacket();
|
||||
respMsg->setWILLTOPICRESP(MQTTSN_RC_NOT_SUPPORTED);
|
||||
Event* evt = new Event();
|
||||
evt->setClientSendEvent(client, respMsg);
|
||||
_gateway->getClientSendQue()->post(evt);
|
||||
/* send NOT_SUPPORTED responce to the client */
|
||||
MQTTSNPacket* respMsg = new MQTTSNPacket();
|
||||
respMsg->setWILLTOPICRESP(MQTTSN_RC_NOT_SUPPORTED);
|
||||
Event* evt = new Event();
|
||||
evt->setClientSendEvent(client, respMsg);
|
||||
_gateway->getClientSendQue()->post(evt);
|
||||
}
|
||||
|
||||
/*
|
||||
* WILLMSGUPD
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handleWillmsgupd(Client* client, MQTTSNPacket* packet)
|
||||
void MQTTSNConnectionHandler::handleWillmsgupd(Client* client,
|
||||
MQTTSNPacket* packet)
|
||||
{
|
||||
/* send NOT_SUPPORTED responce to the client */
|
||||
MQTTSNPacket* respMsg = new MQTTSNPacket();
|
||||
respMsg->setWILLMSGRESP(MQTTSN_RC_NOT_SUPPORTED);
|
||||
Event* evt = new Event();
|
||||
evt->setClientSendEvent(client, respMsg);
|
||||
_gateway->getClientSendQue()->post(evt);
|
||||
/* send NOT_SUPPORTED responce to the client */
|
||||
MQTTSNPacket* respMsg = new MQTTSNPacket();
|
||||
respMsg->setWILLMSGRESP(MQTTSN_RC_NOT_SUPPORTED);
|
||||
Event* evt = new Event();
|
||||
evt->setClientSendEvent(client, respMsg);
|
||||
_gateway->getClientSendQue()->post(evt);
|
||||
}
|
||||
|
||||
/*
|
||||
* PINGREQ
|
||||
*/
|
||||
void MQTTSNConnectionHandler::handlePingreq(Client* client, MQTTSNPacket* packet)
|
||||
void MQTTSNConnectionHandler::handlePingreq(Client* client,
|
||||
MQTTSNPacket* packet)
|
||||
{
|
||||
if ( ( client->isSleep() || client->isAwake() ) && client->getClientSleepPacket() )
|
||||
{
|
||||
sendStoredPublish(client);
|
||||
client->holdPingRequest();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((client->isSleep() || client->isAwake())
|
||||
&& client->getClientSleepPacket())
|
||||
{
|
||||
sendStoredPublish(client);
|
||||
client->holdPingRequest();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* send PINGREQ to the broker */
|
||||
client->resetPingRequest();
|
||||
client->resetPingRequest();
|
||||
MQTTGWPacket* pingreq = new MQTTGWPacket();
|
||||
pingreq->setHeader(PINGREQ);
|
||||
Event* evt = new Event();
|
||||
evt->setBrokerSendEvent(client, pingreq);
|
||||
_gateway->getBrokerSendQue()->post(evt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MQTTSNConnectionHandler::sendStoredPublish(Client* client)
|
||||
{
|
||||
MQTTGWPacket* msg = nullptr;
|
||||
|
||||
while ( ( msg = client->getClientSleepPacket() ) != nullptr )
|
||||
while ((msg = client->getClientSleepPacket()) != nullptr)
|
||||
{
|
||||
// ToDo: This version can't re-send PUBLISH when PUBACK is not returned.
|
||||
client->deleteFirstClientSleepPacket(); // pop the que to delete element.
|
||||
client->deleteFirstClientSleepPacket(); // pop the que to delete element.
|
||||
|
||||
Event* ev = new Event();
|
||||
ev->setBrokerRecvEvent(client, msg);
|
||||
|
||||
Reference in New Issue
Block a user