Signed-off-by: tomoaki <tomoaki@tomy-tech.com>
This commit is contained in:
tomoaki
2016-12-15 11:40:17 +09:00
parent d386541c1a
commit 1a415bfebd
4 changed files with 56 additions and 26 deletions

View File

@@ -131,11 +131,19 @@ void BrokerRecvTask::run(void)
} }
else else
{ {
if ( rc == 0 ) if ( rc == 0 ) // Disconnected
{ {
client->getNetwork()->close(); client->getNetwork()->close();
delete packet; 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) else if (rc == -1)
{ {

View File

@@ -125,30 +125,34 @@ bool ClientList::authorize(const char* fileName)
void ClientList::erase(Client* client) void ClientList::erase(Client* client)
{ {
_mutex.lock(); if ( !_authorize && client->erasable())
Client* prev = client->_prevClient; {
Client* next = client->_nextClient; _mutex.lock();
Client* prev = client->_prevClient;
Client* next = client->_nextClient;
if (prev) if (prev)
{ {
prev->_nextClient = next; prev->_nextClient = next;
} }
else else
{ {
_firstClient = next; _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) Client* ClientList::getClient(SensorNetAddress* addr)
@@ -280,6 +284,8 @@ Client::Client(bool secure)
_sensorNetype = true; _sensorNetype = true;
_connAck = 0; _connAck = 0;
_waitWillMsgFlg = false; _waitWillMsgFlg = false;
_sessionStatus = false;
_otaClient = 0;
_prevClient = 0; _prevClient = 0;
_nextClient = 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) void Client::updateStatus(MQTTSNPacket* packet)
{ {
if (((_status == Cstat_Disconnected) || (_status == Cstat_Lost)) && packet->getType() == MQTTSN_CONNECT) if (((_status == Cstat_Disconnected) || (_status == Cstat_Lost)) && packet->getType() == MQTTSN_CONNECT)

View File

@@ -271,6 +271,8 @@ public:
char* getWillMsg(void); char* getWillMsg(void);
const char* getStatus(void); const char* getStatus(void);
void setWaitWillMsgFlg(bool); void setWaitWillMsgFlg(bool);
void setSessionStatus(bool); // true: clean session
bool erasable(void);
bool isDisconnect(void); bool isDisconnect(void);
bool isActive(void); bool isActive(void);
@@ -312,6 +314,8 @@ private:
bool _sensorNetype; // false: unstable network like a G3 bool _sensorNetype; // false: unstable network like a G3
SensorNetAddress _sensorNetAddr; SensorNetAddress _sensorNetAddr;
bool _sessionStatus;
Client* _nextClient; Client* _nextClient;
Client* _prevClient; Client* _prevClient;
Client* _otaClient; Client* _otaClient;

View File

@@ -55,14 +55,14 @@ void MQTTSNConnectionHandler::handleSearchgw(MQTTSNPacket* packet)
{ {
if (packet->getType() == MQTTSN_SEARCHGW) if (packet->getType() == MQTTSN_SEARCHGW)
{ {
if (_gateway->getClientList()->getClientCount() < MAX_CLIENTS) //if (_gateway->getClientList()->getClientCount() < MAX_CLIENTS)
{ //{
MQTTSNPacket* gwinfo = new MQTTSNPacket(); MQTTSNPacket* gwinfo = new MQTTSNPacket();
gwinfo->setGWINFO(_gateway->getGWParams()->gatewayId); gwinfo->setGWINFO(_gateway->getGWParams()->gatewayId);
Event* ev1 = new Event(); Event* ev1 = new Event();
ev1->setBrodcastEvent(gwinfo); ev1->setBrodcastEvent(gwinfo);
_gateway->getClientSendQue()->post(ev1); _gateway->getClientSendQue()->post(ev1);
} //}
} }
} }
@@ -94,6 +94,7 @@ void MQTTSNConnectionHandler::handleConnect(Client* client, MQTTSNPacket* packet
connectData->flags.bits.username = 1; connectData->flags.bits.username = 1;
} }
client->setSessionStatus(false);
if (data.cleansession) if (data.cleansession)
{ {
connectData->flags.bits.cleanstart = 1; connectData->flags.bits.cleanstart = 1;
@@ -108,6 +109,7 @@ void MQTTSNConnectionHandler::handleConnect(Client* client, MQTTSNPacket* packet
} }
topics = new Topics(); topics = new Topics();
client->setTopics(topics); client->setTopics(topics);
client->setSessionStatus(true);
} }
if (data.willFlag) if (data.willFlag)