diff --git a/MQTTSNGateway/src/MQTTSNGWBrokerRecvTask.cpp b/MQTTSNGateway/src/MQTTSNGWBrokerRecvTask.cpp index 3b57408..7701af8 100644 --- a/MQTTSNGateway/src/MQTTSNGWBrokerRecvTask.cpp +++ b/MQTTSNGateway/src/MQTTSNGWBrokerRecvTask.cpp @@ -131,11 +131,19 @@ void BrokerRecvTask::run(void) } else { - if ( rc == 0 ) + if ( rc == 0 ) // Disconnected { client->getNetwork()->close(); delete packet; - goto nextClient; + + /* delete client when the client is not authorized on & session is clean */ + _gateway->getClientList()->erase(client); + + if ( client ) + { + client = client->getNextClient(); + } + continue; } else if (rc == -1) { diff --git a/MQTTSNGateway/src/MQTTSNGWClient.cpp b/MQTTSNGateway/src/MQTTSNGWClient.cpp index 136c51b..965e90e 100644 --- a/MQTTSNGateway/src/MQTTSNGWClient.cpp +++ b/MQTTSNGateway/src/MQTTSNGWClient.cpp @@ -125,30 +125,34 @@ bool ClientList::authorize(const char* fileName) void ClientList::erase(Client* client) { - _mutex.lock(); - Client* prev = client->_prevClient; - Client* next = client->_nextClient; + if ( !_authorize && client->erasable()) + { + _mutex.lock(); + Client* prev = client->_prevClient; + Client* next = client->_nextClient; - if (prev) - { - prev->_nextClient = next; - } - else - { - _firstClient = next; + if (prev) + { + prev->_nextClient = next; + } + else + { + _firstClient = next; + } + if (next) + { + next->_prevClient = prev; + } + else + { + _endClient = prev; + } + _clientCnt--; + delete client; + client = 0; + _mutex.unlock(); } - if (next) - { - next->_prevClient = prev; - } - else - { - _endClient = prev; - } - _clientCnt--; - _authorize = false; - _mutex.unlock(); } Client* ClientList::getClient(SensorNetAddress* addr) @@ -280,6 +284,8 @@ Client::Client(bool secure) _sensorNetype = true; _connAck = 0; _waitWillMsgFlg = false; + _sessionStatus = false; + _otaClient = 0; _prevClient = 0; _nextClient = 0; } @@ -389,6 +395,16 @@ void Client::setKeepAlive(MQTTSNPacket* packet) } } +void Client::setSessionStatus(bool status) +{ + _sessionStatus = status; +} + +bool Client::erasable(void) +{ + return _sessionStatus; +} + void Client::updateStatus(MQTTSNPacket* packet) { if (((_status == Cstat_Disconnected) || (_status == Cstat_Lost)) && packet->getType() == MQTTSN_CONNECT) diff --git a/MQTTSNGateway/src/MQTTSNGWClient.h b/MQTTSNGateway/src/MQTTSNGWClient.h index 396ff43..c4012c7 100644 --- a/MQTTSNGateway/src/MQTTSNGWClient.h +++ b/MQTTSNGateway/src/MQTTSNGWClient.h @@ -271,6 +271,8 @@ public: char* getWillMsg(void); const char* getStatus(void); void setWaitWillMsgFlg(bool); + void setSessionStatus(bool); // true: clean session + bool erasable(void); bool isDisconnect(void); bool isActive(void); @@ -312,6 +314,8 @@ private: bool _sensorNetype; // false: unstable network like a G3 SensorNetAddress _sensorNetAddr; + bool _sessionStatus; + Client* _nextClient; Client* _prevClient; Client* _otaClient; diff --git a/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp b/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp index 5ef17b1..3998e46 100644 --- a/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp +++ b/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp @@ -55,14 +55,14 @@ void MQTTSNConnectionHandler::handleSearchgw(MQTTSNPacket* packet) { if (packet->getType() == MQTTSN_SEARCHGW) { - if (_gateway->getClientList()->getClientCount() < MAX_CLIENTS) - { + //if (_gateway->getClientList()->getClientCount() < MAX_CLIENTS) + //{ MQTTSNPacket* gwinfo = new MQTTSNPacket(); gwinfo->setGWINFO(_gateway->getGWParams()->gatewayId); Event* ev1 = new Event(); ev1->setBrodcastEvent(gwinfo); _gateway->getClientSendQue()->post(ev1); - } + //} } } @@ -94,6 +94,7 @@ void MQTTSNConnectionHandler::handleConnect(Client* client, MQTTSNPacket* packet connectData->flags.bits.username = 1; } + client->setSessionStatus(false); if (data.cleansession) { connectData->flags.bits.cleanstart = 1; @@ -108,6 +109,7 @@ void MQTTSNConnectionHandler::handleConnect(Client* client, MQTTSNPacket* packet } topics = new Topics(); client->setTopics(topics); + client->setSessionStatus(true); } if (data.willFlag)