diff --git a/MQTTSNGateway/GatewayTester/src/LGwProxy.h b/MQTTSNGateway/GatewayTester/src/LGwProxy.h index 41d6078..2c45001 100644 --- a/MQTTSNGateway/GatewayTester/src/LGwProxy.h +++ b/MQTTSNGateway/GatewayTester/src/LGwProxy.h @@ -19,6 +19,7 @@ #include #include +#include #include "LMqttsnClientApp.h" #include "LNetworkUdp.h" @@ -92,11 +93,11 @@ private: uint8_t _gwId; uint16_t _tkeepAlive; uint32_t _tAdv; - uint32_t _sendUTC; + time_t _sendUTC; int _retryCount; int _connectRetry; uint8_t _status; - uint32_t _pingSendUTC; + time_t _pingSendUTC; uint8_t _pingRetryCount; uint8_t _pingStatus; LRegisterManager _regMgr; diff --git a/MQTTSNGateway/GatewayTester/src/LPublishManager.h b/MQTTSNGateway/GatewayTester/src/LPublishManager.h index b6015ee..231f601 100644 --- a/MQTTSNGateway/GatewayTester/src/LPublishManager.h +++ b/MQTTSNGateway/GatewayTester/src/LPublishManager.h @@ -16,6 +16,7 @@ #ifndef PUBLISHMANAGER_H_ #define PUBLISHMANAGER_H_ +#include #include "LMqttsnClientApp.h" #include "LTimer.h" #include "LTopicTable.h" @@ -42,7 +43,7 @@ typedef struct PubElement{ const char* topicName; uint8_t* payload; uint16_t payloadlen; - uint32_t sendUTC; + time_t sendUTC; int (*callback)(void); int retryCount; int taskIndex; diff --git a/MQTTSNGateway/GatewayTester/src/LRegisterManager.h b/MQTTSNGateway/GatewayTester/src/LRegisterManager.h index d58c041..5e2234a 100644 --- a/MQTTSNGateway/GatewayTester/src/LRegisterManager.h +++ b/MQTTSNGateway/GatewayTester/src/LRegisterManager.h @@ -17,6 +17,7 @@ #ifndef REGISTERQUE_H_ #define REGISTERQUE_H_ +#include #include "LMqttsnClientApp.h" namespace linuxAsyncClient { @@ -27,7 +28,7 @@ typedef struct RegQueElement{ const char* topicName; uint16_t msgId; int retryCount; - uint32_t sendUTC; + time_t sendUTC; RegQueElement* prev; RegQueElement* next; }RegQueElement; diff --git a/MQTTSNGateway/GatewayTester/src/LSubscribeManager.h b/MQTTSNGateway/GatewayTester/src/LSubscribeManager.h index 8bb35a3..be6eae3 100644 --- a/MQTTSNGateway/GatewayTester/src/LSubscribeManager.h +++ b/MQTTSNGateway/GatewayTester/src/LSubscribeManager.h @@ -19,6 +19,7 @@ #include #include +#include #include "LMqttsnClientApp.h" #include "LRegisterManager.h" @@ -33,7 +34,7 @@ typedef struct SubElement{ TopicCallback callback; const char* topicName; uint16_t msgId; - uint32_t sendUTC; + time_t sendUTC; uint16_t topicId; uint8_t msgType; uint8_t topicType; diff --git a/MQTTSNGateway/GatewayTester/src/LTaskManager.h b/MQTTSNGateway/GatewayTester/src/LTaskManager.h index d65f6a6..3303c92 100644 --- a/MQTTSNGateway/GatewayTester/src/LTaskManager.h +++ b/MQTTSNGateway/GatewayTester/src/LTaskManager.h @@ -19,6 +19,7 @@ #include #include +#include #include "LMqttsnClientApp.h" #include "LTimer.h" @@ -29,8 +30,8 @@ namespace linuxAsyncClient { struct TaskList{ void (*callback)(void); - uint32_t interval; - uint32_t prevTime; + time_t interval; + time_t prevTime; uint8_t count; }; diff --git a/MQTTSNGateway/GatewayTester/src/LTimer.cpp b/MQTTSNGateway/GatewayTester/src/LTimer.cpp index 781693b..346f181 100644 --- a/MQTTSNGateway/GatewayTester/src/LTimer.cpp +++ b/MQTTSNGateway/GatewayTester/src/LTimer.cpp @@ -16,10 +16,12 @@ #include #include +#include + #include "LMqttsnClientApp.h" #include "LTimer.h" -using namespace std; +//using namespace std; using namespace linuxAsyncClient; /*===================================== diff --git a/MQTTSNGateway/GatewayTester/src/LTimer.h b/MQTTSNGateway/GatewayTester/src/LTimer.h index cb44cc0..9c666cf 100644 --- a/MQTTSNGateway/GatewayTester/src/LTimer.h +++ b/MQTTSNGateway/GatewayTester/src/LTimer.h @@ -17,7 +17,7 @@ #ifndef TIMER_H_ #define TIMER_H_ -#include +#include #include "LMqttsnClientApp.h" diff --git a/MQTTSNGateway/Makefile b/MQTTSNGateway/Makefile index 0591067..fa5ad97 100644 --- a/MQTTSNGateway/Makefile +++ b/MQTTSNGateway/Makefile @@ -62,14 +62,16 @@ $(SUBDIR)/MQTTSNUnsubscribeServer.c CXX := g++ CPPFLAGS += -INCLUDES += -I$(SRCDIR) \ +INCLUDE := +INCLUDES += $(INCLUDE) -I$(SRCDIR) \ -I$(SRCDIR)/$(OS) \ -I$(SRCDIR)/$(OS)/$(SENSORNET) \ -I$(SUBDIR) \ -I$(SRCDIR)/$(TEST) DEFS := -LIBS += -L/usr/local/lib +LIB := +LIBS += $(LIB) -L/usr/local/lib LDFLAGS := CXXFLAGS := -Wall -O3 -std=c++11 LDADD := -lpthread -lssl -lcrypto -lrt diff --git a/MQTTSNGateway/src/MQTTGWPacket.cpp b/MQTTSNGateway/src/MQTTGWPacket.cpp index 8bba53f..55532fc 100644 --- a/MQTTSNGateway/src/MQTTGWPacket.cpp +++ b/MQTTSNGateway/src/MQTTGWPacket.cpp @@ -500,6 +500,7 @@ char* MQTTGWPacket::getMsgId(char* pbuf) { case PUBLISH: Publish pub; + pub.msgId = 0; getPUBLISH(&pub); if ( _header.bits.dup ) { @@ -533,8 +534,8 @@ char* MQTTGWPacket::print(char* pbuf) char* ptr = pbuf; char** pptr = &pbuf; int len = getPacketData(packetData); - - for (int i = 0; i < len; i++) + int size = len > SIZE_OF_LOG_PACKET ? SIZE_OF_LOG_PACKET : len; + for (int i = 0; i < size; i++) { sprintf(*pptr, " %02X", packetData[i]); *pptr += 3; diff --git a/MQTTSNGateway/src/MQTTGWPublishHandler.cpp b/MQTTSNGateway/src/MQTTGWPublishHandler.cpp index cfd6772..c6ebcef 100644 --- a/MQTTSNGateway/src/MQTTGWPublishHandler.cpp +++ b/MQTTSNGateway/src/MQTTGWPublishHandler.cpp @@ -122,7 +122,7 @@ void MQTTGWPublishHandler::handlePublish(Client* client, MQTTGWPacket* packet) if (id > 0) { - /* create REGACK */ + /* create REGISTER */ MQTTSNPacket* regPacket = new MQTTSNPacket(); MQTTSNString topicName; @@ -143,6 +143,7 @@ void MQTTGWPublishHandler::handlePublish(Client* client, MQTTGWPacket* packet) (uint8_t) pub.header.bits.retain, (uint16_t) pub.msgId, topicId, (uint8_t*) pub.payload, pub.payloadlen); client->getWaitREGACKPacketList()->setPacket(snPacket, regackMsgId); + return; } else { diff --git a/MQTTSNGateway/src/MQTTSNGWClient.cpp b/MQTTSNGateway/src/MQTTSNGWClient.cpp index d31e3f0..9a8a043 100644 --- a/MQTTSNGateway/src/MQTTSNGWClient.cpp +++ b/MQTTSNGateway/src/MQTTSNGWClient.cpp @@ -227,6 +227,14 @@ Client* ClientList::createClient(SensorNetAddress* addr, MQTTSNString* clientId, { client->setClientId(*clientId); } + else + { + MQTTSNString dummyId; + dummyId.cstring = strdup(""); + dummyId.lenstring.len = 0; + client->setClientId(dummyId); + free(dummyId.cstring); + } /* add the list */ if ( _firstClient == 0 ) diff --git a/MQTTSNGateway/src/MQTTSNGWPacketHandleTask.cpp b/MQTTSNGateway/src/MQTTSNGWPacketHandleTask.cpp index 5149a85..43cdd24 100644 --- a/MQTTSNGateway/src/MQTTSNGWPacketHandleTask.cpp +++ b/MQTTSNGateway/src/MQTTSNGWPacketHandleTask.cpp @@ -167,7 +167,7 @@ void PacketHandleTask::run() _mqttsnPublish->handleRegister(client, snPacket); break; case MQTTSN_REGACK: - // NOP + _mqttsnPublish->handleRegAck(client, snPacket); break; case MQTTSN_SUBSCRIBE: _mqttsnSubscribe->handleSubscribe(client, snPacket); diff --git a/MQTTSNGateway/src/MQTTSNGWPublishHandler.cpp b/MQTTSNGateway/src/MQTTSNGWPublishHandler.cpp index 52dff3e..ea7f9b0 100644 --- a/MQTTSNGateway/src/MQTTSNGWPublishHandler.cpp +++ b/MQTTSNGateway/src/MQTTSNGWPublishHandler.cpp @@ -245,5 +245,28 @@ void MQTTSNPublishHandler::handleRegister(Client* client, MQTTSNPacket* packet) ev->setClientSendEvent(client, regAck); _gateway->getClientSendQue()->post(ev); } +} + +void MQTTSNPublishHandler::handleRegAck( Client* client, MQTTSNPacket* packet) +{ + uint16_t id; + uint16_t msgId; + uint8_t rc; + if ( client->isActive() || client->isAwake()) + { + if ( packet->getREGACK(&id, &msgId, &rc) == 0 ) + { + return; + } + + MQTTSNPacket* regAck = client->getWaitREGACKPacketList()->getPacket(msgId); + if ( regAck != 0 ) + { + client->getWaitREGACKPacketList()->erase(msgId); + Event* ev = new Event(); + ev->setClientSendEvent(client, regAck); + _gateway->getClientSendQue()->post(ev); + } + } } diff --git a/MQTTSNGateway/src/MQTTSNGWPublishHandler.h b/MQTTSNGateway/src/MQTTSNGWPublishHandler.h index 7213cbe..f7fc2d8 100644 --- a/MQTTSNGateway/src/MQTTSNGWPublishHandler.h +++ b/MQTTSNGateway/src/MQTTSNGWPublishHandler.h @@ -31,7 +31,7 @@ public: void handlePuback(Client* client, MQTTSNPacket* packet); void handleAck(Client* client, MQTTSNPacket* packet, uint8_t packetType); void handleRegister(Client* client, MQTTSNPacket* packet); - + void handleRegAck( Client* client, MQTTSNPacket* packet); private: Gateway* _gateway; };