mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-16 08:56:51 +01:00
@@ -28,104 +28,107 @@
|
||||
using namespace MQTTSNGW;
|
||||
char* currentDateTime(void);
|
||||
|
||||
|
||||
/*=====================================
|
||||
Class Client
|
||||
=====================================*/
|
||||
static const char* theClientStatus[] = { "Disconnected", "TryConnecting", "Connecting", "Active", "Asleep", "Awake", "Lost" };
|
||||
static const char* theClientStatus[] =
|
||||
{ "Disconnected", "TryConnecting", "Connecting", "Active", "Asleep", "Awake",
|
||||
"Lost" };
|
||||
|
||||
Client::Client(bool secure)
|
||||
{
|
||||
_packetId = 0;
|
||||
_snMsgId = 0;
|
||||
_status = Cstat_Disconnected;
|
||||
_keepAliveMsec = 0;
|
||||
_topics = new Topics();
|
||||
_clientId = nullptr;
|
||||
_willTopic = nullptr;
|
||||
_willMsg = nullptr;
|
||||
_connectData = MQTTPacket_Connect_Initializer;
|
||||
_network = new Network(secure);
|
||||
_secureNetwork = secure;
|
||||
_sensorNetype = true;
|
||||
_connAck = nullptr;
|
||||
_waitWillMsgFlg = false;
|
||||
_sessionStatus = false;
|
||||
_prevClient = nullptr;
|
||||
_nextClient = nullptr;
|
||||
_clientSleepPacketQue.setMaxSize(MAX_SAVED_PUBLISH);
|
||||
_proxyPacketQue.setMaxSize(MAX_SAVED_PUBLISH);
|
||||
_hasPredefTopic = false;
|
||||
_holdPingRequest = false;
|
||||
_forwarder = nullptr;
|
||||
_clientType = Ctype_Regular;
|
||||
_packetId = 0;
|
||||
_snMsgId = 0;
|
||||
_status = Cstat_Disconnected;
|
||||
_keepAliveMsec = 0;
|
||||
_topics = new Topics();
|
||||
_clientId = nullptr;
|
||||
_willTopic = nullptr;
|
||||
_willMsg = nullptr;
|
||||
_connectData = MQTTPacket_Connect_Initializer;
|
||||
_network = new Network(secure);
|
||||
_secureNetwork = secure;
|
||||
_sensorNetype = true;
|
||||
_connAck = nullptr;
|
||||
_waitWillMsgFlg = false;
|
||||
_sessionStatus = false;
|
||||
_prevClient = nullptr;
|
||||
_nextClient = nullptr;
|
||||
_clientSleepPacketQue.setMaxSize(MAX_SAVED_PUBLISH);
|
||||
_proxyPacketQue.setMaxSize(MAX_SAVED_PUBLISH);
|
||||
_hasPredefTopic = false;
|
||||
_holdPingRequest = false;
|
||||
_forwarder = nullptr;
|
||||
_clientType = Ctype_Regular;
|
||||
}
|
||||
|
||||
Client::~Client()
|
||||
{
|
||||
if ( _topics )
|
||||
{
|
||||
delete _topics;
|
||||
}
|
||||
if (_topics)
|
||||
{
|
||||
delete _topics;
|
||||
}
|
||||
|
||||
if ( _clientId )
|
||||
{
|
||||
free(_clientId);
|
||||
}
|
||||
if (_clientId)
|
||||
{
|
||||
free(_clientId);
|
||||
}
|
||||
|
||||
if ( _willTopic )
|
||||
{
|
||||
free(_willTopic);
|
||||
}
|
||||
if (_willTopic)
|
||||
{
|
||||
free(_willTopic);
|
||||
}
|
||||
|
||||
if ( _willMsg )
|
||||
{
|
||||
free(_willMsg);
|
||||
}
|
||||
if (_willMsg)
|
||||
{
|
||||
free(_willMsg);
|
||||
}
|
||||
|
||||
if (_connAck)
|
||||
{
|
||||
delete _connAck;
|
||||
}
|
||||
if (_connAck)
|
||||
{
|
||||
delete _connAck;
|
||||
}
|
||||
|
||||
if (_network)
|
||||
{
|
||||
delete _network;
|
||||
}
|
||||
if (_network)
|
||||
{
|
||||
delete _network;
|
||||
}
|
||||
}
|
||||
|
||||
TopicIdMapElement* Client::getWaitedPubTopicId(uint16_t msgId)
|
||||
{
|
||||
return _waitedPubTopicIdMap.getElement(msgId);
|
||||
return _waitedPubTopicIdMap.getElement(msgId);
|
||||
}
|
||||
|
||||
TopicIdMapElement* Client::getWaitedSubTopicId(uint16_t msgId)
|
||||
{
|
||||
return _waitedSubTopicIdMap.getElement(msgId);
|
||||
return _waitedSubTopicIdMap.getElement(msgId);
|
||||
}
|
||||
|
||||
MQTTGWPacket* Client::getClientSleepPacket()
|
||||
{
|
||||
return _clientSleepPacketQue.getPacket();
|
||||
return _clientSleepPacketQue.getPacket();
|
||||
}
|
||||
|
||||
void Client::deleteFirstClientSleepPacket()
|
||||
{
|
||||
_clientSleepPacketQue.pop();
|
||||
_clientSleepPacketQue.pop();
|
||||
}
|
||||
|
||||
int Client::setClientSleepPacket(MQTTGWPacket* packet)
|
||||
{
|
||||
int rc = _clientSleepPacketQue.post(packet);
|
||||
if ( rc )
|
||||
{
|
||||
WRITELOG("%s %s is sleeping. the packet was saved.\n", currentDateTime(), _clientId);
|
||||
}
|
||||
else
|
||||
{
|
||||
WRITELOG("%s %s is sleeping but discard the packet.\n", currentDateTime(), _clientId);
|
||||
}
|
||||
return rc;
|
||||
int rc = _clientSleepPacketQue.post(packet);
|
||||
if (rc)
|
||||
{
|
||||
WRITELOG("%s %s is sleeping. the packet was saved.\n",
|
||||
currentDateTime(), _clientId);
|
||||
}
|
||||
else
|
||||
{
|
||||
WRITELOG("%s %s is sleeping but discard the packet.\n",
|
||||
currentDateTime(), _clientId);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
MQTTSNPacket* Client::getProxyPacket(void)
|
||||
@@ -141,64 +144,68 @@ void Client::deleteFirstProxyPacket()
|
||||
int Client::setProxyPacket(MQTTSNPacket* packet)
|
||||
{
|
||||
int rc = _proxyPacketQue.post(packet);
|
||||
if ( rc )
|
||||
if (rc)
|
||||
{
|
||||
WRITELOG("%s %s is Disconnected. the packet was saved.\n", currentDateTime(), _clientId);
|
||||
WRITELOG("%s %s is Disconnected. the packet was saved.\n",
|
||||
currentDateTime(), _clientId);
|
||||
}
|
||||
else
|
||||
{
|
||||
WRITELOG("%s %s is Disconnected and discard the packet.\n", currentDateTime(), _clientId);
|
||||
WRITELOG("%s %s is Disconnected and discard the packet.\n",
|
||||
currentDateTime(), _clientId);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
Connect* Client::getConnectData(void)
|
||||
{
|
||||
return &_connectData;
|
||||
return &_connectData;
|
||||
}
|
||||
|
||||
void Client::eraseWaitedPubTopicId(uint16_t msgId)
|
||||
{
|
||||
_waitedPubTopicIdMap.erase(msgId);
|
||||
_waitedPubTopicIdMap.erase(msgId);
|
||||
}
|
||||
|
||||
void Client::eraseWaitedSubTopicId(uint16_t msgId)
|
||||
{
|
||||
_waitedSubTopicIdMap.erase(msgId);
|
||||
_waitedSubTopicIdMap.erase(msgId);
|
||||
}
|
||||
|
||||
void Client::clearWaitedPubTopicId(void)
|
||||
{
|
||||
_waitedPubTopicIdMap.clear();
|
||||
_waitedPubTopicIdMap.clear();
|
||||
}
|
||||
|
||||
void Client::clearWaitedSubTopicId(void)
|
||||
{
|
||||
_waitedSubTopicIdMap.clear();
|
||||
_waitedSubTopicIdMap.clear();
|
||||
}
|
||||
|
||||
void Client::setWaitedPubTopicId(uint16_t msgId, uint16_t topicId, MQTTSN_topicTypes type)
|
||||
void Client::setWaitedPubTopicId(uint16_t msgId, uint16_t topicId,
|
||||
MQTTSN_topicTypes type)
|
||||
{
|
||||
_waitedPubTopicIdMap.add(msgId, topicId, type);
|
||||
_waitedPubTopicIdMap.add(msgId, topicId, type);
|
||||
}
|
||||
void Client::setWaitedSubTopicId(uint16_t msgId, uint16_t topicId, MQTTSN_topicTypes type)
|
||||
void Client::setWaitedSubTopicId(uint16_t msgId, uint16_t topicId,
|
||||
MQTTSN_topicTypes type)
|
||||
{
|
||||
_waitedSubTopicIdMap.add(msgId, topicId, type);
|
||||
_waitedSubTopicIdMap.add(msgId, topicId, type);
|
||||
}
|
||||
|
||||
bool Client::checkTimeover(void)
|
||||
{
|
||||
return (_status == Cstat_Active && _keepAliveTimer.isTimeup());
|
||||
return (_status == Cstat_Active && _keepAliveTimer.isTimeup());
|
||||
}
|
||||
|
||||
void Client::setKeepAlive(MQTTSNPacket* packet)
|
||||
{
|
||||
MQTTSNPacket_connectData param;
|
||||
if (packet->getCONNECT(¶m))
|
||||
{
|
||||
_keepAliveMsec = param.duration * 1000UL;
|
||||
_keepAliveTimer.start(_keepAliveMsec * 1.5);
|
||||
}
|
||||
MQTTSNPacket_connectData param;
|
||||
if (packet->getCONNECT(¶m))
|
||||
{
|
||||
_keepAliveMsec = param.duration * 1000UL;
|
||||
_keepAliveTimer.start(_keepAliveMsec * 1.5);
|
||||
}
|
||||
}
|
||||
|
||||
void Client::setForwarder(Forwarder* forwarder)
|
||||
@@ -214,102 +221,102 @@ Forwarder* Client::getForwarder(void)
|
||||
|
||||
void Client::setSessionStatus(bool status)
|
||||
{
|
||||
_sessionStatus = status;
|
||||
_sessionStatus = status;
|
||||
}
|
||||
|
||||
bool Client::erasable(void)
|
||||
{
|
||||
return _sessionStatus && !_hasPredefTopic && _forwarder == nullptr;
|
||||
return _sessionStatus && !_hasPredefTopic && _forwarder == nullptr;
|
||||
}
|
||||
|
||||
void Client::updateStatus(MQTTSNPacket* packet)
|
||||
{
|
||||
if (((_status == Cstat_Disconnected) || (_status == Cstat_Lost)) && packet->getType() == MQTTSN_CONNECT)
|
||||
{
|
||||
setKeepAlive(packet);
|
||||
}
|
||||
else if (_status == Cstat_Active)
|
||||
{
|
||||
switch (packet->getType())
|
||||
{
|
||||
case MQTTSN_PINGREQ:
|
||||
case MQTTSN_PUBLISH:
|
||||
case MQTTSN_SUBSCRIBE:
|
||||
case MQTTSN_UNSUBSCRIBE:
|
||||
case MQTTSN_PUBACK:
|
||||
case MQTTSN_PUBCOMP:
|
||||
case MQTTSN_PUBREL:
|
||||
case MQTTSN_PUBREC:
|
||||
if ( _clientType != Ctype_Proxy )
|
||||
{
|
||||
_keepAliveTimer.start(_keepAliveMsec * 1.5);
|
||||
}
|
||||
break;
|
||||
case MQTTSN_DISCONNECT:
|
||||
uint16_t duration;
|
||||
packet->getDISCONNECT(&duration);
|
||||
if (duration)
|
||||
{
|
||||
_status = Cstat_Asleep;
|
||||
}
|
||||
else
|
||||
{
|
||||
disconnected();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (_status == Cstat_Awake || _status == Cstat_Asleep)
|
||||
{
|
||||
switch (packet->getType())
|
||||
{
|
||||
case MQTTSN_CONNECT:
|
||||
_status = Cstat_Active;
|
||||
break;
|
||||
case MQTTSN_DISCONNECT:
|
||||
disconnected();
|
||||
break;
|
||||
case MQTTSN_PINGREQ:
|
||||
_status = Cstat_Awake;
|
||||
break;
|
||||
case MQTTSN_PINGRESP:
|
||||
_status = Cstat_Asleep;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
DEBUGLOG("Client Status = %s\n", theClientStatus[_status]);
|
||||
if (((_status == Cstat_Disconnected) || (_status == Cstat_Lost))
|
||||
&& packet->getType() == MQTTSN_CONNECT)
|
||||
{
|
||||
setKeepAlive(packet);
|
||||
}
|
||||
else if (_status == Cstat_Active)
|
||||
{
|
||||
switch (packet->getType())
|
||||
{
|
||||
case MQTTSN_PINGREQ:
|
||||
case MQTTSN_PUBLISH:
|
||||
case MQTTSN_SUBSCRIBE:
|
||||
case MQTTSN_UNSUBSCRIBE:
|
||||
case MQTTSN_PUBACK:
|
||||
case MQTTSN_PUBCOMP:
|
||||
case MQTTSN_PUBREL:
|
||||
case MQTTSN_PUBREC:
|
||||
if (_clientType != Ctype_Proxy)
|
||||
{
|
||||
_keepAliveTimer.start(_keepAliveMsec * 1.5);
|
||||
}
|
||||
break;
|
||||
case MQTTSN_DISCONNECT:
|
||||
uint16_t duration;
|
||||
packet->getDISCONNECT(&duration);
|
||||
if (duration)
|
||||
{
|
||||
_status = Cstat_Asleep;
|
||||
}
|
||||
else
|
||||
{
|
||||
disconnected();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (_status == Cstat_Awake || _status == Cstat_Asleep)
|
||||
{
|
||||
switch (packet->getType())
|
||||
{
|
||||
case MQTTSN_CONNECT:
|
||||
_status = Cstat_Active;
|
||||
break;
|
||||
case MQTTSN_DISCONNECT:
|
||||
disconnected();
|
||||
break;
|
||||
case MQTTSN_PINGREQ:
|
||||
_status = Cstat_Awake;
|
||||
break;
|
||||
case MQTTSN_PINGRESP:
|
||||
_status = Cstat_Asleep;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
} DEBUGLOG("Client Status = %s\n", theClientStatus[_status]);
|
||||
}
|
||||
|
||||
void Client::updateStatus(ClientStatus stat)
|
||||
{
|
||||
_status = stat;
|
||||
_status = stat;
|
||||
}
|
||||
|
||||
void Client::connectSended()
|
||||
{
|
||||
_status = Cstat_Connecting;
|
||||
_status = Cstat_Connecting;
|
||||
}
|
||||
|
||||
void Client::connackSended(int rc)
|
||||
{
|
||||
if (rc == MQTTSN_RC_ACCEPTED)
|
||||
{
|
||||
_status = Cstat_Active;
|
||||
}
|
||||
else
|
||||
{
|
||||
disconnected();
|
||||
}
|
||||
if (rc == MQTTSN_RC_ACCEPTED)
|
||||
{
|
||||
_status = Cstat_Active;
|
||||
}
|
||||
else
|
||||
{
|
||||
disconnected();
|
||||
}
|
||||
}
|
||||
|
||||
void Client::disconnected(void)
|
||||
{
|
||||
_status = Cstat_Disconnected;
|
||||
_waitWillMsgFlg = false;
|
||||
_status = Cstat_Disconnected;
|
||||
_waitWillMsgFlg = false;
|
||||
}
|
||||
|
||||
void Client::tryConnect(void)
|
||||
@@ -319,64 +326,64 @@ void Client::tryConnect(void)
|
||||
|
||||
bool Client::isConnectSendable(void)
|
||||
{
|
||||
if ( _status == Cstat_Lost || _status == Cstat_TryConnecting )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
if (_status == Cstat_Lost || _status == Cstat_TryConnecting)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
uint16_t Client::getNextPacketId(void)
|
||||
{
|
||||
_packetId++;
|
||||
if ( _packetId == 0xffff )
|
||||
{
|
||||
_packetId = 1;
|
||||
}
|
||||
return _packetId;
|
||||
_packetId++;
|
||||
if (_packetId == 0xffff)
|
||||
{
|
||||
_packetId = 1;
|
||||
}
|
||||
return _packetId;
|
||||
}
|
||||
|
||||
uint8_t Client::getNextSnMsgId(void)
|
||||
{
|
||||
_snMsgId++;
|
||||
if (_snMsgId == 0)
|
||||
{
|
||||
_snMsgId++;
|
||||
}
|
||||
return _snMsgId;
|
||||
_snMsgId++;
|
||||
if (_snMsgId == 0)
|
||||
{
|
||||
_snMsgId++;
|
||||
}
|
||||
return _snMsgId;
|
||||
}
|
||||
|
||||
Topics* Client::getTopics(void)
|
||||
{
|
||||
return _topics;
|
||||
return _topics;
|
||||
}
|
||||
|
||||
Network* Client::getNetwork(void)
|
||||
{
|
||||
return _network;
|
||||
return _network;
|
||||
}
|
||||
|
||||
void Client::setClientAddress(SensorNetAddress* sensorNetAddr)
|
||||
{
|
||||
_sensorNetAddr = *sensorNetAddr;
|
||||
_sensorNetAddr = *sensorNetAddr;
|
||||
}
|
||||
|
||||
SensorNetAddress* Client::getSensorNetAddress(void)
|
||||
{
|
||||
return &_sensorNetAddr;
|
||||
return &_sensorNetAddr;
|
||||
}
|
||||
|
||||
void Client::setSensorNetType(bool stable)
|
||||
{
|
||||
_sensorNetype = stable;
|
||||
_sensorNetype = stable;
|
||||
}
|
||||
|
||||
void Client::setTopics(Topics* topics)
|
||||
{
|
||||
_topics = topics;
|
||||
_topics = topics;
|
||||
}
|
||||
|
||||
ClientStatus Client::getClientStatus(void)
|
||||
@@ -386,32 +393,32 @@ ClientStatus Client::getClientStatus(void)
|
||||
|
||||
void Client::setWaitWillMsgFlg(bool flg)
|
||||
{
|
||||
_waitWillMsgFlg = flg;
|
||||
_waitWillMsgFlg = flg;
|
||||
}
|
||||
|
||||
bool Client::isWaitWillMsg(void)
|
||||
{
|
||||
return _waitWillMsgFlg;
|
||||
return _waitWillMsgFlg;
|
||||
}
|
||||
|
||||
bool Client::isDisconnect(void)
|
||||
{
|
||||
return (_status == Cstat_Disconnected);
|
||||
return (_status == Cstat_Disconnected);
|
||||
}
|
||||
|
||||
bool Client::isActive(void)
|
||||
{
|
||||
return (_status == Cstat_Active);
|
||||
return (_status == Cstat_Active);
|
||||
}
|
||||
|
||||
bool Client::isSleep(void)
|
||||
{
|
||||
return (_status == Cstat_Asleep);
|
||||
return (_status == Cstat_Asleep);
|
||||
}
|
||||
|
||||
bool Client::isAwake(void)
|
||||
{
|
||||
return (_status == Cstat_Awake);
|
||||
return (_status == Cstat_Awake);
|
||||
}
|
||||
|
||||
bool Client::isConnecting(void)
|
||||
@@ -421,94 +428,94 @@ bool Client::isConnecting(void)
|
||||
|
||||
bool Client::isSecureNetwork(void)
|
||||
{
|
||||
return _secureNetwork;
|
||||
return _secureNetwork;
|
||||
}
|
||||
|
||||
bool Client::isSensorNetStable(void)
|
||||
{
|
||||
return _sensorNetype;
|
||||
return _sensorNetype;
|
||||
}
|
||||
|
||||
WaitREGACKPacketList* Client::getWaitREGACKPacketList()
|
||||
{
|
||||
return &_waitREGACKList;
|
||||
return &_waitREGACKList;
|
||||
}
|
||||
|
||||
Client* Client::getNextClient(void)
|
||||
{
|
||||
return _nextClient;
|
||||
return _nextClient;
|
||||
}
|
||||
|
||||
void Client::setClientId(MQTTSNString id)
|
||||
{
|
||||
if ( _clientId )
|
||||
{
|
||||
free(_clientId);
|
||||
}
|
||||
if (_clientId)
|
||||
{
|
||||
free(_clientId);
|
||||
}
|
||||
|
||||
if ( id.cstring )
|
||||
{
|
||||
_clientId = (char*)calloc(strlen(id.cstring) + 1, 1);
|
||||
memcpy(_clientId, id.cstring, strlen(id.cstring));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (id.cstring)
|
||||
{
|
||||
_clientId = (char*) calloc(strlen(id.cstring) + 1, 1);
|
||||
memcpy(_clientId, id.cstring, strlen(id.cstring));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* save clientId into (char*)_clientId NULL terminated */
|
||||
_clientId = (char*)calloc(MQTTSNstrlen(id) + 1, 1);
|
||||
unsigned char* ptr = (unsigned char*)_clientId;
|
||||
writeMQTTSNString((unsigned char**)&ptr, id);
|
||||
}
|
||||
_clientId = (char*) calloc(MQTTSNstrlen(id) + 1, 1);
|
||||
unsigned char* ptr = (unsigned char*) _clientId;
|
||||
writeMQTTSNString((unsigned char**) &ptr, id);
|
||||
}
|
||||
}
|
||||
|
||||
void Client::setWillTopic(MQTTSNString willTopic)
|
||||
{
|
||||
if ( _willTopic )
|
||||
{
|
||||
free(_willTopic);
|
||||
}
|
||||
if (_willTopic)
|
||||
{
|
||||
free(_willTopic);
|
||||
}
|
||||
|
||||
_willTopic = (char*)calloc(MQTTSNstrlen(willTopic) + 1, 1);
|
||||
/* save willTopic into (char*)_willTopic with NULL termination */
|
||||
unsigned char* ptr = (unsigned char*)_willTopic;
|
||||
writeMQTTSNString((unsigned char**)&ptr, willTopic);
|
||||
_willTopic = (char*) calloc(MQTTSNstrlen(willTopic) + 1, 1);
|
||||
/* save willTopic into (char*)_willTopic with NULL termination */
|
||||
unsigned char* ptr = (unsigned char*) _willTopic;
|
||||
writeMQTTSNString((unsigned char**) &ptr, willTopic);
|
||||
}
|
||||
|
||||
void Client::setWillMsg(MQTTSNString willMsg)
|
||||
{
|
||||
if ( _willMsg)
|
||||
{
|
||||
free(_willMsg);
|
||||
}
|
||||
if (_willMsg)
|
||||
{
|
||||
free(_willMsg);
|
||||
}
|
||||
|
||||
_willMsg = (char*)calloc(MQTTSNstrlen(willMsg) + 1, 1);
|
||||
/* save willMsg into (char*)_willMsg with NULL termination */
|
||||
unsigned char* ptr = (unsigned char*)_willMsg;
|
||||
writeMQTTSNString((unsigned char**)&ptr, willMsg);
|
||||
_willMsg = (char*) calloc(MQTTSNstrlen(willMsg) + 1, 1);
|
||||
/* save willMsg into (char*)_willMsg with NULL termination */
|
||||
unsigned char* ptr = (unsigned char*) _willMsg;
|
||||
writeMQTTSNString((unsigned char**) &ptr, willMsg);
|
||||
}
|
||||
|
||||
char* Client::getClientId(void)
|
||||
{
|
||||
return _clientId;
|
||||
return _clientId;
|
||||
}
|
||||
|
||||
char* Client::getWillTopic(void)
|
||||
{
|
||||
return _willTopic;
|
||||
return _willTopic;
|
||||
}
|
||||
|
||||
char* Client::getWillMsg(void)
|
||||
{
|
||||
return _willMsg;
|
||||
return _willMsg;
|
||||
}
|
||||
|
||||
const char* Client::getStatus(void)
|
||||
{
|
||||
return theClientStatus[_status];
|
||||
return theClientStatus[_status];
|
||||
}
|
||||
|
||||
bool Client::isQoSm1Proxy(void)
|
||||
{
|
||||
return _clientType == Ctype_Proxy;
|
||||
return _clientType == Ctype_Proxy;
|
||||
}
|
||||
|
||||
bool Client::isForwarded(void)
|
||||
@@ -528,23 +535,23 @@ bool Client::isAggregater(void)
|
||||
|
||||
void Client::setAdapterType(AdapterType type)
|
||||
{
|
||||
switch ( type )
|
||||
switch (type)
|
||||
{
|
||||
case Atype_QoSm1Proxy:
|
||||
_clientType = Ctype_Proxy;
|
||||
break;
|
||||
_clientType = Ctype_Proxy;
|
||||
break;
|
||||
case Atype_Aggregater:
|
||||
_clientType = Ctype_Aggregater;
|
||||
break;
|
||||
_clientType = Ctype_Aggregater;
|
||||
break;
|
||||
default:
|
||||
throw Exception("Client::setAdapterType(): Invalid Type.");
|
||||
break;
|
||||
throw Exception("Client::setAdapterType(): Invalid Type.");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool Client::isAdapter(void)
|
||||
{
|
||||
return _clientType == Ctype_Proxy || _clientType == Ctype_Aggregater;
|
||||
return _clientType == Ctype_Proxy || _clientType == Ctype_Aggregater;
|
||||
}
|
||||
|
||||
bool Client::isQoSm1(void)
|
||||
@@ -554,12 +561,12 @@ bool Client::isQoSm1(void)
|
||||
|
||||
void Client::setQoSm1(void)
|
||||
{
|
||||
_clientType = Ctype_QoS_1;
|
||||
_clientType = Ctype_QoS_1;
|
||||
}
|
||||
|
||||
void Client::setAggregated(void)
|
||||
{
|
||||
_clientType = Ctype_Aggregated;
|
||||
_clientType = Ctype_Aggregated;
|
||||
}
|
||||
|
||||
void Client::holdPingRequest(void)
|
||||
@@ -577,22 +584,20 @@ bool Client::isHoldPingReqest(void)
|
||||
return _holdPingRequest;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*=====================================
|
||||
Class WaitREGACKPacket
|
||||
=====================================*/
|
||||
waitREGACKPacket::waitREGACKPacket(MQTTSNPacket* packet, uint16_t REGACKMsgId)
|
||||
{
|
||||
_packet = packet;
|
||||
_msgId = REGACKMsgId;
|
||||
_next = nullptr;
|
||||
_prev = nullptr;
|
||||
_packet = packet;
|
||||
_msgId = REGACKMsgId;
|
||||
_next = nullptr;
|
||||
_prev = nullptr;
|
||||
}
|
||||
|
||||
waitREGACKPacket::~waitREGACKPacket()
|
||||
{
|
||||
delete _packet;
|
||||
delete _packet;
|
||||
}
|
||||
|
||||
/*=====================================
|
||||
@@ -601,89 +606,89 @@ waitREGACKPacket::~waitREGACKPacket()
|
||||
|
||||
WaitREGACKPacketList::WaitREGACKPacketList()
|
||||
{
|
||||
_first = nullptr;
|
||||
_end = nullptr;
|
||||
_cnt = 0;
|
||||
_first = nullptr;
|
||||
_end = nullptr;
|
||||
_cnt = 0;
|
||||
}
|
||||
|
||||
WaitREGACKPacketList::~WaitREGACKPacketList()
|
||||
{
|
||||
waitREGACKPacket* p = _first;
|
||||
while (p)
|
||||
{
|
||||
waitREGACKPacket* q = p->_next;
|
||||
delete p;
|
||||
p = q;
|
||||
}
|
||||
waitREGACKPacket* p = _first;
|
||||
while (p)
|
||||
{
|
||||
waitREGACKPacket* q = p->_next;
|
||||
delete p;
|
||||
p = q;
|
||||
}
|
||||
}
|
||||
|
||||
int WaitREGACKPacketList::setPacket(MQTTSNPacket* packet, uint16_t REGACKMsgId)
|
||||
{
|
||||
waitREGACKPacket* elm = new waitREGACKPacket(packet, REGACKMsgId);
|
||||
if (elm == nullptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
waitREGACKPacket* elm = new waitREGACKPacket(packet, REGACKMsgId);
|
||||
if (elm == nullptr)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_first == nullptr)
|
||||
{
|
||||
_first = elm;
|
||||
_end = elm;
|
||||
}
|
||||
else
|
||||
{
|
||||
_end->_next = elm;
|
||||
elm->_prev = _end;
|
||||
_end = elm;
|
||||
}
|
||||
_cnt++;
|
||||
return 1;
|
||||
if (_first == nullptr)
|
||||
{
|
||||
_first = elm;
|
||||
_end = elm;
|
||||
}
|
||||
else
|
||||
{
|
||||
_end->_next = elm;
|
||||
elm->_prev = _end;
|
||||
_end = elm;
|
||||
}
|
||||
_cnt++;
|
||||
return 1;
|
||||
}
|
||||
|
||||
MQTTSNPacket* WaitREGACKPacketList::getPacket(uint16_t REGACKMsgId)
|
||||
{
|
||||
waitREGACKPacket* p = _first;
|
||||
while (p)
|
||||
{
|
||||
if (p->_msgId == REGACKMsgId)
|
||||
{
|
||||
return p->_packet;
|
||||
}
|
||||
p = p->_next;
|
||||
}
|
||||
return nullptr;
|
||||
waitREGACKPacket* p = _first;
|
||||
while (p)
|
||||
{
|
||||
if (p->_msgId == REGACKMsgId)
|
||||
{
|
||||
return p->_packet;
|
||||
}
|
||||
p = p->_next;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void WaitREGACKPacketList::erase(uint16_t REGACKMsgId)
|
||||
{
|
||||
waitREGACKPacket* p = _first;
|
||||
while (p)
|
||||
{
|
||||
if (p->_msgId == REGACKMsgId)
|
||||
{
|
||||
if (p->_prev == nullptr)
|
||||
{
|
||||
_first = p->_next;
|
||||
waitREGACKPacket* p = _first;
|
||||
while (p)
|
||||
{
|
||||
if (p->_msgId == REGACKMsgId)
|
||||
{
|
||||
if (p->_prev == nullptr)
|
||||
{
|
||||
_first = p->_next;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
p->_prev->_next = p->_next;
|
||||
}
|
||||
if (p->_next == nullptr)
|
||||
{
|
||||
_end = p->_prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
p->_next->_prev = p->_prev;
|
||||
}
|
||||
_cnt--;
|
||||
}
|
||||
else
|
||||
{
|
||||
p->_prev->_next = p->_next;
|
||||
}
|
||||
if (p->_next == nullptr)
|
||||
{
|
||||
_end = p->_prev;
|
||||
}
|
||||
else
|
||||
{
|
||||
p->_next->_prev = p->_prev;
|
||||
}
|
||||
_cnt--;
|
||||
break;
|
||||
// Do not delete element. Element is deleted after sending to Client.
|
||||
}
|
||||
p = p->_next;
|
||||
}
|
||||
}
|
||||
p = p->_next;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t WaitREGACKPacketList::getCount(void)
|
||||
@@ -691,4 +696,3 @@ uint8_t WaitREGACKPacketList::getCount(void)
|
||||
return _cnt;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user