mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-13 15:36:51 +01:00
361 lines
6.5 KiB
C++
361 lines
6.5 KiB
C++
/**************************************************************************************
|
|
* Copyright (c) 2016, Tomoaki Yamaguchi
|
|
*
|
|
* All rights reserved. This program and the accompanying materials
|
|
* are made available under the terms of the Eclipse Public License v1.0
|
|
* and Eclipse Distribution License v1.0 which accompany this distribution.
|
|
*
|
|
* The Eclipse Public License is available at
|
|
* http://www.eclipse.org/legal/epl-v10.html
|
|
* and the Eclipse Distribution License is available at
|
|
* http://www.eclipse.org/org/documents/edl-v10.php.
|
|
*
|
|
* Contributors:
|
|
* Tomoaki Yamaguchi - initial API and implementation and/or initial documentation
|
|
**************************************************************************************/
|
|
|
|
#include "MQTTSNGateway.h"
|
|
#include "MQTTSNGWProcess.h"
|
|
#include "SensorNetwork.h"
|
|
|
|
using namespace MQTTSNGW;
|
|
|
|
char* currentDateTime(void);
|
|
|
|
/*=====================================
|
|
Class Gateway
|
|
=====================================*/
|
|
Gateway::Gateway()
|
|
{
|
|
theMultiTaskProcess = this;
|
|
theProcess = this;
|
|
_params.loginId = 0;
|
|
_params.password = 0;
|
|
}
|
|
|
|
Gateway::~Gateway()
|
|
{
|
|
if ( _params.loginId )
|
|
{
|
|
free(_params.loginId);
|
|
}
|
|
if ( _params.password )
|
|
{
|
|
free(_params.password);
|
|
}
|
|
}
|
|
|
|
void Gateway::initialize(int argc, char** argv)
|
|
{
|
|
char param[MQTTSNGW_PARAM_MAX];
|
|
MultiTaskProcess::initialize(argc, argv);
|
|
resetRingBuffer();
|
|
|
|
_params.gatewayId = 0;
|
|
if (getParam("GatewayID", param) == 0)
|
|
{
|
|
_params.gatewayId = atoi(param);
|
|
}
|
|
|
|
if (_params.gatewayId == 0 || _params.gatewayId > 255)
|
|
{
|
|
throw Exception( "Gateway::initialize: invalid Gateway Id");
|
|
}
|
|
|
|
if (getParam("GatewayName", param) == 0)
|
|
{
|
|
_params.gatewayName = (uint8_t*) strdup(param);
|
|
}
|
|
|
|
_params.mqttVersion = DEFAULT_MQTT_VERSION;
|
|
if (getParam("MQTTVersion", param) == 0)
|
|
{
|
|
_params.mqttVersion = atoi(param);
|
|
}
|
|
|
|
_params.maxInflightMsgs = DEFAULT_MQTT_VERSION;
|
|
if (getParam("MaxInflightMsgs", param) == 0)
|
|
{
|
|
_params.maxInflightMsgs = atoi(param);
|
|
}
|
|
|
|
_params.keepAlive = DEFAULT_KEEP_ALIVE_TIME;
|
|
|
|
if (getParam("KeepAlive", param) == 0)
|
|
{
|
|
_params.keepAlive = atoi(param);
|
|
}
|
|
|
|
if (_params.keepAlive > 65536)
|
|
{
|
|
throw Exception("Gateway::initialize: KeepAliveTime is grater than 65536 Secs");
|
|
}
|
|
|
|
if (getParam("LoginID", param) == 0)
|
|
{
|
|
_params.loginId = (uint8_t*) strdup(param);
|
|
}
|
|
|
|
if (getParam("Password", param) == 0)
|
|
{
|
|
_params.password = (uint8_t*) strdup(param);
|
|
}
|
|
|
|
if (getParam("ClientAuthentication", param) == 0)
|
|
{
|
|
string fileName;
|
|
if (!strcasecmp(param, "YES"))
|
|
{
|
|
if (getParam("ClientList", param) == 0)
|
|
{
|
|
fileName = string(param);
|
|
}
|
|
else
|
|
{
|
|
fileName = *getConfigDirName() + string(MQTTSNGW_CLIENT_LIST);
|
|
}
|
|
|
|
if (!_clientList.authorize(fileName.c_str()))
|
|
{
|
|
throw Exception("Gateway::initialize: No client list which defined by configuration.");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (getParam("SecureConnection", param) == 0)
|
|
{
|
|
_params.secureConnection = !strcasecmp(param, "YES");
|
|
}
|
|
else
|
|
{
|
|
_params.secureConnection = false;
|
|
}
|
|
|
|
}
|
|
|
|
void Gateway::run(void)
|
|
{
|
|
_lightIndicator.redLight(true);
|
|
WRITELOG("\n%s", PAHO_COPYRIGHT4);
|
|
WRITELOG("\n%s\n", PAHO_COPYRIGHT0);
|
|
WRITELOG("%s\n", PAHO_COPYRIGHT1);
|
|
WRITELOG("%s\n", PAHO_COPYRIGHT2);
|
|
WRITELOG(" *\n%s\n", PAHO_COPYRIGHT3);
|
|
WRITELOG("%s\n", GATEWAY_VERSION);
|
|
WRITELOG("%s\n", PAHO_COPYRIGHT4);
|
|
WRITELOG("\n%s %s has been started.\n listening on, %s\n", currentDateTime(), _params.gatewayName, _sensorNetwork.getDescription());
|
|
|
|
if ( getClientList()->isAuthorized() )
|
|
{
|
|
WRITELOG("\nClient authentication is required by the configuration settings.\n\n");
|
|
}
|
|
|
|
/* execute threads & wait StopProcessEvent MQTTSNGWPacketHandleTask posts by CTL-C */
|
|
|
|
MultiTaskProcess::run();
|
|
WRITELOG("%s MQTT-SN Gateway stoped\n", currentDateTime());
|
|
_lightIndicator.allLightOff();
|
|
}
|
|
|
|
EventQue* Gateway::getPacketEventQue()
|
|
{
|
|
return &_packetEventQue;
|
|
}
|
|
|
|
EventQue* Gateway::getClientSendQue()
|
|
{
|
|
return &_clientSendQue;
|
|
}
|
|
|
|
EventQue* Gateway::getBrokerSendQue()
|
|
{
|
|
return &_brokerSendQue;
|
|
}
|
|
|
|
ClientList* Gateway::getClientList()
|
|
{
|
|
return &_clientList;
|
|
}
|
|
|
|
SensorNetwork* Gateway::getSensorNetwork()
|
|
{
|
|
return &_sensorNetwork;
|
|
}
|
|
|
|
LightIndicator* Gateway::getLightIndicator()
|
|
{
|
|
return &_lightIndicator;
|
|
}
|
|
|
|
GatewayParams* Gateway::getGWParams(void)
|
|
{
|
|
return &_params;
|
|
}
|
|
|
|
/*=====================================
|
|
Class EventQue
|
|
=====================================*/
|
|
EventQue::EventQue()
|
|
{
|
|
|
|
}
|
|
|
|
EventQue::~EventQue()
|
|
{
|
|
|
|
}
|
|
|
|
Event* EventQue::wait(void)
|
|
{
|
|
Event* ev;
|
|
while ( true )
|
|
{
|
|
_sem.wait();
|
|
_mutex.lock();
|
|
ev = _que.front();
|
|
_que.pop();
|
|
_mutex.unlock();
|
|
if ( ev )
|
|
{
|
|
return ev;
|
|
}
|
|
}
|
|
}
|
|
|
|
Event* EventQue::timedwait(uint16_t millsec)
|
|
{
|
|
Event* ev;
|
|
_sem.timedwait(millsec);
|
|
_mutex.lock();
|
|
|
|
if (_que.size() == 0)
|
|
{
|
|
ev = new Event();
|
|
ev->setTimeout();
|
|
}
|
|
else
|
|
{
|
|
ev = _que.front();
|
|
_que.pop();
|
|
if ( !ev )
|
|
{
|
|
ev = new Event();
|
|
ev->setTimeout();
|
|
}
|
|
}
|
|
_mutex.unlock();
|
|
return ev;
|
|
}
|
|
|
|
int EventQue::post(Event* ev)
|
|
{
|
|
if ( ev )
|
|
{
|
|
_mutex.lock();
|
|
_que.post(ev);
|
|
_sem.post();
|
|
_mutex.unlock();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int EventQue::size()
|
|
{
|
|
_mutex.lock();
|
|
int sz = _que.size();
|
|
_mutex.unlock();
|
|
return sz;
|
|
}
|
|
|
|
|
|
/*=====================================
|
|
Class Event
|
|
=====================================*/
|
|
Event::Event()
|
|
{
|
|
_eventType = Et_NA;
|
|
_client = 0;
|
|
_mqttSNPacket = 0;
|
|
_mqttGWPacket = 0;
|
|
}
|
|
|
|
Event::Event(EventType type)
|
|
{
|
|
_eventType = type;
|
|
_client = 0;
|
|
_mqttSNPacket = 0;
|
|
_mqttGWPacket = 0;
|
|
}
|
|
|
|
Event::~Event()
|
|
{
|
|
if (_mqttSNPacket)
|
|
{
|
|
delete _mqttSNPacket;
|
|
}
|
|
|
|
if (_mqttGWPacket)
|
|
{
|
|
delete _mqttGWPacket;
|
|
}
|
|
}
|
|
|
|
EventType Event::getEventType()
|
|
{
|
|
return _eventType;
|
|
}
|
|
|
|
void Event::setClientSendEvent(Client* client, MQTTSNPacket* packet)
|
|
{
|
|
_client = client;
|
|
_eventType = EtClientSend;
|
|
_mqttSNPacket = packet;
|
|
}
|
|
|
|
void Event::setBrokerSendEvent(Client* client, MQTTGWPacket* packet)
|
|
{
|
|
_client = client;
|
|
_eventType = EtBrokerSend;
|
|
_mqttGWPacket = packet;
|
|
}
|
|
|
|
void Event::setClientRecvEvent(Client* client, MQTTSNPacket* packet)
|
|
{
|
|
_client = client;
|
|
_eventType = EtClientRecv;
|
|
_mqttSNPacket = packet;
|
|
}
|
|
|
|
void Event::setBrokerRecvEvent(Client* client, MQTTGWPacket* packet)
|
|
{
|
|
_client = client;
|
|
_eventType = EtBrokerRecv;
|
|
_mqttGWPacket = packet;
|
|
}
|
|
|
|
void Event::setTimeout(void)
|
|
{
|
|
_eventType = EtTimeout;
|
|
}
|
|
|
|
void Event::setBrodcastEvent(MQTTSNPacket* msg)
|
|
{
|
|
_mqttSNPacket = msg;
|
|
_eventType = EtBroadcast;
|
|
}
|
|
|
|
Client* Event::getClient(void)
|
|
{
|
|
return _client;
|
|
}
|
|
|
|
MQTTSNPacket* Event::getMQTTSNPacket()
|
|
{
|
|
return _mqttSNPacket;
|
|
}
|
|
|
|
MQTTGWPacket* Event::getMQTTGWPacket(void)
|
|
{
|
|
return _mqttGWPacket;
|
|
}
|