MQTT-SN publisher

Browse source code on GitHub

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

See also

MQTT-SN Client library