mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-13 15:36:51 +01:00
Set whether to run ClientProxy at startup.
If it does not start, do not create an instance of ClientProxy. Change the name of ClientProxy to QoSm1Proxy Signed-off-by: tomoaki <tomoaki@tomy-tech.com>
This commit is contained in:
@@ -40,7 +40,7 @@ $(SRCDIR)/MQTTSNGWPublishHandler.cpp \
|
||||
$(SRCDIR)/MQTTSNGWSubscribeHandler.cpp \
|
||||
$(SRCDIR)/MQTTSNGWEncapsulatedPacket.cpp \
|
||||
$(SRCDIR)/MQTTSNGWForwarder.cpp \
|
||||
$(SRCDIR)/MQTTSNGWClientProxy.cpp \
|
||||
$(SRCDIR)/MQTTSNGWQoS-1Proxy.cpp \
|
||||
$(SRCDIR)/$(OS)/$(SENSORNET)/SensorNetwork.cpp \
|
||||
$(SRCDIR)/$(OS)/Timer.cpp \
|
||||
$(SRCDIR)/$(OS)/Network.cpp \
|
||||
|
||||
@@ -72,7 +72,7 @@ Client should know the MulticastIP and MulticastPortNo to send a SEARCHGW messag
|
||||
when **ClientAuthentication** is YES, see MQTTSNGWClient.cpp line53, clients file specified by ClientsList is required. This file defines connect allowed clients by ClientId and SensorNetwork Address. e.g. IP address and Port No.
|
||||
When **PredefinedTopic** is YES, Pre-definedTopicID file specified by PredefinedTopicList is effective. This file defines Pre-definedTopics of the clients. In this file, ClientID,TopicName and TopicID are declared in CSV format.
|
||||
When **Forwarder** is YES, Forwarder Encapsulation Message is available. Connectable Forwarders are specifed by ForwardersList file. In this file, ForwarderIds and those sensorNet addresses are declared in CSV format.
|
||||
When **QoS-1** is YES, QoS-1 PUBLISH Message is available. Clients which allow to send it, are specifed by QoS-1ClientsList file. In this file, ClientsId and those sensorNet addresses are declared in CSV format.
|
||||
When **QoS-1** is YES, QoS-1 PUBLISH Message is available. Clients which allow to send it, are specifed by QoS-1ClientsList file. In this file, ClientsId and those sensorNet addresses are declared in CSV format. QoS-1ProxyName is a ClientId of the proxy.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -18,16 +18,17 @@ BrokerPortNo=1883
|
||||
BrokerSecurePortNo=8883
|
||||
|
||||
ClientAuthentication=NO
|
||||
ClientsList=/path/to/your_clients.conf
|
||||
#ClientsList=/path/to/your_clients.conf
|
||||
|
||||
PredefinedTopic=NO
|
||||
PredefinedTopicList=/path/to/your_predefinedTopic.conf
|
||||
#PredefinedTopicList=/path/to/your_predefinedTopic.conf
|
||||
|
||||
Forwarder=NO
|
||||
ForwardersList=/path/to/your_forwarers.conf
|
||||
#ForwardersList=/path/to/your_forwarers.conf
|
||||
|
||||
QoS-1=NO
|
||||
QoS-1ClientsList=/path/to/your_qos-1clients.conf
|
||||
OoS-1ProxyName=Proxy007
|
||||
#QoS-1ClientsList=/path/to/your_qos-1clients.conf
|
||||
|
||||
#RootCAfile=/etc/ssl/certs/ca-certificates.crt
|
||||
#RootCApath=/etc/ssl/certs/
|
||||
|
||||
@@ -128,21 +128,28 @@ void ClientRecvTask::run()
|
||||
}
|
||||
else
|
||||
{
|
||||
const char* clientName = _gateway->getClientProxy()->getClientId(_sensorNetwork->getSenderAddress());
|
||||
/* when QoSm1Proxy is available, select QoS-1 PUBLISH message */
|
||||
QoSm1Proxy* pxy = _gateway->getQoSm1Proxy();
|
||||
if ( pxy )
|
||||
{
|
||||
/* get ClientId not Client which can send QoS-1 PUBLISH */
|
||||
const char* clientName = pxy->getClientId(_sensorNetwork->getSenderAddress());
|
||||
|
||||
if ( clientName ) // This client is for QoS-1 PUBLISH.
|
||||
{
|
||||
if ( packet->isQoSMinusPUBLISH() )
|
||||
if ( clientName )
|
||||
{
|
||||
client = _gateway->getClientProxy()->getClient(); // point to the ClientProxy
|
||||
}
|
||||
else
|
||||
{
|
||||
client = _gateway->getClientProxy()->getClient();
|
||||
log(clientName, packet);
|
||||
WRITELOG("%s %s %s can send only PUBLISH with QoS-1.%s\n", ERRMSG_HEADER, clientName, _sensorNetwork->getSenderAddress()->sprint(buf), ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
if ( packet->isQoSMinusPUBLISH() )
|
||||
{
|
||||
/* QoS1Proxy takes responsibility of the client */
|
||||
client = _gateway->getQoSm1Proxy()->getClient();
|
||||
}
|
||||
else
|
||||
{
|
||||
client = _gateway->getQoSm1Proxy()->getClient();
|
||||
log(clientName, packet);
|
||||
WRITELOG("%s %s %s can send only PUBLISH with QoS-1.%s\n", ERRMSG_HEADER, clientName, _sensorNetwork->getSenderAddress()->sprint(buf), ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -221,16 +228,6 @@ void ClientRecvTask::run()
|
||||
log(client, packet, 0);
|
||||
WRITELOG("%s Client(%s) is not connecting. message has been discarded.%s\n", ERRMSG_HEADER, _sensorNetwork->getSenderAddress()->sprint(buf), ERRMSG_FOOTER);
|
||||
delete packet;
|
||||
|
||||
/* Send DISCONNECT */
|
||||
if ( fwd == 0 )
|
||||
{
|
||||
packet = new MQTTSNPacket();
|
||||
packet->setDISCONNECT(0);
|
||||
ev = new Event();
|
||||
ev->setClientSendEvent(_sensorNetwork->getSenderAddress(), packet);
|
||||
_gateway->getClientSendQue()->post(ev);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -73,7 +73,7 @@ void ClientSendTask::run()
|
||||
log(client, packet);
|
||||
if ( client->isProxy() )
|
||||
{
|
||||
_gateway->getClientProxy()->send(packet);
|
||||
_gateway->getQoSm1Proxy()->send(packet);
|
||||
continue;
|
||||
}
|
||||
rc = packet->unicast(_sensorNetwork, client->getSensorNetAddress());
|
||||
|
||||
@@ -114,8 +114,12 @@ void PacketHandleTask::run()
|
||||
_advertiseTimer.start(_gateway->getGWParams()->keepAlive * 1000UL);
|
||||
}
|
||||
|
||||
/*------ Check ClientProxy to Connect or send PINGREQ ------*/
|
||||
_gateway->getClientProxy()->checkConnection();
|
||||
/*------ Check QoS-1 Proxy Connect or PINGREQ ------*/
|
||||
QoSm1Proxy* pxy = _gateway->getQoSm1Proxy();
|
||||
if ( pxy )
|
||||
{
|
||||
pxy->checkConnection();
|
||||
}
|
||||
}
|
||||
|
||||
/*------ Handle SEARCHGW Message ---------*/
|
||||
|
||||
@@ -127,7 +127,7 @@ void MQTTSNPublishHandler::handlePublish(Client* client, MQTTSNPacket* packet)
|
||||
/* reset PINGREQ of ClientProxy */
|
||||
if ( qos == 3 )
|
||||
{
|
||||
_gateway->getClientProxy()->resetPingTimer();
|
||||
_gateway->getQoSm1Proxy()->resetPingTimer();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,8 +15,9 @@
|
||||
**************************************************************************************/
|
||||
|
||||
|
||||
#include "MQTTSNGWQoS-1Proxy.h"
|
||||
|
||||
#include "MQTTSNGWDefines.h"
|
||||
#include "MQTTSNGWClientProxy.h"
|
||||
#include "MQTTSNGateway.h"
|
||||
#include "SensorNetwork.h"
|
||||
#include <string>
|
||||
@@ -32,21 +33,21 @@ using namespace MQTTSNGW;
|
||||
* Class ClientProxyElement
|
||||
*/
|
||||
|
||||
ClientProxyElement::ClientProxyElement(void)
|
||||
QoSm1ProxyElement::QoSm1ProxyElement(void)
|
||||
: _clientId{0}
|
||||
, _next{0}
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ClientProxyElement::ClientProxyElement(SensorNetAddress* addr, string* clientId)
|
||||
QoSm1ProxyElement::QoSm1ProxyElement(SensorNetAddress* addr, string* clientId)
|
||||
: _next{0}
|
||||
{
|
||||
_clientId = *clientId;
|
||||
_sensorNetAddr = *addr;
|
||||
}
|
||||
|
||||
ClientProxyElement::~ClientProxyElement(void)
|
||||
QoSm1ProxyElement::~QoSm1ProxyElement(void)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -55,14 +56,14 @@ ClientProxyElement::~ClientProxyElement(void)
|
||||
* Class ClientProxy
|
||||
*/
|
||||
|
||||
ClientProxy:: ClientProxy(void)
|
||||
QoSm1Proxy:: QoSm1Proxy(void)
|
||||
: _head{0}
|
||||
{
|
||||
_gateway = 0;
|
||||
_client = 0;
|
||||
}
|
||||
|
||||
ClientProxy:: ClientProxy(Gateway* gw)
|
||||
QoSm1Proxy:: QoSm1Proxy(Gateway* gw)
|
||||
: _head{0}
|
||||
{
|
||||
_gateway = gw;
|
||||
@@ -70,35 +71,35 @@ ClientProxy:: ClientProxy(Gateway* gw)
|
||||
}
|
||||
|
||||
|
||||
ClientProxy::~ClientProxy(void)
|
||||
QoSm1Proxy::~QoSm1Proxy(void)
|
||||
{
|
||||
if ( _head )
|
||||
{
|
||||
ClientProxyElement* p = _head;
|
||||
QoSm1ProxyElement* p = _head;
|
||||
while ( p )
|
||||
{
|
||||
ClientProxyElement* next = p->_next;
|
||||
QoSm1ProxyElement* next = p->_next;
|
||||
delete p;
|
||||
p = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ClientProxy::setGateway(Gateway* gw)
|
||||
void QoSm1Proxy::setGateway(Gateway* gw)
|
||||
{
|
||||
_gateway = gw;
|
||||
}
|
||||
|
||||
ClientProxyElement* ClientProxy::add(SensorNetAddress* addr, string* clientId)
|
||||
QoSm1ProxyElement* QoSm1Proxy::add(SensorNetAddress* addr, string* clientId)
|
||||
{
|
||||
ClientProxyElement* elm = new ClientProxyElement(addr, clientId);
|
||||
QoSm1ProxyElement* elm = new QoSm1ProxyElement(addr, clientId);
|
||||
if ( _head == 0 )
|
||||
{
|
||||
_head = elm;
|
||||
}
|
||||
else
|
||||
{
|
||||
ClientProxyElement* p = _head;
|
||||
QoSm1ProxyElement* p = _head;
|
||||
while ( p )
|
||||
{
|
||||
if ( p->_next == 0 )
|
||||
@@ -115,9 +116,9 @@ ClientProxyElement* ClientProxy::add(SensorNetAddress* addr, string* clientId)
|
||||
return elm;
|
||||
}
|
||||
|
||||
const char* ClientProxy::getClientId(SensorNetAddress* addr)
|
||||
const char* QoSm1Proxy::getClientId(SensorNetAddress* addr)
|
||||
{
|
||||
ClientProxyElement* p = _head;
|
||||
QoSm1ProxyElement* p = _head;
|
||||
while ( p )
|
||||
{
|
||||
if ( p->_sensorNetAddr.isMatch(addr) )
|
||||
@@ -130,17 +131,17 @@ const char* ClientProxy::getClientId(SensorNetAddress* addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ClientProxy::setClient(Client* client)
|
||||
void QoSm1Proxy::setClient(Client* client)
|
||||
{
|
||||
_client = client;
|
||||
}
|
||||
|
||||
Client* ClientProxy::getClient(void)
|
||||
Client* QoSm1Proxy::getClient(void)
|
||||
{
|
||||
return _client;
|
||||
}
|
||||
|
||||
bool ClientProxy::setClientProxy(const char* fileName)
|
||||
bool QoSm1Proxy::setClientProxy(const char* fileName)
|
||||
{
|
||||
FILE* fp;
|
||||
char buf[MAX_CLIENTID_LENGTH + 256];
|
||||
@@ -191,7 +192,7 @@ bool ClientProxy::setClientProxy(const char* fileName)
|
||||
}
|
||||
|
||||
|
||||
void ClientProxy::checkConnection(void)
|
||||
void QoSm1Proxy::checkConnection(void)
|
||||
{
|
||||
if ( _client->isDisconnect() || ( _client->isConnecting() && _responseTimer.isTimeup()) )
|
||||
{
|
||||
@@ -220,12 +221,12 @@ void ClientProxy::checkConnection(void)
|
||||
}
|
||||
}
|
||||
|
||||
void ClientProxy::resetPingTimer(void)
|
||||
void QoSm1Proxy::resetPingTimer(void)
|
||||
{
|
||||
_keepAliveTimer.start(KEEPALIVE_DURATION * 1000UL);
|
||||
}
|
||||
|
||||
void ClientProxy::send(MQTTSNPacket* packet)
|
||||
void QoSm1Proxy::send(MQTTSNPacket* packet)
|
||||
{
|
||||
if ( packet->getType() == MQTTSN_CONNACK )
|
||||
{
|
||||
@@ -242,7 +243,7 @@ void ClientProxy::send(MQTTSNPacket* packet)
|
||||
}
|
||||
}
|
||||
|
||||
void ClientProxy::sendStoredPublish(void)
|
||||
void QoSm1Proxy::sendStoredPublish(void)
|
||||
{
|
||||
MQTTSNPacket* msg = 0;
|
||||
|
||||
@@ -14,8 +14,8 @@
|
||||
* Tomoaki Yamaguchi - initial API and implementation and/or initial documentation
|
||||
**************************************************************************************/
|
||||
|
||||
#ifndef MQTTSNGATEWAY_SRC_MQTTSNGWCLIENTPROXY_H_
|
||||
#define MQTTSNGATEWAY_SRC_MQTTSNGWCLIENTPROXY_H_
|
||||
#ifndef MQTTSNGATEWAY_SRC_MQTTSNGWQOS_1PROXY_H_
|
||||
#define MQTTSNGATEWAY_SRC_MQTTSNGWQOS_1PROXY_H_
|
||||
|
||||
#include "MQTTSNGateway.h"
|
||||
#include "MQTTGWPacket.h"
|
||||
@@ -29,27 +29,27 @@ namespace MQTTSNGW
|
||||
{
|
||||
class Gateway;
|
||||
|
||||
class ClientProxyElement
|
||||
class QoSm1ProxyElement
|
||||
{
|
||||
friend class ClientProxy;
|
||||
friend class QoSm1Proxy;
|
||||
public:
|
||||
ClientProxyElement(void);
|
||||
ClientProxyElement(SensorNetAddress* addr, string* clientId);
|
||||
~ClientProxyElement(void);
|
||||
QoSm1ProxyElement(void);
|
||||
QoSm1ProxyElement(SensorNetAddress* addr, string* clientId);
|
||||
~QoSm1ProxyElement(void);
|
||||
private:
|
||||
SensorNetAddress _sensorNetAddr;
|
||||
string _clientId;
|
||||
ClientProxyElement* _next;
|
||||
QoSm1ProxyElement* _next;
|
||||
};
|
||||
|
||||
class ClientProxy
|
||||
class QoSm1Proxy
|
||||
{
|
||||
public:
|
||||
ClientProxy(void);
|
||||
ClientProxy(Gateway* gw);
|
||||
~ClientProxy(void);
|
||||
QoSm1Proxy(void);
|
||||
QoSm1Proxy(Gateway* gw);
|
||||
~QoSm1Proxy(void);
|
||||
bool setClientProxy(const char* fileName);
|
||||
ClientProxyElement* add(SensorNetAddress* addr, string* clientId);
|
||||
QoSm1ProxyElement* add(SensorNetAddress* addr, string* clientId);
|
||||
const char* getClientId(SensorNetAddress* addr);
|
||||
void setClient(Client*);
|
||||
Client* getClient(void);
|
||||
@@ -65,7 +65,7 @@ private:
|
||||
|
||||
Gateway* _gateway;
|
||||
Client* _client;
|
||||
ClientProxyElement* _head;
|
||||
QoSm1ProxyElement* _head;
|
||||
Timer _keepAliveTimer;
|
||||
Timer _responseTimer;
|
||||
};
|
||||
@@ -74,4 +74,4 @@ private:
|
||||
|
||||
|
||||
|
||||
#endif /* MQTTSNGATEWAY_SRC_MQTTSNGWCLIENTPROXY_H_ */
|
||||
#endif /* MQTTSNGATEWAY_SRC_MQTTSNGWQOS_1PROXY_H_ */
|
||||
@@ -30,7 +30,7 @@ Gateway::Gateway()
|
||||
{
|
||||
theMultiTaskProcess = this;
|
||||
theProcess = this;
|
||||
_clientProxy = new ClientProxy(this);
|
||||
_qosm1Proxy = 0;
|
||||
_params.loginId = 0;
|
||||
_params.password = 0;
|
||||
_params.keepAlive = 0;
|
||||
@@ -50,6 +50,7 @@ Gateway::Gateway()
|
||||
_params.predefinedTopicFileName = 0;
|
||||
_params.forwarderListName = 0;
|
||||
_params.qosMinusClientListName = 0;
|
||||
_params.qosm1proxyName = 0;
|
||||
_packetEventQue.setMaxSize(MAX_INFLIGHTMESSAGES * MAX_CLIENTS);
|
||||
}
|
||||
|
||||
@@ -115,9 +116,14 @@ Gateway::~Gateway()
|
||||
{
|
||||
free(_params.qosMinusClientListName);
|
||||
}
|
||||
if ( _clientProxy )
|
||||
if ( _params.qosm1proxyName )
|
||||
{
|
||||
delete _clientProxy;
|
||||
free(_params.qosm1proxyName);
|
||||
}
|
||||
|
||||
if ( _qosm1Proxy )
|
||||
{
|
||||
delete _qosm1Proxy;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,18 +236,32 @@ void Gateway::initialize(int argc, char** argv)
|
||||
}
|
||||
}
|
||||
|
||||
/* Set ClientProxy's Client */
|
||||
MQTTSNString id = MQTTSNString_initializer;
|
||||
id.cstring = const_cast<char*>(CLIENTPROXY);
|
||||
Client* client = _clientList.createClient(0, &id, true, secure);
|
||||
_clientProxy->setClient(client);
|
||||
client->setPorxy(true);
|
||||
_clientProxy->setGateway(this);
|
||||
/* Set QoSm1Proxy's Client */
|
||||
|
||||
if (getParam("QoS-1", param) == 0 )
|
||||
if (getParam("QoS-1", param) == 0 )
|
||||
{
|
||||
if (!strcasecmp(param, "YES") )
|
||||
{
|
||||
/* Set QoSm1Proxy's Client */
|
||||
|
||||
_qosm1Proxy = new QoSm1Proxy(this);
|
||||
MQTTSNString id = MQTTSNString_initializer;
|
||||
|
||||
if (getParam("QoS-1ProxyName", param) == 0 )
|
||||
{
|
||||
string name = string(param);
|
||||
id.cstring = const_cast<char*>(name.c_str());
|
||||
}
|
||||
else
|
||||
{
|
||||
id.cstring = const_cast<char*>(CLIENTPROXY);
|
||||
}
|
||||
Client* client = _clientList.createClient(0, &id, true, secure);
|
||||
_qosm1Proxy->setClient(client);
|
||||
client->setPorxy(true);
|
||||
_qosm1Proxy->setGateway(this);
|
||||
|
||||
|
||||
if (getParam("QoS-1ClientsList", param) == 0)
|
||||
{
|
||||
fileName = string(param);
|
||||
@@ -250,7 +270,7 @@ void Gateway::initialize(int argc, char** argv)
|
||||
{
|
||||
fileName = *getConfigDirName() + string(QOS_1CLIENT_LIST);
|
||||
}
|
||||
if ( !_clientProxy->setClientProxy(fileName.c_str()) )
|
||||
if ( !_qosm1Proxy->setClientProxy(fileName.c_str()) )
|
||||
{
|
||||
throw Exception("Gateway::initialize: No QoS-1ClientsList file defined by the configuration..");
|
||||
}
|
||||
@@ -399,9 +419,9 @@ GatewayParams* Gateway::getGWParams(void)
|
||||
return &_params;
|
||||
}
|
||||
|
||||
ClientProxy* Gateway::getClientProxy(void)
|
||||
QoSm1Proxy* Gateway::getQoSm1Proxy(void)
|
||||
{
|
||||
return _clientProxy;
|
||||
return _qosm1Proxy;
|
||||
}
|
||||
|
||||
/*=====================================
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
#include "MQTTSNPacket.h"
|
||||
|
||||
#include "MQTTSNGWForwarder.h"
|
||||
#include "MQTTSNGWClientProxy.h"
|
||||
#include "MQTTSNGWQoS-1Proxy.h"
|
||||
|
||||
namespace MQTTSNGW
|
||||
{
|
||||
@@ -159,13 +159,14 @@ typedef struct
|
||||
char* privateKey;
|
||||
char* predefinedTopicFileName;
|
||||
char* forwarderListName;
|
||||
char* qosm1proxyName;
|
||||
char* qosMinusClientListName;
|
||||
}GatewayParams;
|
||||
|
||||
/*=====================================
|
||||
Class Gateway
|
||||
=====================================*/
|
||||
class ClientProxy;
|
||||
class QoSm1Proxy;
|
||||
|
||||
class Gateway: public MultiTaskProcess{
|
||||
public:
|
||||
@@ -182,11 +183,11 @@ public:
|
||||
SensorNetwork* getSensorNetwork(void);
|
||||
LightIndicator* getLightIndicator(void);
|
||||
GatewayParams* getGWParams(void);
|
||||
ClientProxy* getClientProxy(void);
|
||||
QoSm1Proxy* getQoSm1Proxy(void);
|
||||
|
||||
private:
|
||||
ClientList _clientList;
|
||||
ClientProxy* _clientProxy;
|
||||
QoSm1Proxy* _qosm1Proxy;
|
||||
ForwarderList _forwarderList;
|
||||
EventQue _packetEventQue;
|
||||
EventQue _brokerSendQue;
|
||||
|
||||
Reference in New Issue
Block a user