mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-13 15:36:51 +01:00
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user