mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-15 16:36:52 +01:00
@@ -29,9 +29,9 @@ char* currentDateTime(void);
|
||||
=====================================*/
|
||||
ClientRecvTask::ClientRecvTask(Gateway* gateway)
|
||||
{
|
||||
_gateway = gateway;
|
||||
_gateway->attach((Thread*)this);
|
||||
_sensorNetwork = _gateway->getSensorNetwork();
|
||||
_gateway = gateway;
|
||||
_gateway->attach((Thread*) this);
|
||||
_sensorNetwork = _gateway->getSensorNetwork();
|
||||
}
|
||||
|
||||
ClientRecvTask::~ClientRecvTask()
|
||||
@@ -44,10 +44,10 @@ ClientRecvTask::~ClientRecvTask()
|
||||
*/
|
||||
void ClientRecvTask::initialize(int argc, char** argv)
|
||||
{
|
||||
if ( _sensorNetwork->initialize() < 0 )
|
||||
{
|
||||
throw Exception(" Can't open the sensor network.\n");
|
||||
}
|
||||
if (_sensorNetwork->initialize() < 0)
|
||||
{
|
||||
throw Exception(" Can't open the sensor network.\n");
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -57,214 +57,237 @@ void ClientRecvTask::initialize(int argc, char** argv)
|
||||
*/
|
||||
void ClientRecvTask::run()
|
||||
{
|
||||
Event* ev = nullptr;
|
||||
AdapterManager* adpMgr = _gateway->getAdapterManager();
|
||||
QoSm1Proxy* qosm1Proxy = adpMgr->getQoSm1Proxy();
|
||||
int clientType = adpMgr->isAggregaterActive() ? AGGREGATER_TYPE : TRANSPEARENT_TYPE;
|
||||
ClientList* clientList = _gateway->getClientList();
|
||||
EventQue* packetEventQue = _gateway->getPacketEventQue();
|
||||
Event* ev = nullptr;
|
||||
AdapterManager* adpMgr = _gateway->getAdapterManager();
|
||||
QoSm1Proxy* qosm1Proxy = adpMgr->getQoSm1Proxy();
|
||||
int clientType =
|
||||
adpMgr->isAggregaterActive() ? AGGREGATER_TYPE : TRANSPEARENT_TYPE;
|
||||
ClientList* clientList = _gateway->getClientList();
|
||||
EventQue* packetEventQue = _gateway->getPacketEventQue();
|
||||
|
||||
char buf[128];
|
||||
char buf[128];
|
||||
|
||||
while (true)
|
||||
{
|
||||
Client* client = nullptr;
|
||||
Forwarder* fwd = nullptr;
|
||||
WirelessNodeId nodeId;
|
||||
while (true)
|
||||
{
|
||||
Client* client = nullptr;
|
||||
Forwarder* fwd = nullptr;
|
||||
WirelessNodeId nodeId;
|
||||
|
||||
MQTTSNPacket* packet = new MQTTSNPacket();
|
||||
int packetLen = packet->recv(_sensorNetwork);
|
||||
MQTTSNPacket* packet = new MQTTSNPacket();
|
||||
int packetLen = packet->recv(_sensorNetwork);
|
||||
|
||||
if (CHK_SIGINT)
|
||||
{
|
||||
WRITELOG("\n%s ClientRecvTask stopped.", currentDateTime());
|
||||
delete packet;
|
||||
return;
|
||||
}
|
||||
if (CHK_SIGINT)
|
||||
{
|
||||
WRITELOG("\n%s ClientRecvTask stopped.", currentDateTime());
|
||||
delete packet;
|
||||
return;
|
||||
}
|
||||
|
||||
if (packetLen < 2 )
|
||||
{
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
if (packetLen < 2)
|
||||
{
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( packet->getType() <= MQTTSN_ADVERTISE || packet->getType() == MQTTSN_GWINFO )
|
||||
{
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
if (packet->getType() <= MQTTSN_ADVERTISE
|
||||
|| packet->getType() == MQTTSN_GWINFO)
|
||||
{
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( packet->getType() == MQTTSN_SEARCHGW )
|
||||
{
|
||||
/* write log and post Event */
|
||||
log(0, packet, 0);
|
||||
ev = new Event();
|
||||
ev->setBrodcastEvent(packet);
|
||||
packetEventQue->post(ev);
|
||||
continue;
|
||||
}
|
||||
if (packet->getType() == MQTTSN_SEARCHGW)
|
||||
{
|
||||
/* write log and post Event */
|
||||
log(0, packet, 0);
|
||||
ev = new Event();
|
||||
ev->setBrodcastEvent(packet);
|
||||
packetEventQue->post(ev);
|
||||
continue;
|
||||
}
|
||||
|
||||
SensorNetAddress* senderAddr =
|
||||
_gateway->getSensorNetwork()->getSenderAddress();
|
||||
|
||||
SensorNetAddress* senderAddr = _gateway->getSensorNetwork()->getSenderAddress();
|
||||
if (packet->getType() == MQTTSN_ENCAPSULATED)
|
||||
{
|
||||
fwd =
|
||||
_gateway->getAdapterManager()->getForwarderList()->getForwarder(
|
||||
senderAddr);
|
||||
|
||||
if ( packet->getType() == MQTTSN_ENCAPSULATED )
|
||||
{
|
||||
fwd = _gateway->getAdapterManager()->getForwarderList()->getForwarder(senderAddr);
|
||||
if (fwd != nullptr)
|
||||
{
|
||||
MQTTSNString fwdName = MQTTSNString_initializer;
|
||||
fwdName.cstring = const_cast<char *>(fwd->getName());
|
||||
log(0, packet, &fwdName);
|
||||
|
||||
if ( fwd != nullptr )
|
||||
{
|
||||
MQTTSNString fwdName = MQTTSNString_initializer;
|
||||
fwdName.cstring = const_cast<char *>( fwd->getName() );
|
||||
log(0, packet, &fwdName);
|
||||
/* get the packet from the encapsulation message */
|
||||
MQTTSNGWEncapsulatedPacket encap;
|
||||
encap.desirialize(packet->getPacketData(),
|
||||
packet->getPacketLength());
|
||||
nodeId.setId(encap.getWirelessNodeId());
|
||||
client = fwd->getClient(&nodeId);
|
||||
packet = encap.getMQTTSNPacket();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Check the client belonging to QoS-1Proxy ? */
|
||||
|
||||
/* get the packet from the encapsulation message */
|
||||
MQTTSNGWEncapsulatedPacket encap;
|
||||
encap.desirialize(packet->getPacketData(), packet->getPacketLength());
|
||||
nodeId.setId( encap.getWirelessNodeId() );
|
||||
client = fwd->getClient(&nodeId);
|
||||
packet = encap.getMQTTSNPacket();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Check the client belonging to QoS-1Proxy ? */
|
||||
if (qosm1Proxy->isActive())
|
||||
{
|
||||
const char* clientName = qosm1Proxy->getClientId(senderAddr);
|
||||
|
||||
if ( qosm1Proxy->isActive() )
|
||||
{
|
||||
const char* clientName = qosm1Proxy->getClientId(senderAddr);
|
||||
if (clientName != nullptr)
|
||||
{
|
||||
client = qosm1Proxy->getClient();
|
||||
|
||||
if ( clientName != nullptr )
|
||||
{
|
||||
client = qosm1Proxy->getClient();
|
||||
if (!packet->isQoSMinusPUBLISH())
|
||||
{
|
||||
log(clientName, packet);
|
||||
WRITELOG(
|
||||
"%s %s %s can send only PUBLISH with QoS-1.%s\n",
|
||||
ERRMSG_HEADER, clientName,
|
||||
senderAddr->sprint(buf), ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( !packet->isQoSMinusPUBLISH() )
|
||||
{
|
||||
log(clientName, packet);
|
||||
WRITELOG("%s %s %s can send only PUBLISH with QoS-1.%s\n", ERRMSG_HEADER, clientName, senderAddr->sprint(buf), ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (client == nullptr)
|
||||
{
|
||||
client = _gateway->getClientList()->getClient(senderAddr);
|
||||
}
|
||||
}
|
||||
|
||||
if ( client == nullptr )
|
||||
{
|
||||
client = _gateway->getClientList()->getClient(senderAddr);
|
||||
}
|
||||
}
|
||||
if (client != nullptr)
|
||||
{
|
||||
/* write log and post Event */
|
||||
log(client, packet, 0);
|
||||
ev = new Event();
|
||||
ev->setClientRecvEvent(client, packet);
|
||||
packetEventQue->post(ev);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* new client */
|
||||
if (packet->getType() == MQTTSN_CONNECT)
|
||||
{
|
||||
MQTTSNPacket_connectData data;
|
||||
memset(&data, 0, sizeof(MQTTSNPacket_connectData));
|
||||
if (!packet->getCONNECT(&data))
|
||||
{
|
||||
log(0, packet, &data.clientID);
|
||||
WRITELOG("%s CONNECT message form %s is incorrect.%s\n",
|
||||
ERRMSG_HEADER, senderAddr->sprint(buf),
|
||||
ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( client != nullptr )
|
||||
{
|
||||
/* write log and post Event */
|
||||
log(client, packet, 0);
|
||||
ev = new Event();
|
||||
ev->setClientRecvEvent(client,packet);
|
||||
packetEventQue->post(ev);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* new client */
|
||||
if (packet->getType() == MQTTSN_CONNECT)
|
||||
{
|
||||
MQTTSNPacket_connectData data;
|
||||
memset(&data, 0, sizeof(MQTTSNPacket_connectData));
|
||||
if ( !packet->getCONNECT(&data) )
|
||||
{
|
||||
log(0, packet, &data.clientID);
|
||||
WRITELOG("%s CONNECT message form %s is incorrect.%s\n", ERRMSG_HEADER, senderAddr->sprint(buf), ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
client = clientList->getClient(&data.clientID);
|
||||
|
||||
client = clientList->getClient(&data.clientID);
|
||||
|
||||
if ( fwd != nullptr )
|
||||
{
|
||||
if ( client == nullptr )
|
||||
{
|
||||
/* create a new client */
|
||||
client = clientList->createClient(0, &data.clientID, clientType);
|
||||
}
|
||||
/* Add to a forwarded client list of forwarder. */
|
||||
if (fwd != nullptr)
|
||||
{
|
||||
if (client == nullptr)
|
||||
{
|
||||
/* create a new client */
|
||||
client = clientList->createClient(0, &data.clientID,
|
||||
clientType);
|
||||
}
|
||||
/* Add to a forwarded client list of forwarder. */
|
||||
fwd->addClient(client, &nodeId);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( client )
|
||||
}
|
||||
else
|
||||
{
|
||||
if (client)
|
||||
{
|
||||
/* Authentication is not required */
|
||||
if ( _gateway->getGWParams()->clientAuthentication == false)
|
||||
{
|
||||
client->setClientAddress(senderAddr);
|
||||
}
|
||||
if (_gateway->getGWParams()->clientAuthentication
|
||||
== false)
|
||||
{
|
||||
client->setClientAddress(senderAddr);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* create a new client */
|
||||
client = clientList->createClient(senderAddr, &data.clientID, clientType);
|
||||
client = clientList->createClient(senderAddr,
|
||||
&data.clientID, clientType);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
log(client, packet, &data.clientID);
|
||||
log(client, packet, &data.clientID);
|
||||
|
||||
if ( client == nullptr )
|
||||
{
|
||||
WRITELOG("%s Client(%s) was rejected. CONNECT message has been discarded.%s\n", ERRMSG_HEADER, senderAddr->sprint(buf), ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
if (client == nullptr)
|
||||
{
|
||||
WRITELOG(
|
||||
"%s Client(%s) was rejected. CONNECT message has been discarded.%s\n",
|
||||
ERRMSG_HEADER, senderAddr->sprint(buf),
|
||||
ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* post Client RecvEvent */
|
||||
ev = new Event();
|
||||
ev->setClientRecvEvent(client, packet);
|
||||
packetEventQue->post(ev);
|
||||
}
|
||||
else
|
||||
{
|
||||
log(client, packet, 0);
|
||||
if ( packet->getType() == MQTTSN_ENCAPSULATED )
|
||||
{
|
||||
WRITELOG("%s MQTTSNGWClientRecvTask Forwarder(%s) is not declared by ClientList file. message has been discarded.%s\n", ERRMSG_HEADER, _sensorNetwork->getSenderAddress()->sprint(buf), ERRMSG_FOOTER);
|
||||
}
|
||||
else
|
||||
{
|
||||
WRITELOG("%s MQTTSNGWClientRecvTask Client(%s) is not connecting. message has been discarded.%s\n", ERRMSG_HEADER, senderAddr->sprint(buf), ERRMSG_FOOTER);
|
||||
}
|
||||
delete packet;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* post Client RecvEvent */
|
||||
ev = new Event();
|
||||
ev->setClientRecvEvent(client, packet);
|
||||
packetEventQue->post(ev);
|
||||
}
|
||||
else
|
||||
{
|
||||
log(client, packet, 0);
|
||||
if (packet->getType() == MQTTSN_ENCAPSULATED)
|
||||
{
|
||||
WRITELOG(
|
||||
"%s MQTTSNGWClientRecvTask Forwarder(%s) is not declared by ClientList file. message has been discarded.%s\n",
|
||||
ERRMSG_HEADER,
|
||||
_sensorNetwork->getSenderAddress()->sprint(buf),
|
||||
ERRMSG_FOOTER);
|
||||
}
|
||||
else
|
||||
{
|
||||
WRITELOG(
|
||||
"%s MQTTSNGWClientRecvTask Client(%s) is not connecting. message has been discarded.%s\n",
|
||||
ERRMSG_HEADER, senderAddr->sprint(buf),
|
||||
ERRMSG_FOOTER);
|
||||
}
|
||||
delete packet;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClientRecvTask::log(Client* client, MQTTSNPacket* packet, MQTTSNString* id)
|
||||
{
|
||||
const char* clientId;
|
||||
char cstr[MAX_CLIENTID_LENGTH + 1];
|
||||
const char* clientId;
|
||||
char cstr[MAX_CLIENTID_LENGTH + 1];
|
||||
|
||||
if ( id )
|
||||
{
|
||||
if ( id->cstring )
|
||||
{
|
||||
strncpy(cstr, id->cstring, strlen(id->cstring) );
|
||||
clientId = cstr;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset((void*)cstr, 0, id->lenstring.len + 1);
|
||||
strncpy(cstr, id->lenstring.data, id->lenstring.len );
|
||||
if (id)
|
||||
{
|
||||
if (id->cstring)
|
||||
{
|
||||
strncpy(cstr, id->cstring, strlen(id->cstring));
|
||||
clientId = cstr;
|
||||
}
|
||||
}
|
||||
else if ( client )
|
||||
{
|
||||
clientId = client->getClientId();
|
||||
}
|
||||
else
|
||||
{
|
||||
clientId = UNKNOWNCL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
memset((void*) cstr, 0, id->lenstring.len + 1);
|
||||
strncpy(cstr, id->lenstring.data, id->lenstring.len);
|
||||
clientId = cstr;
|
||||
}
|
||||
}
|
||||
else if (client)
|
||||
{
|
||||
clientId = client->getClientId();
|
||||
}
|
||||
else
|
||||
{
|
||||
clientId = UNKNOWNCL;
|
||||
}
|
||||
|
||||
log(clientId, packet);
|
||||
log(clientId, packet);
|
||||
}
|
||||
|
||||
void ClientRecvTask::log(const char* clientId, MQTTSNPacket* packet)
|
||||
@@ -275,37 +298,46 @@ void ClientRecvTask::log(const char* clientId, MQTTSNPacket* packet)
|
||||
switch (packet->getType())
|
||||
{
|
||||
case MQTTSN_SEARCHGW:
|
||||
WRITELOG(FORMAT_Y_G_G_NL, currentDateTime(), packet->getName(), LEFTARROW, CLIENT, packet->print(pbuf));
|
||||
WRITELOG(FORMAT_Y_G_G_NL, currentDateTime(), packet->getName(),
|
||||
LEFTARROW, CLIENT, packet->print(pbuf));
|
||||
break;
|
||||
case MQTTSN_CONNECT:
|
||||
case MQTTSN_PINGREQ:
|
||||
WRITELOG(FORMAT_Y_G_G_NL, currentDateTime(), packet->getName(), LEFTARROW, clientId, packet->print(pbuf));
|
||||
WRITELOG(FORMAT_Y_G_G_NL, currentDateTime(), packet->getName(),
|
||||
LEFTARROW, clientId, packet->print(pbuf));
|
||||
break;
|
||||
case MQTTSN_DISCONNECT:
|
||||
case MQTTSN_WILLTOPICUPD:
|
||||
case MQTTSN_WILLMSGUPD:
|
||||
case MQTTSN_WILLTOPIC:
|
||||
case MQTTSN_WILLMSG:
|
||||
WRITELOG(FORMAT_Y_G_G, currentDateTime(), packet->getName(), LEFTARROW, clientId, packet->print(pbuf));
|
||||
WRITELOG(FORMAT_Y_G_G, currentDateTime(), packet->getName(), LEFTARROW,
|
||||
clientId, packet->print(pbuf));
|
||||
break;
|
||||
case MQTTSN_PUBLISH:
|
||||
case MQTTSN_REGISTER:
|
||||
case MQTTSN_SUBSCRIBE:
|
||||
case MQTTSN_UNSUBSCRIBE:
|
||||
WRITELOG(FORMAT_G_MSGID_G_G_NL, currentDateTime(), packet->getName(), packet->getMsgId(msgId), LEFTARROW, clientId, packet->print(pbuf));
|
||||
WRITELOG(FORMAT_G_MSGID_G_G_NL, currentDateTime(), packet->getName(),
|
||||
packet->getMsgId(msgId), LEFTARROW, clientId,
|
||||
packet->print(pbuf));
|
||||
break;
|
||||
case MQTTSN_REGACK:
|
||||
case MQTTSN_PUBACK:
|
||||
case MQTTSN_PUBREC:
|
||||
case MQTTSN_PUBREL:
|
||||
case MQTTSN_PUBCOMP:
|
||||
WRITELOG(FORMAT_G_MSGID_G_G, currentDateTime(), packet->getName(), packet->getMsgId(msgId), LEFTARROW, clientId, packet->print(pbuf));
|
||||
WRITELOG(FORMAT_G_MSGID_G_G, currentDateTime(), packet->getName(),
|
||||
packet->getMsgId(msgId), LEFTARROW, clientId,
|
||||
packet->print(pbuf));
|
||||
break;
|
||||
case MQTTSN_ENCAPSULATED:
|
||||
WRITELOG(FORMAT_Y_G_G, currentDateTime(), packet->getName(), LEFTARROW, clientId, packet->print(pbuf));
|
||||
break;
|
||||
WRITELOG(FORMAT_Y_G_G, currentDateTime(), packet->getName(), LEFTARROW,
|
||||
clientId, packet->print(pbuf));
|
||||
break;
|
||||
default:
|
||||
WRITELOG(FORMAT_W_NL, currentDateTime(), packet->getName(), LEFTARROW, clientId, packet->print(pbuf));
|
||||
WRITELOG(FORMAT_W_NL, currentDateTime(), packet->getName(), LEFTARROW,
|
||||
clientId, packet->print(pbuf));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user