MQTT-SN publisher
Overview
MQTT (MQ Telemetry Transport) is a lightweight publish/subscribe messaging protocol optimized for small sensors and mobile devices.
MQTT-SN can be considered as a version of MQTT which is adapted to the peculiarities of a wireless communication environment. While MQTT requires a reliable TCP/IP transport, MQTT-SN is designed to be usable on any datagram-based transport like UDP, ZigBee or even a plain UART (with an additional framing protocol).
The Zephyr MQTT-SN Publisher sample application is an MQTT-SN v1.2 client that sends MQTT-SN PUBLISH messages to an MQTT-SN gateway. It also SUBSCRIBEs to a topic. See the MQTT-SN v1.2 spec for more information.
The source code of this sample application can be found at: samples/net/mqtt_sn_publisher.
Requirements
Linux machine
MQTT-SN gateway, like Eclipse Paho
Mosquitto server: any version that supports MQTT v3.1.1. This sample was tested with mosquitto 1.6.
Mosquitto subscriber
LAN for testing purposes (Ethernet)
Build and Running
This sample application supports both static IP addresses and the Gateway Discovery process. Open the samples/net/mqtt_sn_publisher/prj.conf file and set the IP addresses according to the LAN environment. CONFIG_NET_SAMPLE_MQTT_SN_STATIC_GATEWAY can be used to select the static IP or Gateway discovery process.
You will also need to start an MQTT-SN gateway. A convenience Docker Compose specification file is provided in samples/net/mqtt_sn_publisher/compose/compose.yaml. First, Start the net-tools configuration from[here](https://github.com/zephyrproject-rtos/net-tools) with:
$ ./net-setup.sh --config docker.conf
Then bring up the Docker environment in a separate terminal window with:
$ cd ./compose
$ docker compose up
You can also set up this environment manually.With Paho, you can either build it from source - see PAHO MQTT-SN Gateway - or run an unofficial docker image, l ike kyberpunk/paho.
On your Linux host computer, open 3 terminal windows. At first, start mosquitto:
$ sudo mosquitto -v -p 1883
Then, in another window, start the gateway, e.g. by using docker:
$ docker run -it -p 10000:10000 -p 10000:10000/udp --name paho -v $PWD/gateway.conf:/etc/paho/gateway.conf:ro kyberpunk/paho
Then, locate your zephyr directory and type:
west build -b native_sim/native/64 samples/net/mqtt_sn_publisher
west build -t run
Optionally, use any MQTT explorer to connect to your broker.
Sample output
This is the applications output:
WARNING: Using a test - not safe - entropy source
*** Booting Zephyr OS build zephyr-v3.2.0-279-gc7fa387cea81 ***
[00:00:00.000,000] <inf> net_config: Initializing network
[00:00:00.000,000] <inf> net_config: IPv4 address: 172.18.0.20
[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: MQTT-SN sample
[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: Network connected
[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: Waiting for connection...
[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: Connecting client
[00:00:00.510,000] <inf> net_mqtt_sn: Decoding message type: 5
[00:00:00.510,000] <inf> net_mqtt_sn: Got message of type 5
[00:00:00.510,000] <inf> net_mqtt_sn: MQTT_SN client connected
[00:00:00.510,000] <inf> mqtt_sn_publisher_sample: MQTT-SN event EVT_CONNECTED
[00:00:01.020,000] <inf> net_mqtt_sn: Decoding message type: 19
[00:00:01.020,000] <inf> net_mqtt_sn: Got message of type 19
[00:00:10.200,000] <inf> mqtt_sn_publisher_sample: Publishing timestamp
[00:00:10.200,000] <inf> net_mqtt_sn: Registering topic
2f 75 70 74 69 6d 65 |/uptime
[00:00:10.200,000] <inf> net_mqtt_sn: Can't publish; topic is not ready
[00:00:10.710,000] <inf> net_mqtt_sn: Decoding message type: 11
[00:00:10.710,000] <inf> net_mqtt_sn: Got message of type 11
[00:00:10.710,000] <inf> net_mqtt_sn: Publishing to topic ID 14
[00:00:20.400,000] <inf> mqtt_sn_publisher_sample: Publishing timestamp
[00:00:20.400,000] <inf> net_mqtt_sn: Publishing to topic ID 14
This is the output from the MQTT-SN gateway:
20221024 140210.191 CONNECT <--- ZEPHYR 0C 04 04 01 00 3C 5A 45 50 48 59 52
20221024 140210.192 CONNECT ===> ZEPHYR 10 12 00 04 4D 51 54 54 04 02 00 3C 00 06 5A 45 50 48 59 52
20221024 140210.192 CONNACK <=== ZEPHYR 20 02 00 00
20221024 140210.192 CONNACK ---> ZEPHYR 03 05 00
20221024 140210.643 SUBSCRIBE 0001 <--- ZEPHYR 0C 12 00 00 01 2F 6E 75 6D 62 65 72
20221024 140210.648 SUBSCRIBE 0001 ===> ZEPHYR 82 0C 00 01 00 07 2F 6E 75 6D 62 65 72 00
20221024 140210.660 SUBACK 0001 <=== ZEPHYR 90 03 00 01 00
20221024 140210.661 SUBACK 0001 ---> ZEPHYR 08 13 00 00 0D 00 01 00
20221024 140220.338 REGISTER 0002 <--- ZEPHYR 0D 0A 00 00 00 02 2F 75 70 74 69 6D 65
20221024 140220.348 REGACK 0002 ---> ZEPHYR 07 0B 00 0E 00 02 00
20221024 140220.848 PUBLISH <--- ZEPHYR 0C 0C 00 00 0E 00 00 31 30 32 30 30
20221024 140220.850 PUBLISH ===> ZEPHYR 30 0E 00 07 2F 75 70 74 69 6D 65 31 30 32 30 30
20221024 140230.539 PUBLISH <--- ZEPHYR 0C 0C 00 00 0E 00 00 32 30 34 30 30
20221024 140230.542 PUBLISH ===> ZEPHYR 30 0E 00 07 2F 75 70 74 69 6D 65 32 30 34 30 30