From 9ae5c721252e8053cc2240990bb1ad3d6a013f2a Mon Sep 17 00:00:00 2001 From: tomoaki Date: Thu, 28 Jun 2018 08:42:51 +0900 Subject: [PATCH] Add: Two Gateway Test programs BugFix: invalid pointer Signed-off-by: tomoaki --- .cproject | 4 +- MQTTSNGateway/GatewayTester/Makefile | 44 +++- .../samples/ClientPub/mainPub.cpp | 157 +++++++++++++++ .../samples/ClientSub/mainSub.cpp | 188 ++++++++++++++++++ .../GatewayTester/samples/mainTest.cpp | 2 + MQTTSNGateway/GatewayTester/src/LGwProxy.cpp | 13 +- MQTTSNGateway/GatewayTester/src/LGwProxy.h | 1 + .../GatewayTester/src/LMqttsnClient.cpp | 8 +- .../GatewayTester/src/LMqttsnClient.h | 1 + .../GatewayTester/src/LMqttsnClientApp.h | 1 + .../GatewayTester/src/LPublishManager.cpp | 9 + MQTTSNGateway/src/MQTTSNGWClientRecvTask.cpp | 2 +- MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp | 2 +- .../src/MQTTSNGWConnectionHandler.cpp | 5 +- 14 files changed, 415 insertions(+), 22 deletions(-) create mode 100644 MQTTSNGateway/GatewayTester/samples/ClientPub/mainPub.cpp create mode 100644 MQTTSNGateway/GatewayTester/samples/ClientSub/mainSub.cpp diff --git a/.cproject b/.cproject index 12edf27..d61f694 100644 --- a/.cproject +++ b/.cproject @@ -66,7 +66,7 @@ - + @@ -138,7 +138,7 @@ - + diff --git a/MQTTSNGateway/GatewayTester/Makefile b/MQTTSNGateway/GatewayTester/Makefile index 2d89321..7ce0f29 100644 --- a/MQTTSNGateway/GatewayTester/Makefile +++ b/MQTTSNGateway/GatewayTester/Makefile @@ -1,12 +1,18 @@ -PROGNAME := MQTT-SNGatewayTester -APPL := mainTest +PROGTEST := MQTT-SNGatewayTester +TESTAPPL := mainTest +PRGPUB := MQTT-SNPub +PUBAPPL := mainPub + +PRGSUB := MQTT-SNSub +SUBAPPL := mainSub SRCDIR := samples +SRCPUB := ClientPub +SRCSUB := ClientSub SUBDIR := src CPPSRCS := \ -$(SRCDIR)/$(APPL).cpp \ $(SUBDIR)/LGwProxy.cpp \ $(SUBDIR)/LMqttsnClient.cpp \ $(SUBDIR)/LNetworkUdp.cpp \ @@ -19,7 +25,9 @@ $(SUBDIR)/LTopicTable.cpp \ $(SUBDIR)/LScreen.cpp \ $(SUBDIR)/Payload.cpp \ $(SUBDIR)/Util.cpp \ - +#$(SRCDIR)/$(TESTAPPL).cpp \ +#$(SRCDIR)/$(SRCPUB)/$(PUBAPPL).cpp \ +#$(SRCDIR)/$(SRCSUB)/$(SUBAPPL).cpp \ CXX := g++ CPPFLAGS += @@ -32,38 +40,52 @@ CXXFLAGS := -Wall -O3 -std=c++11 LDADD := OUTDIR := Build -PROG := $(OUTDIR)/$(PROGNAME) +PROG := $(OUTDIR)/$(PROGTEST) OBJS := $(CPPSRCS:%.cpp=$(OUTDIR)/%.o) DEPS := $(CPPSRCS:%.cpp=$(OUTDIR)/%.d) +PROGPUB := $(OUTDIR)/$(PRGPUB) +PROGSUB := $(OUTDIR)/$(PRGSUB) .PHONY: install clean -all: $(PROG) +all: $(PROG) $(PROGPUB) $(PROGSUB) -include $(DEPS) -$(PROG): $(OBJS) $(OUTDIR)/$(SRCDIR)/$(APPL).o - $(CXX) $(LDFLAGS) -o $@ $^ $(LIBS) $(LDADD) +$(PROG): $(OBJS) $(OUTDIR)/$(SRCDIR)/$(TESTAPPL).o + $(CXX) $(LDFLAGS) -o $(PROG) $(OUTDIR)/$(SRCDIR)/$(TESTAPPL).o $(OBJS) $(LIBS) $(LDADD) + +$(PROGPUB): $(OBJS) $(OUTDIR)/$(SRCDIR)/$(SRCPUB)/$(PUBAPPL).o + $(CXX) $(LDFLAGS) -o $(PROGPUB) $(OUTDIR)/$(SRCDIR)/$(SRCPUB)/$(PUBAPPL).o $(OBJS) $(LIBS) $(LDADD) + +$(PROGSUB): $(OBJS) $(OUTDIR)/$(SRCDIR)/$(SRCSUB)/$(SUBAPPL).o + $(CXX) $(LDFLAGS) -o $(PROGSUB) $(OUTDIR)/$(SRCDIR)/$(SRCSUB)/$(SUBAPPL).o $(OBJS) $(LIBS) $(LDADD) $(OUTDIR)/$(SUBDIR)/%.o:$(SUBDIR)/%.cpp @if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(INCLUDES) $(DEFS) -o $@ -c -MMD -MP -MF $(@:%.o=%.d) $< - + $(OUTDIR)/$(SRCDIR)/%.o:$(SRCDIR)/%.cpp @if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(INCLUDES) $(DEFS) -o $@ -c -MMD -MP -MF $(@:%.o=%.d) $< +$(OUTDIR)/$(SRCDIR)/$(SRCPUB)/%.o:$(SRCDIR)/$(SRCPUB)%.cpp + @if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(INCLUDES) $(DEFS) -o $@ -c -MMD -MP -MF $(@:%.o=%.d) $< +$(OUTDIR)/$(SRCDIR)/$(SRCSUB)/%.o:$(SRCDIR)/$(SRCSUB)%.cpp + @if [ ! -e `dirname $@` ]; then mkdir -p `dirname $@`; fi + $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(INCLUDES) $(DEFS) -o $@ -c -MMD -MP -MF $(@:%.o=%.d) $< clean: rm -rf $(OUTDIR) install: cp -pf $(PROG) ../../../ - - + cp -pf $(PROGPUB) ../../../ + cp -pf $(PROGSUB) ../../../ diff --git a/MQTTSNGateway/GatewayTester/samples/ClientPub/mainPub.cpp b/MQTTSNGateway/GatewayTester/samples/ClientPub/mainPub.cpp new file mode 100644 index 0000000..b7e9227 --- /dev/null +++ b/MQTTSNGateway/GatewayTester/samples/ClientPub/mainPub.cpp @@ -0,0 +1,157 @@ +/**************************************************************************** + * 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. + * + *--------------------------------------------------------------------------- + * + * MQTT-SN GATEWAY TEST CLIENT + * + * Supported functions. + * + * void PUBLISH ( const char* topicName, uint8_t* payload, + * uint16_t len, uint8_t qos, bool retain = false ); + * + * void PUBLISH ( uint16_t topicId, uint8_t* payload, + * uint16_t len, uint8_t qos, bool retain = false ); + * + * void SUBSCRIBE ( const char* topicName, TopicCallback onPublish, + * uint8_t qos ); + * + * void UNSUBSCRIBE( const char* topicName ); + * + * void DISCONNECT ( uint16_t sleepInSecs ); + * + * void CONNECT ( void ); + * + * void DISPLAY( format, .....); <== instead of printf() + * + * + * Contributors: + * Tomoaki Yamaguchi - initial API and implementation + ***************************************************************************/ + +#include "LMqttsnClientApp.h" +#include "LMqttsnClient.h" +#include "LScreen.h" + +using namespace std; +using namespace linuxAsyncClient; +extern LMqttsnClient* theClient; +extern LScreen* theScreen; + +/*------------------------------------------------------ + * UDP Configuration (theNetcon) + *------------------------------------------------------*/ +UDPCONF = { + "GatewayTestPubClient", // ClientId + {225,1,1,1}, // Multicast group IP + 1883, // Multicast group Port + 20001, // Local PortNo +}; + +/*------------------------------------------------------ + * Client Configuration (theMqcon) + *------------------------------------------------------*/ +MQTTSNCONF = { + 300, //KeepAlive [seconds] + true, //Clean session + 300, //Sleep duration [seconds] + "", //WillTopic + "", //WillMessage + 0, //WillQos + false //WillRetain +}; + +/*------------------------------------------------------ + * Define Topics + *------------------------------------------------------*/ +const char* topic1 = "ty4tw/topic1"; +const char* topic2 = "ty4tw/topic2"; +const char* topic3 = "ty4tw/topic3"; + + +/*------------------------------------------------------ + * Callback routines for Subscribed Topics + *------------------------------------------------------*/ + +/*------------------------------------------------------ + * A Link list of Callback routines and Topics + *------------------------------------------------------*/ + +SUBSCRIBE_LIST = {// e.g. SUB(topic, callback, QoS), + END_OF_SUBSCRIBE_LIST + }; + + +/*------------------------------------------------------ + * Test functions + *------------------------------------------------------*/ + +void publishTopic1(void) +{ + char payload[300]; + sprintf(payload, "publish \"ty4tw/Topic1\" \n"); + uint8_t qos = 0; + PUBLISH(topic1,(uint8_t*)payload, strlen(payload), qos); +} + +void publishTopic2(void) +{ + char payload[300]; + sprintf(payload, "publish \"ty4tw/topic2\" \n"); + uint8_t qos = 0; + PUBLISH(topic2,(uint8_t*)payload, strlen(payload), qos); +} + + +void disconnect(void) +{ + DISCONNECT(0); +} + + +/*------------------------------------------------------ + * A List of Test functions is valid in case of + * line 23 of LMqttsnClientApp.h is commented out. + * //#define CLIENT_MODE + *------------------------------------------------------*/ + +TEST_LIST = {// e.g. TEST( Label, Test), + TEST("Step1:Publish topic1", publishTopic1), + TEST("Step2:Publish topic2", publishTopic2), + TEST("Step3:Publish topic2", publishTopic2), + TEST("Step4:Disconnect", disconnect), + END_OF_TEST_LIST + }; + + +/*------------------------------------------------------ + * List of tasks is valid in case of line23 of + * LMqttsnClientApp.h is uncommented. + * #define CLIENT_MODE + *------------------------------------------------------*/ +TASK_LIST = {// e.g. TASK( task, executing duration in second), + TASK(publishTopic1, 4), // publishTopic1() is executed every 4 seconds + TASK(publishTopic2, 7), // publishTopic2() is executed every 7 seconds + END_OF_TASK_LIST + }; + + +/*------------------------------------------------------ + * Initialize function + *------------------------------------------------------*/ +void setup(void) +{ + +} + + +/***************** END OF PROGRAM ********************/ diff --git a/MQTTSNGateway/GatewayTester/samples/ClientSub/mainSub.cpp b/MQTTSNGateway/GatewayTester/samples/ClientSub/mainSub.cpp new file mode 100644 index 0000000..e61f4eb --- /dev/null +++ b/MQTTSNGateway/GatewayTester/samples/ClientSub/mainSub.cpp @@ -0,0 +1,188 @@ +/**************************************************************************** + * 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. + * + *--------------------------------------------------------------------------- + * + * MQTT-SN GATEWAY TEST CLIENT + * + * Supported functions. + * + * void PUBLISH ( const char* topicName, uint8_t* payload, + * uint16_t len, uint8_t qos, bool retain = false ); + * + * void PUBLISH ( uint16_t topicId, uint8_t* payload, + * uint16_t len, uint8_t qos, bool retain = false ); + * + * void SUBSCRIBE ( const char* topicName, TopicCallback onPublish, + * uint8_t qos ); + * + * void UNSUBSCRIBE( const char* topicName ); + * + * void DISCONNECT ( uint16_t sleepInSecs ); + * + * void CONNECT ( void ); + * + * void DISPLAY( format, .....); <== instead of printf() + * + * + * Contributors: + * Tomoaki Yamaguchi - initial API and implementation + ***************************************************************************/ + +#include "LMqttsnClientApp.h" +#include "LMqttsnClient.h" +#include "LScreen.h" + +using namespace std; +using namespace linuxAsyncClient; +extern LMqttsnClient* theClient; +extern LScreen* theScreen; + +/*------------------------------------------------------ + * UDP Configuration (theNetcon) + *------------------------------------------------------*/ +UDPCONF = { + "ty4twGatewaySubClient", // ClientId + {225,1,1,1}, // Multicast group IP + 1883, // Multicast group Port + 20002, // Local PortNo +}; + +/*------------------------------------------------------ + * Client Configuration (theMqcon) + *------------------------------------------------------*/ +MQTTSNCONF = { + 300, //KeepAlive [seconds] + false, //Clean session + 300, //Sleep duration [seconds] + "", //WillTopic + "", //WillMessage + 0, //WillQos + false //WillRetain +}; + +/*------------------------------------------------------ + * Define Topics + *------------------------------------------------------*/ +const char* topic1 = "ty4tw/topic1"; +const char* topic2 = "ty4tw/topic2"; +const char* topic3 = "ty4tw/topic3"; +const char* topic4 = "a"; +const char* topic5 = "#"; + + +/*------------------------------------------------------ + * Callback routines for Subscribed Topics + *------------------------------------------------------*/ +int on_Topic01(uint8_t* pload, uint16_t ploadlen) +{ + DISPLAY("\n\nTopic1 recv.\n"); + char c = pload[ploadlen-1]; + pload[ploadlen-1]= 0; // set null terminator + DISPLAY("Payload -->%s%c<--\n\n",pload, c); + return 0; +} + +int on_Topic02(uint8_t* pload, uint16_t ploadlen) +{ + DISPLAY("\n\nTopic2 recv.\n"); + pload[ploadlen-1]= 0; // set null terminator + DISPLAY("Payload -->%s <--\n\n",pload); + return 0; +} + +int on_Topic03(uint8_t* pload, uint16_t ploadlen) +{ + DISPLAY("\n\nNew callback recv TopicA\n"); + pload[ploadlen-1]= 0; // set null terminator + DISPLAY("Payload -->%s <--\n\n",pload); + return 0; +} + +/*------------------------------------------------------ + * A Link list of Callback routines and Topics + *------------------------------------------------------*/ + +SUBSCRIBE_LIST = {// e.g. SUB(topic, callback, QoS), + //SUB(topic1, on_Topic01, 1), + //SUB(topic4, on_Topic03, 1), + END_OF_SUBSCRIBE_LIST + }; + + +/*------------------------------------------------------ + * Test functions + *------------------------------------------------------*/ + + +void subscribeTopic1(void) +{ + uint8_t qos = 1; + SUBSCRIBE(topic1, on_Topic01, qos); +} + +void subscribeTopic2(void) +{ + uint8_t qos = 1; + SUBSCRIBE(topic2, on_Topic02, qos); +} + + +void disconnect(void) +{ + DISCONNECT(0); +} + +void connect(void) +{ + CONNECT(); +} + +void asleep(void) +{ + DISCONNECT(theMqcon.sleepDuration); +} + +/*------------------------------------------------------ + * A List of Test functions is valid in case of + * line 23 of LMqttsnClientApp.h is commented out. + * //#define CLIENT_MODE + *------------------------------------------------------*/ + +TEST_LIST = {// e.g. TEST( Label, Test), + TEST("Step1:Subscribe topic1", subscribeTopic1), + //TEST("Step2:Subscribe topic2", subscribeTopic2), + TEST("Step2:Disconnect", disconnect), + END_OF_TEST_LIST + }; + + +/*------------------------------------------------------ + * List of tasks is valid in case of line23 of + * LMqttsnClientApp.h is uncommented. + * #define CLIENT_MODE + *------------------------------------------------------*/ +TASK_LIST = {// e.g. TASK( task, executing duration in second), + END_OF_TASK_LIST + }; + + +/*------------------------------------------------------ + * Initialize function + *------------------------------------------------------*/ +void setup(void) +{ + +} + + +/***************** END OF PROGRAM ********************/ diff --git a/MQTTSNGateway/GatewayTester/samples/mainTest.cpp b/MQTTSNGateway/GatewayTester/samples/mainTest.cpp index 6081a44..fa999f1 100644 --- a/MQTTSNGateway/GatewayTester/samples/mainTest.cpp +++ b/MQTTSNGateway/GatewayTester/samples/mainTest.cpp @@ -29,6 +29,8 @@ * * void DISCONNECT ( uint16_t sleepInSecs ); * + * void CONNECT ( void ); + * * void DISPLAY( format, .....); <== instead of printf() * * diff --git a/MQTTSNGateway/GatewayTester/src/LGwProxy.cpp b/MQTTSNGateway/GatewayTester/src/LGwProxy.cpp index 7f5add1..5ee7f99 100644 --- a/MQTTSNGateway/GatewayTester/src/LGwProxy.cpp +++ b/MQTTSNGateway/GatewayTester/src/LGwProxy.cpp @@ -57,6 +57,7 @@ LGwProxy::LGwProxy(){ _connectRetry = MQTTSN_RETRY_COUNT; _tSleep = 0; _tWake = 0; + _initialized = 0; } LGwProxy::~LGwProxy(){ @@ -72,6 +73,7 @@ void LGwProxy::initialize(LUdpConfig netconf, LMqttsnConfig mqconf){ _retainWill = mqconf.willRetain; _cleanSession = mqconf.cleanSession; _tkeepAlive = mqconf.keepAlive; + _initialized = 1; } void LGwProxy::connect(){ @@ -170,8 +172,13 @@ int LGwProxy::getConnectResponce(void){ _tSleep = 0; }else{ DISPLAY("\033[0m\033[0;32m\n\n Connected to the Broker\033[0m\033[0;37m\n\n"); - _topicTbl.clearTopic(); - theClient->onConnect(); // SUBSCRIBEs are conducted + + if ( _cleanSession || _initialized == 1 ) + { + _topicTbl.clearTopic(); + _initialized = 0; + theClient->onConnect(); // SUBSCRIBEs are conducted + } } }else{ _status = GW_CONNECTING; @@ -483,3 +490,5 @@ void LGwProxy::setPingReqTimer(void){ const char* LGwProxy::getClientId(void) { return _clientId; } + + diff --git a/MQTTSNGateway/GatewayTester/src/LGwProxy.h b/MQTTSNGateway/GatewayTester/src/LGwProxy.h index 2c45001..ac906e4 100644 --- a/MQTTSNGateway/GatewayTester/src/LGwProxy.h +++ b/MQTTSNGateway/GatewayTester/src/LGwProxy.h @@ -88,6 +88,7 @@ private: const char* _willTopic; const char* _willMsg; uint8_t _cleanSession; + uint8_t _initialized; uint8_t _retainWill; uint8_t _qosWill; uint8_t _gwId; diff --git a/MQTTSNGateway/GatewayTester/src/LMqttsnClient.cpp b/MQTTSNGateway/GatewayTester/src/LMqttsnClient.cpp index 78b8a69..286fe74 100644 --- a/MQTTSNGateway/GatewayTester/src/LMqttsnClient.cpp +++ b/MQTTSNGateway/GatewayTester/src/LMqttsnClient.cpp @@ -222,7 +222,7 @@ void LMqttsnClient::setSleepDuration(uint32_t duration) void LMqttsnClient::onConnect(void) { - _subMgr.onConnect(); + _subMgr.onConnect(); } const char* LMqttsnClient::getClientId(void) @@ -230,6 +230,8 @@ const char* LMqttsnClient::getClientId(void) return _gwProxy.getClientId(); } - - +uint16_t LMqttsnClient::getTopicId(const char* topicName) +{ + return _gwProxy.getTopicTable()->getTopicId(topicName); +} diff --git a/MQTTSNGateway/GatewayTester/src/LMqttsnClient.h b/MQTTSNGateway/GatewayTester/src/LMqttsnClient.h index cf93048..9c6c424 100644 --- a/MQTTSNGateway/GatewayTester/src/LMqttsnClient.h +++ b/MQTTSNGateway/GatewayTester/src/LMqttsnClient.h @@ -62,6 +62,7 @@ public: void setSleepMode(uint32_t duration); void sleep(void); const char* getClientId(void); + uint16_t getTopicId(const char* topicName); LGwProxy* getGwProxy(void); LPublishManager* getPublishManager(void); LSubscribeManager* getSubscribeManager(void); diff --git a/MQTTSNGateway/GatewayTester/src/LMqttsnClientApp.h b/MQTTSNGateway/GatewayTester/src/LMqttsnClientApp.h index 254f171..691d330 100644 --- a/MQTTSNGateway/GatewayTester/src/LMqttsnClientApp.h +++ b/MQTTSNGateway/GatewayTester/src/LMqttsnClientApp.h @@ -79,6 +79,7 @@ struct LUdpConfig{ #define MQTTSN_CONFIG MqttsnConfig theMqttsnConfig #define NETWORK_CONFIG UdpConfig theNetworkConfig +#define CONNECT(...) theClient->getGwProxy()->connect(__VA_ARGS__) #define PUBLISH(...) theClient->publish(__VA_ARGS__) #define SUBSCRIBE(...) theClient->subscribe(__VA_ARGS__) #define UNSUBSCRIBE(...) theClient->unsubscribe(__VA_ARGS__) diff --git a/MQTTSNGateway/GatewayTester/src/LPublishManager.cpp b/MQTTSNGateway/GatewayTester/src/LPublishManager.cpp index d59dc02..8032b61 100644 --- a/MQTTSNGateway/GatewayTester/src/LPublishManager.cpp +++ b/MQTTSNGateway/GatewayTester/src/LPublishManager.cpp @@ -441,6 +441,15 @@ PubElement* LPublishManager::add(const char* topicName, uint16_t topicId, uint8_ elm->status = TOPICID_IS_READY; elm->topicId = topicId; } + else + { + uint16_t id = theClient->getTopicId(topicName); + if ( id ) + { + elm->status = TOPICID_IS_READY; + elm->topicId = id; + } + } elm->payloadlen = len; elm->msgId = msgId; diff --git a/MQTTSNGateway/src/MQTTSNGWClientRecvTask.cpp b/MQTTSNGateway/src/MQTTSNGWClientRecvTask.cpp index 4dda1d0..0fcf65a 100644 --- a/MQTTSNGateway/src/MQTTSNGWClientRecvTask.cpp +++ b/MQTTSNGateway/src/MQTTSNGWClientRecvTask.cpp @@ -103,7 +103,7 @@ void ClientRecvTask::run() else { /* new client */ - if (packet->getType() == MQTTSN_CONNECT) + if (packet->getType() == MQTTSN_CONNECT) { MQTTSNPacket_connectData data; memset(&data, 0, sizeof(MQTTSNPacket_connectData)); diff --git a/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp b/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp index 68c01bc..8118124 100644 --- a/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp +++ b/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp @@ -74,7 +74,7 @@ void ClientSendTask::run() if ( rc < 0 ) { - WRITELOG("%s ClientSendTask can't send a packet to the client.\n", + WRITELOG("%s ClientSendTask can't send a packet to the client %s%s.\n", ERRMSG_HEADER, (client ? (const char*)client->getClientId() : UNKNOWNCL ), ERRMSG_FOOTER); } delete ev; diff --git a/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp b/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp index 6fb473e..47cca8f 100644 --- a/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp +++ b/MQTTSNGateway/src/MQTTSNGWConnectionHandler.cpp @@ -234,8 +234,9 @@ void MQTTSNConnectionHandler::handleDisconnect(Client* client, MQTTSNPacket* pac MQTTSNPacket* snMsg = new MQTTSNPacket(); snMsg->setDISCONNECT(0); - ev->setClientSendEvent(client, snMsg); - _gateway->getClientSendQue()->post(ev); + Event* evt = new Event(); + evt->setClientSendEvent(client, snMsg); + _gateway->getClientSendQue()->post(evt); } /*