mirror of
https://github.com/eclipse/paho.mqtt-sn.embedded-c.git
synced 2025-12-15 16:36:52 +01:00
The purpose of this branch is to share work in process. Change sellect() of UDP to poll() Rewrite UDP6 for DTLS6 Known bug: can't reconnect DTLS Signed-off-by: tomoaki <tomoaki@tomy-tech.com>
This commit is contained in:
@@ -1,142 +1,211 @@
|
||||
MQTT-SN Transparent / Aggregating Gateway
|
||||
|
||||
**MQTT-SN** requires a MQTT-SN Gateway which acts as a protocol converter to convert **MQTT-SN messages to MQTT messages**. MQTT-SN client over SensorNetwork can not communicate directly with MQTT broker(TCP/IP).
|
||||
This Gateway can run as a transparent or aggregating Gateway by specifying the gateway.conf.
|
||||
|
||||
### **step1. Build the gateway**
|
||||
````
|
||||
$ git clone -b develop https://github.com/eclipse/paho.mqtt-sn.embedded-c
|
||||
$ cd paho.mqtt-sn.embedded-c/MQTTSNGateway
|
||||
# MQTT-SN Transparent / Aggregating Gateway
|
||||
MQTT-SN requires a MQTT-SN Gateway which acts as a protocol converter to convert MQTT-SN messages to MQTT messages.
|
||||
MQTT-SN client over SensorNetwork can not communicate directly with MQTT broker(TCP/IP).
|
||||
This Gateway can run as a transparent or aggregating Gateway by specifying the gateway.conf.
|
||||
### step1. Build the gateway
|
||||
copy and expand source code then,
|
||||
```
|
||||
$ cd paho.mqtt-sn.embedded-c/MQTTSNGateway
|
||||
```
|
||||
In order to build a gateway, one sensor network argument is required.
|
||||
```
|
||||
$ ./build.sh [udp|udp6|xbee|loralink|rfcomm]
|
||||
|
||||
````
|
||||
In order to build a gateway, an argument is required.
|
||||
|
||||
MQTT-SNGateway and MQTT-SNLogmonitor (executable programs) are built in the Build directory.
|
||||
|
||||
### **step2. Execute the Gateway.**
|
||||
```
|
||||
|
||||
````
|
||||
MQTT-SNGateway and MQTT-SNLogmonitor (executable programs) are built in ./bin directory.
|
||||
|
||||
### step2. Execute the Gateway.
|
||||
|
||||
```
|
||||
$ cd bin
|
||||
$ ./MQTT-SNGateway
|
||||
````
|
||||
$ ./MQTT-SNGateway
|
||||
```
|
||||
If you get the error message as follows:
|
||||
````
|
||||
RingBuffer can't create a shared memory.
|
||||
ABORT Gateway!!!
|
||||
````
|
||||
|
||||
RingBuffer can't create a shared memory. ABORT Gateway!!!
|
||||
You have to start using sudo command only once for the first time.
|
||||
````
|
||||
$ sudo ./MQTT-SNGateway
|
||||
````
|
||||
```
|
||||
$ sudo ./MQTT-SNGateway
|
||||
```
|
||||
## Contents of the gateway configuration file
|
||||
**gateway.conf** is in bin directory. It's contents are follows:
|
||||
|
||||
### **How to Change the configuration of the gateway**
|
||||
**gateway.conf** Contents are follows:
|
||||
|
||||
<pre><dev>
|
||||
```
|
||||
#**************************************************************************
|
||||
# Copyright (c) 2016-2021, 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.
|
||||
#***************************************************************************
|
||||
#
|
||||
# config file of MQTT-SN Gateway
|
||||
#
|
||||
|
||||
GatewayID=1
|
||||
GatewayName=PahoGateway-01
|
||||
MaxNumberOfClients=30
|
||||
KeepAlive=60
|
||||
#LoginID=your_ID
|
||||
#Password=your_Password
|
||||
|
||||
BrokerName=mqtt.eclipseprojects.io
|
||||
BrokerPortNo=1883
|
||||
BrokerSecurePortNo=8883
|
||||
```
|
||||
**GatewayID** is a gateway ID which used by GWINFO message.
|
||||
**GatewayName** is a name of the gateway.
|
||||
**MaxNumberOfClients** is a maxmum number of clients. Clients are dynamically allocated.
|
||||
**KeepAlive** is KeepAlive time in seconds.
|
||||
**LoginID** is used by CONNECT message.
|
||||
**Password** is used by CONNECT message.
|
||||
**BrokerName**is a domain name or IP address of a broker.
|
||||
**BrokerPortNo** is a broker's port no.
|
||||
**BrokerSecurePortNo** is a broker's port no of TLS connection.
|
||||
```
|
||||
#
|
||||
# CertsKey for TLS connections to a broker
|
||||
#
|
||||
|
||||
#RootCAfile=/etc/ssl/certs/ca-certificates.crt
|
||||
#RootCApath=/etc/ssl/certs/
|
||||
#CertsKey=/path/to/certKey.pem
|
||||
#PrivateKey=/path/to/privateKey.pem
|
||||
```
|
||||
**RootCAfile** is a CA file name.
|
||||
**RootCApath** is a CA path. **SSL_CTX_load_verify_locations(ctx, CAfile, CApath)** function requires these parameters.
|
||||
**CertsKey** is a certificate pem file.
|
||||
**PrivateKey** is a private key pem file.
|
||||
Clients can connect to the broker via TLS by setting '**Secure Connection**' for each client in the client conf file.
|
||||
```
|
||||
#
|
||||
# When AggregatingGateway=YES or ClientAuthentication=YES,
|
||||
# All clients must be specified by the ClientList File
|
||||
#
|
||||
|
||||
ClientAuthentication=NO
|
||||
AggregatingGateway=NO
|
||||
QoS-1=NO
|
||||
Forwarder=NO
|
||||
MaxNumberOfClients=30;
|
||||
|
||||
#ClientsList=/path/to/your_clients.conf
|
||||
|
||||
PredefinedTopic=NO
|
||||
#PredefinedTopicList=/path/to/your_predefinedTopic.conf
|
||||
ClientAuthentication=NO
|
||||
|
||||
#RootCAfile=/etc/ssl/certs/ca-certificates.crt
|
||||
#RootCApath=/etc/ssl/certs/
|
||||
#CertsFile=/path/to/certKey.pem
|
||||
#PrivateKey=/path/to/privateKey.pem
|
||||
|
||||
GatewayID=1
|
||||
GatewayName=PahoGateway-01
|
||||
KeepAlive=900
|
||||
#LoginID=your_ID
|
||||
#Password=your_Password
|
||||
ClientsList=/path/to/your_clients.conf
|
||||
PredefinedTopicList=/path/to/your_predefinedTopic.conf
|
||||
```
|
||||
The gateway runs as a aggregating gateway when **AggregatingGateway** is 'YES'.
|
||||
If **QoS-1** is 'YES, the gateway prepares a proxy for the QoS-1 client. QoS-1 client has a 'QoS-1' parameter in a clients.conf file. For QoS-1 clients, set the QoS-1 parameters in the clients.conf file.
|
||||
If **Forwarder** is 'YES', the gateway prepare a forwarder agent.
|
||||
If **ClientAuthentication** is 'YES', the client cannot connect unless it is registered in the clients.conf file.
|
||||
**ClientsList** defines clients and those address so on.
|
||||
**PredefinedTopicList** file defines Predefined Topic.
|
||||
|
||||
|
||||
# UDP
|
||||
```
|
||||
#==============================
|
||||
# SensorNetworks parameters
|
||||
#==============================
|
||||
#
|
||||
# UDP | DTLS
|
||||
#
|
||||
|
||||
GatewayPortNo=10000
|
||||
MulticastIP=225.1.1.1
|
||||
MulticastPortNo=1883
|
||||
MulticastTTL=1
|
||||
MulticastIP=225.1.1.1
|
||||
MulticastTTL=1
|
||||
```
|
||||
**GatewayPortNo** is a unicast port no of the gateway.
|
||||
**MulticastIP** and **MulticastPortNo** are for GWSEARCH messages. Clients can get the gateway address (Gateway IP address and GatewayPortNo) from GWINFO message by means of std::recvfrom().
|
||||
Client needs to know the MulticastIP and MulticastPortNo to send a SEARCHGW message.
|
||||
**MulticastTTL** is a multicast TTL.
|
||||
```
|
||||
#
|
||||
# UDP6 | DTLS6
|
||||
#
|
||||
|
||||
# UDP6
|
||||
GatewayUDP6Bind=FFFF:FFFE::1
|
||||
GatewayUDP6Port=10000
|
||||
GatewayUDP6Broadcast=FF02::1
|
||||
GatewayUDP6If=wpan0
|
||||
GatewayUDP6Hops=1
|
||||
GatewayIPv6PortNo=10000
|
||||
MulticastIPv6PortNo=1883
|
||||
MulticastIPv6=ff1e:feed:caca:dead::feed:caca:dead
|
||||
MulticastIPv6If=wlp4s0
|
||||
MulticastHops=1
|
||||
```
|
||||
**GatewayIPv6PortNo** is a unicast port no of the gateway.
|
||||
**MulticastIPv6PortNo** and **MulticastIPv6** are for GWSEARCH messages. Set the Global scope Multicast address so that the Global address is used for sending GWINFO.
|
||||
Clients can get the gateway address (Gateway IPv6 address and GatewayPortNo) from GWINFO message by means of std::recvfrom().
|
||||
**MulticastIPv6If** is a multicast interface name.
|
||||
**MulticastHops** is a multicast hops.
|
||||
```
|
||||
#
|
||||
# DTLS | DTLS6 DTLS CertsKey
|
||||
#
|
||||
|
||||
DtlsCertsKey=/etc/ssl/certs/gateway.pem
|
||||
DtlsPrivKey=/etc/ssl/private/privkey.pem
|
||||
```
|
||||
**DtlsCertsKey** is a certs Key pem file for DTLS connection.
|
||||
**DtlsPrivKey** is a private key pem file for DTLS connection.
|
||||
```
|
||||
#
|
||||
# XBee
|
||||
#
|
||||
|
||||
Baudrate=38400
|
||||
SerialDevice=/dev/ttyUSB0
|
||||
ApiMode=2
|
||||
```
|
||||
**Baudrate** is a baudrate of xbee.
|
||||
```
|
||||
#
|
||||
# LoRaLink
|
||||
#
|
||||
|
||||
#LoRaLink
|
||||
BaudrateLoRaLink=115200
|
||||
DeviceRxLoRaLink=/dev/ttyLoRaLinkRx
|
||||
DeviceTxLoRaLink=/dev/ttyLoRaLinkTx
|
||||
DeviceRxLoRaLink=/dev/loralinkRx
|
||||
DeviceTxLoRaLink=/dev/loralinkTx
|
||||
```
|
||||
https://github.com/ty4tw/MQTT-SN-LoRa
|
||||
|
||||
```
|
||||
#
|
||||
# Bluetooth RFCOMM
|
||||
#
|
||||
|
||||
RFCOMMAddress=60:57:18:06:8B:72.*
|
||||
|
||||
```
|
||||
**RFCOMMAddress** is a bluetooth mac address and channel. channel should be * for the gateway.
|
||||
```
|
||||
#
|
||||
# LOG
|
||||
ShearedMemory=NO;
|
||||
#
|
||||
|
||||
</dev></pre>
|
||||
ShearedMemory=NO
|
||||
```
|
||||
|
||||
**BrokerName** to specify a domain name of the Broker, and **BrokerPortNo** is a port No of the Broker. **BrokerSecurePortNo** is for TLS connection.
|
||||
**MulticastIP** and **MulticastPortNo** is a multicast address for GWSEARCH messages. Gateway is waiting GWSEARCH and when receiving it send GWINFO message via MulticastIP address. Clients can get the gateway address (Gateway IP address and **GatewayPortNo**) from GWINFO message by means of std::recvfrom().
|
||||
Client should know the MulticastIP and MulticastPortNo to send a SEARCHGW message.
|
||||
**GatewayId** is used by GWINFO message.
|
||||
**KeepAlive** is a duration of ADVERTISE message in seconds.
|
||||
when **AggregatingGateway** or **ClientAuthentication** is **YES**, All clients which connect to the gateway must be declared by a **ClientsList** file.
|
||||
Format of the file is ClientId and SensorNetwork Address. e.g. IP address and Port No etc, in CSV. more detail see clients.conf.
|
||||
When **QoS-1** is **YES**, QoS-1 PUBLISH is available. All clients which send QoS-1 PUBLISH must be specified by Client.conf file.
|
||||
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.
|
||||
**MaxNumberOfClients** Maximum number of clients allocated.
|
||||
|
||||
### ** How to monitor the gateway from remote. **
|
||||
### How to monitor the gateway from a remote terminal.
|
||||
Change gateway.conf as follows:
|
||||
```
|
||||
# LOG
|
||||
ShearedMemory=YES;
|
||||
````
|
||||
|
||||
Restart the gateway with sudo only once to create shared memories.
|
||||
|
||||
```
|
||||
Restart the gateway with sudo only once to create shared memories.
|
||||
open ssh terminal and execute LogMonitor.
|
||||
|
||||
```
|
||||
$ cd bin
|
||||
$ ./MQTT-SNLogmonitor
|
||||
```
|
||||
|
||||
```
|
||||
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.
|
||||
##### Tips
|
||||
Use compiler definitions then you can get more precise logs.
|
||||
**-DDEBUG_NW** is a flag for debug logs of Sensor network.
|
||||
**-DDEBUG_MQTTSN** is a flag for debug logs of MQTT-SN message haandling.
|
||||
One or both flags can be specified.
|
||||
|
||||
```
|
||||
./build.sh udp -DDEBUG -DDEBUG_NW
|
||||
```
|
||||
/*=================================
|
||||
* Log controls
|
||||
==================================*/
|
||||
//#define DEBUG // print out log for debug
|
||||
//#define DEBUG_NWSTACK // print out SensorNetwork log
|
||||
```
|
||||
Reference in New Issue
Block a user