mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-16 08:56:51 +01:00
@@ -82,7 +82,7 @@ void MQTTGWPublishHandler::handlePublish(Client* client, MQTTGWPacket* packet)
|
||||
MQTTSN_topicid topicId;
|
||||
uint16_t id = 0;
|
||||
|
||||
if (pub.topiclen == 2)
|
||||
if (pub.topiclen <= 2)
|
||||
{
|
||||
topicId.type = MQTTSN_TOPIC_TYPE_SHORT;
|
||||
*(topicId.data.short_name) = *pub.topic;
|
||||
|
||||
@@ -400,6 +400,7 @@ Client::Client(bool secure)
|
||||
_nextClient = 0;
|
||||
_clientSleepPacketQue.setMaxSize(MAX_SAVED_PUBLISH);
|
||||
_hasPredefTopic = false;
|
||||
_holdPingRequest = false;
|
||||
}
|
||||
|
||||
Client::~Client()
|
||||
@@ -796,6 +797,21 @@ void Client::setOTAClient(Client* cl)
|
||||
_otaClient =cl;
|
||||
}
|
||||
|
||||
void Client::holdPingRequest(void)
|
||||
{
|
||||
_holdPingRequest = true;
|
||||
}
|
||||
|
||||
void Client::resetPingRequest(void)
|
||||
{
|
||||
_holdPingRequest = false;
|
||||
}
|
||||
|
||||
bool Client::isHoldPringReqest(void)
|
||||
{
|
||||
return _holdPingRequest;
|
||||
}
|
||||
|
||||
/*=====================================
|
||||
Class Topic
|
||||
======================================*/
|
||||
@@ -1214,7 +1230,7 @@ TopicIdMapelement* TopicIdMap::getElement(uint16_t msgId)
|
||||
|
||||
TopicIdMapelement* TopicIdMap::add(uint16_t msgId, uint16_t topicId, MQTTSN_topicTypes type)
|
||||
{
|
||||
if ( _cnt > _maxInflight * 2 || topicId == 0)
|
||||
if ( _cnt > _maxInflight * 2 || ( topicId == 0 && type != MQTTSN_TOPIC_TYPE_SHORT ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -1314,6 +1330,7 @@ WaitREGACKPacketList::WaitREGACKPacketList()
|
||||
{
|
||||
_first = 0;
|
||||
_end = 0;
|
||||
_cnt = 0;
|
||||
}
|
||||
|
||||
WaitREGACKPacketList::~WaitREGACKPacketList()
|
||||
@@ -1346,6 +1363,7 @@ int WaitREGACKPacketList::setPacket(MQTTSNPacket* packet, uint16_t REGACKMsgId)
|
||||
elm->_prev = _end;
|
||||
_end = elm;
|
||||
}
|
||||
_cnt++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1387,10 +1405,17 @@ void WaitREGACKPacketList::erase(uint16_t REGACKMsgId)
|
||||
{
|
||||
p->_next->_prev = p->_prev;
|
||||
}
|
||||
break;
|
||||
// Do not delete element. Element is deleted after sending to Client.
|
||||
_cnt--;
|
||||
break;
|
||||
// Do not delete element. Element is deleted after sending to Client.
|
||||
}
|
||||
p = p->_next;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t WaitREGACKPacketList::getCount(void)
|
||||
{
|
||||
return _cnt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -219,8 +219,10 @@ public:
|
||||
int setPacket(MQTTSNPacket* packet, uint16_t REGACKMsgId);
|
||||
MQTTSNPacket* getPacket(uint16_t REGACKMsgId);
|
||||
void erase(uint16_t REGACKMsgId);
|
||||
uint8_t getCount(void);
|
||||
|
||||
private:
|
||||
uint8_t _cnt;
|
||||
waitREGACKPacket* _first;
|
||||
waitREGACKPacket* _end;
|
||||
};
|
||||
@@ -298,6 +300,10 @@ public:
|
||||
bool isSensorNetStable(void);
|
||||
bool isWaitWillMsg(void);
|
||||
|
||||
void holdPingRequest(void);
|
||||
void resetPingRequest(void);
|
||||
bool isHoldPringReqest(void);
|
||||
|
||||
Client* getNextClient(void);
|
||||
Client* getOTAClient(void);
|
||||
void setOTAClient(Client* cl);
|
||||
@@ -317,6 +323,8 @@ private:
|
||||
char* _willTopic;
|
||||
char* _willMsg;
|
||||
|
||||
bool _holdPingRequest;
|
||||
|
||||
Timer _keepAliveTimer;
|
||||
uint32_t _keepAliveMsec;
|
||||
|
||||
|
||||
@@ -270,7 +270,7 @@ void MQTTSNConnectionHandler::handlePingreq(Client* client, MQTTSNPacket* packet
|
||||
{
|
||||
MQTTGWPacket* msg = 0;
|
||||
|
||||
if ( client->isSleep() || client->isAwake() )
|
||||
if ( ( client->isSleep() || client->isAwake() ) && client->getClientSleepPacket() )
|
||||
{
|
||||
while ( ( msg = client->getClientSleepPacket() ) != 0 )
|
||||
{
|
||||
@@ -281,12 +281,16 @@ void MQTTSNConnectionHandler::handlePingreq(Client* client, MQTTSNPacket* packet
|
||||
ev->setBrokerRecvEvent(client, msg);
|
||||
_gateway->getPacketEventQue()->post(ev);
|
||||
}
|
||||
client->holdPingRequest();
|
||||
}
|
||||
else
|
||||
{
|
||||
/* send PINGREQ to the broker */
|
||||
client->resetPingRequest();
|
||||
MQTTGWPacket* pingreq = new MQTTGWPacket();
|
||||
pingreq->setHeader(PINGREQ);
|
||||
Event* evt = new Event();
|
||||
evt->setBrokerSendEvent(client, pingreq);
|
||||
_gateway->getBrokerSendQue()->post(evt);
|
||||
}
|
||||
|
||||
/* send PINGREQ to the broker */
|
||||
MQTTGWPacket* pingreq = new MQTTGWPacket();
|
||||
pingreq->setHeader(PINGREQ);
|
||||
Event* evt = new Event();
|
||||
evt->setBrokerSendEvent(client, pingreq);
|
||||
_gateway->getBrokerSendQue()->post(evt);
|
||||
}
|
||||
|
||||
@@ -198,6 +198,7 @@ void MQTTSNPublishHandler::handleRegAck( Client* client, MQTTSNPacket* packet)
|
||||
}
|
||||
|
||||
MQTTSNPacket* regAck = client->getWaitREGACKPacketList()->getPacket(msgId);
|
||||
|
||||
if ( regAck != 0 )
|
||||
{
|
||||
client->getWaitREGACKPacketList()->erase(msgId);
|
||||
@@ -205,6 +206,16 @@ void MQTTSNPublishHandler::handleRegAck( Client* client, MQTTSNPacket* packet)
|
||||
ev->setClientSendEvent(client, regAck);
|
||||
_gateway->getClientSendQue()->post(ev);
|
||||
}
|
||||
if (client->isHoldPringReqest() && client->getWaitREGACKPacketList()->getCount() == 0 )
|
||||
{
|
||||
/* send PINGREQ to the broker */
|
||||
client->resetPingRequest();
|
||||
MQTTGWPacket* pingreq = new MQTTGWPacket();
|
||||
pingreq->setHeader(PINGREQ);
|
||||
Event* evt = new Event();
|
||||
evt->setBrokerSendEvent(client, pingreq);
|
||||
_gateway->getBrokerSendQue()->post(evt);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user