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