1.. zephyr:code-sample:: mqtt-sn-publisher
2   :name: MQTT-SN publisher
3   :relevant-api: mqtt_sn_socket
4
5   Send MQTT-SN PUBLISH messages to an MQTT-SN gateway.
6
7Overview
8********
9
10`MQTT <http://mqtt.org/>`_ (MQ Telemetry Transport) is a lightweight
11publish/subscribe messaging protocol optimized for small sensors and
12mobile devices.
13
14MQTT-SN can be considered as a version of MQTT which is adapted to
15the peculiarities of a wireless communication environment. While MQTT
16requires a reliable TCP/IP transport, MQTT-SN is designed to be usable
17on any datagram-based transport like UDP, ZigBee or even a plain UART
18(with an additional framing protocol).
19
20The Zephyr MQTT-SN Publisher sample application is an MQTT-SN v1.2
21client that sends MQTT-SN PUBLISH messages to an MQTT-SN gateway.
22It also SUBSCRIBEs to a topic.
23See the `MQTT-SN v1.2 spec`_ for more information.
24
25.. _MQTT-SN v1.2 spec: https://www.oasis-open.org/committees/download.php/66091/MQTT-SN_spec_v1.2.pdf
26
27The source code of this sample application can be found at:
28:zephyr_file:`samples/net/mqtt_sn_publisher`.
29
30Requirements
31************
32
33- Linux machine
34- MQTT-SN gateway, like Eclipse Paho
35- Mosquitto server: any version that supports MQTT v3.1.1. This sample
36  was tested with mosquitto 1.6.
37- Mosquitto subscriber
38- LAN for testing purposes (Ethernet)
39
40Build and Running
41*****************
42
43Currently, this sample application only supports static IP addresses.
44Open the :file:`prj.conf` file and set the IP addresses according
45to the LAN environment.
46
47You will also need to start an MQTT-SN gateway. With Paho, you can either
48build it from source - see `PAHO MQTT-SN Gateway`_ - or run an unofficial
49docker image, like `kyberpunk/paho`_.
50
51.. _PAHO MQTT-SN Gateway: https://www.eclipse.org/paho/index.php?page=components/mqtt-sn-transparent-gateway/index.php
52.. _kyberpunk/paho: https://hub.docker.com/r/kyberpunk/paho
53
54On your Linux host computer, open 3 terminal windows. At first, start mosquitto:
55
56.. code-block:: console
57
58	$ sudo mosquitto -v -p 1883
59
60Then, in another window, start the gateway, e.g. by using docker:
61
62.. code-block:: console
63
64	$ docker run -it -p 10000:10000 -p 10000:10000/udp --name paho -v $PWD/gateway.conf:/etc/paho/gateway.conf:ro kyberpunk/paho
65
66Then, locate your zephyr directory and type:
67
68.. zephyr-app-commands::
69   :zephyr-app: samples/net/mqtt_sn_publisher
70   :board: native_sim_64
71   :goals: run
72   :compact:
73
74Optionally, use any MQTT explorer to connect to your broker.
75
76Sample output
77=============
78
79This is the applications output:
80
81.. code-block:: console
82
83	WARNING: Using a test - not safe - entropy source
84	*** Booting Zephyr OS build zephyr-v3.2.0-279-gc7fa387cea81  ***
85	[00:00:00.000,000] <inf> net_config: Initializing network
86	[00:00:00.000,000] <inf> net_config: IPv4 address: 172.18.0.20
87	[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: MQTT-SN sample
88	[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: Network connected
89	[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: Waiting for connection...
90	[00:00:00.000,000] <inf> mqtt_sn_publisher_sample: Connecting client
91	[00:00:00.510,000] <inf> net_mqtt_sn: Decoding message type: 5
92	[00:00:00.510,000] <inf> net_mqtt_sn: Got message of type 5
93	[00:00:00.510,000] <inf> net_mqtt_sn: MQTT_SN client connected
94	[00:00:00.510,000] <inf> mqtt_sn_publisher_sample: MQTT-SN event EVT_CONNECTED
95	[00:00:01.020,000] <inf> net_mqtt_sn: Decoding message type: 19
96	[00:00:01.020,000] <inf> net_mqtt_sn: Got message of type 19
97	[00:00:10.200,000] <inf> mqtt_sn_publisher_sample: Publishing timestamp
98	[00:00:10.200,000] <inf> net_mqtt_sn: Registering topic
99										2f 75 70 74 69 6d 65                             |/uptime
100	[00:00:10.200,000] <inf> net_mqtt_sn: Can't publish; topic is not ready
101	[00:00:10.710,000] <inf> net_mqtt_sn: Decoding message type: 11
102	[00:00:10.710,000] <inf> net_mqtt_sn: Got message of type 11
103	[00:00:10.710,000] <inf> net_mqtt_sn: Publishing to topic ID 14
104	[00:00:20.400,000] <inf> mqtt_sn_publisher_sample: Publishing timestamp
105	[00:00:20.400,000] <inf> net_mqtt_sn: Publishing to topic ID 14
106
107This is the output from the MQTT-SN gateway:
108
109.. code-block:: console
110
111	20221024 140210.191   CONNECT           <---  ZEPHYR                              0C 04 04 01 00 3C 5A 45 50 48 59 52
112	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
113	20221024 140210.192   CONNACK           <===  ZEPHYR                              20 02 00 00
114	20221024 140210.192   CONNACK           --->  ZEPHYR                              03 05 00
115
116	20221024 140210.643   SUBSCRIBE   0001  <---  ZEPHYR                              0C 12 00 00 01 2F 6E 75 6D 62 65 72
117	20221024 140210.648   SUBSCRIBE   0001  ===>  ZEPHYR                              82 0C 00 01 00 07 2F 6E 75 6D 62 65 72 00
118	20221024 140210.660   SUBACK      0001  <===  ZEPHYR                              90 03 00 01 00
119	20221024 140210.661   SUBACK      0001  --->  ZEPHYR                              08 13 00 00 0D 00 01 00
120
121	20221024 140220.338   REGISTER    0002  <---  ZEPHYR                              0D 0A 00 00 00 02 2F 75 70 74 69 6D 65
122	20221024 140220.348   REGACK      0002  --->  ZEPHYR                              07 0B 00 0E 00 02 00
123
124	20221024 140220.848   PUBLISH           <---  ZEPHYR                              0C 0C 00 00 0E 00 00 31 30 32 30 30
125	20221024 140220.850   PUBLISH           ===>  ZEPHYR                              30 0E 00 07 2F 75 70 74 69 6D 65 31 30 32 30 30
126
127	20221024 140230.539   PUBLISH           <---  ZEPHYR                              0C 0C 00 00 0E 00 00 32 30 34 30 30
128	20221024 140230.542   PUBLISH           ===>  ZEPHYR                              30 0E 00 07 2F 75 70 74 69 6D 65 32 30 34 30 30
129