diff --git a/.cproject b/.cproject
index 78de229..62eba26 100644
--- a/.cproject
+++ b/.cproject
@@ -133,7 +133,7 @@
-
+
@@ -277,7 +277,7 @@
-
+
diff --git a/MQTTSNGateway/GatewayTester/samples/mainTest.cpp b/MQTTSNGateway/GatewayTester/samples/mainTest.cpp
index 06aa565..934a419 100644
--- a/MQTTSNGateway/GatewayTester/samples/mainTest.cpp
+++ b/MQTTSNGateway/GatewayTester/samples/mainTest.cpp
@@ -138,7 +138,7 @@ void publishTopic1(void)
PUBLISH(topic1,(uint8_t*)payload, strlen(payload), QoS0);
}
-void subscribeTopic2(void)
+void subscribeTopic10(void)
{
SUBSCRIBE(10, on_Topic02, QoS1);
}
@@ -190,7 +190,7 @@ TEST_LIST = {// e.g. TEST( Label, Test),
TEST("Step0:Subscribe predef topic1", subscribePredefTopic1),
TEST("Step1:Publish topic1", publishTopic1),
TEST("Step2:Publish topic2", publishTopic2),
- TEST("Step3:Subscribe topic2", subscribeTopic2),
+ TEST("Step3:Subscribe PreDefined topic10. ID is not defined.", subscribeTopic10),
TEST("Step4:Publish topic2", publishTopic2),
TEST("Step5:Unsubscribe topic2", unsubscribe),
TEST("Step6:Publish topic2", publishTopic2),
diff --git a/MQTTSNGateway/README.md b/MQTTSNGateway/README.md
index af6094d..d549065 100644
--- a/MQTTSNGateway/README.md
+++ b/MQTTSNGateway/README.md
@@ -7,10 +7,13 @@ This Gateway can run as a transparent or aggrigating Gateway by specifying the g
````
$ git clone -b experiment https://github.com/eclipse/paho.mqtt-sn.embedded-c
$ cd paho.mqtt-sn.embedded-c/MQTTSNGateway
-$ make
+$ make [SENSORNET={udp6|xbee}]
$ make install
$ make clean
````
+By default, a gateway for UDP is built.
+In order to create a gateway for UDP6 or XBee, SENSORNET argument is required.
+
MQTT-SNGateway, MQTT-SNLogmonitor and *.conf files are copied into ../ directory.
If you want to install the gateway into specific directories, enter a command line as follows:
````
@@ -91,18 +94,15 @@ When **QoS-1** is **YES**, QoS-1 PUBLISH is available. All clients which send Qo
When **PredefinedTopic** is **YES**, **Pre-definedTopicId**s specified by **PredefinedTopicList** are 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 must be declared by a **ClientsList** file.
-
### ** How to monitor the gateway from remote. **
-
-Uncomment line32 in MQTTSNGWDefined.h.
-
-`//#define RINGBUFFER // print out Packets log into shared memory./"`
-````
-$ make
-$ make install
-$ make clean
+Change gateway.conf as follows:
+```
+# LOG
+ShearedMemory=YES;
````
-restart the gateway.
+
+Restart the gateway with sudo only once to create shared memories.
+
open ssh terminal and execute LogMonitor.
`$ ./MQTT-SNLogmonitor`
@@ -110,3 +110,15 @@ open ssh terminal and execute LogMonitor.
Now you can get the Log on your terminal.
+## ** Tips **
+Uncomment the line 62, 63 in MQTTSNDefines.h then you can get more precise logs.
+```
+/*=================================
+ * Log controls
+ ==================================*/
+//#define DEBUG // print out log for debug
+//#define DEBUG_NWSTACK // print out SensorNetwork log
+```
+
+
+
diff --git a/MQTTSNGateway/clients.conf b/MQTTSNGateway/clients.conf
index ddb2310..a2c005c 100644
--- a/MQTTSNGateway/clients.conf
+++ b/MQTTSNGateway/clients.conf
@@ -14,7 +14,7 @@
# File format is:
# Lines bigning with # are comment line.
# ClientId, SensorNetAddress, "unstableLine", "secureConnection"
-# in case of UDP, SensorNetAddress format is portNo@IPAddress.
+# in case of UDP, SensorNetAddress format is IPAddress: port no.
# if the SensorNetwork is not stable, write "unstableLine".
# if Broker's Connection is SSL, write "secureConnection".
# if the client is a forwarder, "forwarder" is required.
@@ -22,12 +22,12 @@
#
# Ex:
# #Client List
-# ClientId1,11200@192.168.10.10
-# ClientID2,35000@192.168.50.200,unstableLine
-# ClientID3,40000@192.168.200.50,secureConnection
-# ClientID4,41000@192.168.200.52,unstableLine,secureConnection
-# ClientID5,41000@192.168.200.53,unstableLine,secureConnection,QoS-1
-# ClientID6,41000@192.168.200.54,unstableLine,secureConnection,forwarder
+# ClientId1,192.168.10.10:11200
+# ClientID2,192.168.50.200:35000,unstableLine
+# ClientID3,192.168.200.50:40000,secureConnection
+# ClientID4,192.168.200.52:41000,unstableLine,secureConnection
+# ClientID5,192.168.200.53:41000,unstableLine,secureConnection,QoS-1
+# ClientID6,192.168.200.54:41000,unstableLine,secureConnection,forwarder
#
# SensorNetwork address format is defined by SensorNetAddress::setAddress(string* data) function.
#
diff --git a/MQTTSNGateway/gateway.conf b/MQTTSNGateway/gateway.conf
index c06853b..d01903a 100644
--- a/MQTTSNGateway/gateway.conf
+++ b/MQTTSNGateway/gateway.conf
@@ -1,5 +1,5 @@
#**************************************************************************
-# Copyright (c) 2016-2018, Tomoaki Yamaguchi
+# Copyright (c) 2016-2019, Tomoaki Yamaguchi
#
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
@@ -14,7 +14,7 @@
# config file of MQTT-SN Gateway
#
-BrokerName=iot.eclipse.org
+BrokerName=mqtt.eclipse.org
BrokerPortNo=1883
BrokerSecurePortNo=8883
@@ -50,6 +50,12 @@ GatewayPortNo=10000
MulticastIP=225.1.1.1
MulticastPortNo=1883
+# UDP6
+GatewayUDP6Bind=FFFF:FFFE::1
+GatewayUDP6Port=10000
+GatewayUDP6Broadcast=FF02::1
+GatewayUDP6If=wpan0
+
# XBee
Baudrate=38400
SerialDevice=/dev/ttyUSB0
diff --git a/MQTTSNGateway/src/MQTTSNGWClientList.cpp b/MQTTSNGateway/src/MQTTSNGWClientList.cpp
index e4e0bb9..5452765 100644
--- a/MQTTSNGateway/src/MQTTSNGWClientList.cpp
+++ b/MQTTSNGateway/src/MQTTSNGWClientList.cpp
@@ -416,9 +416,9 @@ Client* ClientList::createClient(SensorNetAddress* addr, MQTTSNString* clientId,
Client* ClientList::createPredefinedTopic( MQTTSNString* clientId, string topicName, uint16_t topicId, bool aggregate)
{
- if ( clientId->cstring == common_topic )
+ if ( strcmp(clientId->cstring, common_topic) == 0 )
{
- _gateway->getTopics()->add((const char*)topicName.c_str(), topicId);
+ theGateway->getTopics()->add((const char*)topicName.c_str(), topicId);
return 0;
}
else
diff --git a/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp b/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp
index fc8c412..eaa6e68 100644
--- a/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp
+++ b/MQTTSNGateway/src/MQTTSNGWClientSendTask.cpp
@@ -18,6 +18,7 @@
#include "MQTTSNGateway.h"
#include "MQTTSNGWEncapsulatedPacket.h"
#include "MQTTSNGWQoSm1Proxy.h"
+#include
using namespace MQTTSNGW;
using namespace std;
@@ -75,8 +76,8 @@ void ClientSendTask::run()
if ( rc < 0 )
{
- WRITELOG("%s ClientSendTask can't send a packet to the client %s%s.\n",
- ERRMSG_HEADER, (client ? (const char*)client->getClientId() : UNKNOWNCL ), ERRMSG_FOOTER);
+ WRITELOG("%s ClientSendTask can't send a packet to the client %s. Error=%d%s\n",
+ ERRMSG_HEADER, (client ? (const char*)client->getClientId() : UNKNOWNCL ), errno, ERRMSG_FOOTER);
}
delete ev;
}
diff --git a/MQTTSNGateway/src/MQTTSNGWLogmonitor.cpp b/MQTTSNGateway/src/MQTTSNGWLogmonitor.cpp
index 50dc482..692e3fe 100644
--- a/MQTTSNGateway/src/MQTTSNGWLogmonitor.cpp
+++ b/MQTTSNGateway/src/MQTTSNGWLogmonitor.cpp
@@ -13,8 +13,6 @@
* Contributors:
* Tomoaki Yamaguchi - initial API and implementation and/or initial documentation
**************************************************************************************/
-#define RINGBUFFER
-
#include "MQTTSNGWProcess.h"
#include "MQTTSNGWLogmonitor.h"
#include
diff --git a/MQTTSNGateway/src/MQTTSNGWSubscribeHandler.cpp b/MQTTSNGateway/src/MQTTSNGWSubscribeHandler.cpp
index cd4bc30..dceb864 100644
--- a/MQTTSNGateway/src/MQTTSNGWSubscribeHandler.cpp
+++ b/MQTTSNGateway/src/MQTTSNGWSubscribeHandler.cpp
@@ -60,25 +60,22 @@ MQTTGWPacket* MQTTSNSubscribeHandler::handleSubscribe(Client* client, MQTTSNPack
{
topic = client->getTopics()->getTopicById(&topicFilter);
-
- if ( topic )
- {
- topicId = topic->getTopicId();
- subscribe = new MQTTGWPacket();
- subscribe->setSUBSCRIBE((char*)topic->getTopicName()->c_str(), (uint8_t)qos, (uint16_t)msgId);
- }
- else
+ if ( !topic )
{
topic = _gateway->getTopics()->getTopicById(&topicFilter);
- if ( !topic )
- {
+ if ( topic )
+ {
topic = client->getTopics()->add(topic->getTopicName()->c_str(), topic->getTopicId());
}
- else
- {
- goto RespExit;
- }
+ else
+ {
+ goto RespExit;
+ }
}
+ topicId = topic->getTopicId();
+ subscribe = new MQTTGWPacket();
+ subscribe->setSUBSCRIBE((char*)topic->getTopicName()->c_str(), (uint8_t)qos, (uint16_t)msgId);
+
}
else if (topicFilter.type == MQTTSN_TOPIC_TYPE_NORMAL)
{
@@ -148,7 +145,6 @@ MQTTGWPacket* MQTTSNSubscribeHandler::handleUnsubscribe(Client* client, MQTTSNPa
return nullptr;
}
- Topic* topic = client->getTopics()->getTopicById(&topicFilter);
if (topicFilter.type == MQTTSN_TOPIC_TYPE_SHORT)
{
@@ -161,6 +157,17 @@ MQTTGWPacket* MQTTSNSubscribeHandler::handleUnsubscribe(Client* client, MQTTSNPa
}
else
{
+ Topic* topic = nullptr;
+
+ if (topicFilter.type == MQTTSN_TOPIC_TYPE_PREDEFINED)
+ {
+ topic = client->getTopics()->getTopicById(&topicFilter);
+ }
+ else
+ {
+ topic = client->getTopics()->getTopicByName(&topicFilter);
+ }
+
if ( topic == nullptr )
{
MQTTSNPacket* sUnsuback = new MQTTSNPacket();
diff --git a/MQTTSNGateway/src/linux/udp6/SensorNetwork.cpp b/MQTTSNGateway/src/linux/udp6/SensorNetwork.cpp
index 5e56fff..e31e67b 100644
--- a/MQTTSNGateway/src/linux/udp6/SensorNetwork.cpp
+++ b/MQTTSNGateway/src/linux/udp6/SensorNetwork.cpp
@@ -66,24 +66,52 @@ void SensorNetAddress::setAddress(struct sockaddr_in6 *IpAddr, uint16_t port)
/**
* convert Text data to SensorNetAddress
- * @param buf is pointer of IP_Address:PortNo format text
+ * @param data is a IP_Address:PortNo format string
* @return success = 0, Invalid format = -1
*/
int SensorNetAddress::setAddress(string* data)
{
- const char *cstr = data->c_str();
- inet_pton(AF_INET6, cstr, &(_IpAddr.sin6_addr));
- return 0;
+
+ size_t pos = data->find_last_of(":");
+
+ if ( pos != string::npos)
+ {
+ int portNo = 0;
+ string port = data->substr(pos + 1);
+
+ if ( ( portNo = atoi(port.c_str()) ) > 0 )
+ {
+ _portNo = htons(portNo);
+
+ string ip = data->substr(1,pos - 1);
+ const char *cstr = ip.c_str();
+
+ if (inet_pton(AF_INET6, cstr, &(_IpAddr.sin6_addr)) == 1 )
+ {
+ return 0;
+ }
+ }
+ }
+ _portNo = 0;
+ memset((void *)&_IpAddr,0,sizeof(_IpAddr));
+ return -1;
}
+
/**
* convert Text data to SensorNetAddress
- * @param buf is pointer of IP_Address:PortNo format text
+ * @param data is pointer of IP_Address format text
* @return success = 0, Invalid format = -1
*/
int SensorNetAddress::setAddress(const char* data)
{
- inet_pton(AF_INET6, data, &(_IpAddr.sin6_addr));
- return 0;
+ if ( inet_pton(AF_INET6, data, &(_IpAddr.sin6_addr)) == 1 )
+ {
+ return 0;
+ }
+ else
+ {
+ return -1;
+ }
}
char* SensorNetAddress::getAddress(void)
@@ -319,7 +347,6 @@ int UDPPort6::open(const char* ipAddress, uint16_t uniPortNo, const char* broadc
return 0;
}
-//TODO: test if unicast is working too....
int UDPPort6::unicast(const uint8_t* buf, uint32_t length, SensorNetAddress* addr)
{
char destStr[INET6_ADDRSTRLEN+10];
@@ -364,8 +391,6 @@ int UDPPort6::unicast(const uint8_t* buf, uint32_t length, SensorNetAddress* add
WRITELOG("errno in UDPPort::unicast(sendto): %d, %s\n",status,strerror(status));
}
- WRITELOG("unicast sendto %s, port: %d length = %d\n", destStr,port,status);
-
return status;
}
diff --git a/MQTTSNGateway/src/tests/TestProcess.cpp b/MQTTSNGateway/src/tests/TestProcess.cpp
index 9b3bdb5..56ba0b1 100644
--- a/MQTTSNGateway/src/tests/TestProcess.cpp
+++ b/MQTTSNGateway/src/tests/TestProcess.cpp
@@ -65,7 +65,7 @@ void TestProcess::run(void)
assert(1 == getArgc() || 3 == getArgc() );
assert(0 == strcmp(ARGV, *getArgv()));
getParam("BrokerName", value);
- assert(0 == strcmp("iot.eclipse.org", value));
+ assert(0 == strcmp("mqtt.eclipse.org", value));
/* Test RingBuffer */
for ( i = 0; i < 1000; i++)