MQTT with Raspberry Pi
Learning MQTT with a RPi
MQTT (Message Queuing Telemetry Transport) is a lightweight messaging protocol designed for efficient communication between devices in constrained environments, commonly used in IoT (Internet of Things) applications.
An MQTT broker is a server that acts as an intermediary for MQTT communication, facilitating message exchange between devices by receiving, routing, and delivering messages to subscribed clients.
Any device or software component that establishes a connection to an MQTT service using the TCP/IP protocol can be referred to as an MQTT client.
Why MQTT for IoT?
MQTT is popular for IoT due to its lightweight nature, minimal bandwidth usage, and support for low-power devices, making it ideal for communication in resource-constrained environments.
To Do list
- MQTT
- Install a MQTT Client
- Install a MQTT Broker
- Testing the MQTT Broker
- Test the Connection
- Node-Red
- PostMan
Find the code used on this Post here.
Install MQTT Client
There are many options - I like MQTTX which is free.
Which you can install in any platform (and even SelfHost MQTTX with Docker).
Here is how to install MQTTx with Flatpak:
1
flatpak install flathub com.emqx.MQTTX
Install MQTT Broker
For simplicity, we can install EMQx with Docker using this Image - Deploy with Docker-compose or CLI:
1
2
docker pull emqx/emqx:5.5.0
docker run -d --name emqx -p 1883:1883 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:5.0.0 #5.5.0
You have other MQTT Broker options like Eclipse Mosquitto, VerneMQ or RabbitMQ
Mosquitto supports many CPU architectures out of the box.
If you have a Raspberry 32bits like me, you can use this Mosquitto Image instead, as the MQTT Broker
1
2
3
4
5
6
7
docker run -d -e TZ=Europe/Madrid -p 1883:1883 mbixtech/arm32v7-mosquitto --name mosquitto
#https://hub.docker.com/r/panuwitp/mosquitto-arm
#https://github.com/somsakc/docker-mosquitto
#docker ps --format ''
#docker logs mosquitto
#docker exec -it mosquitto /bin/sh
Testing EMQx
Sending MQTT Message with Python
We just need Python and Paho installed:
1
pip install paho-mqtt
Create this Python script:
1
2
3
4
5
6
7
8
9
10
11
12
13
import paho.mqtt.publish as publish
# MQTT Broker (EMQX) details
broker_address = "broker.emqx.io" #change to any other adress, like 192.168.3.200 at Home
port = 1883
topic = "python/mqtt"
# Message to publish
message = "Hello from Python!"
# Publish the message
publish.single(topic, message, hostname=broker_address, port=port)
print(f"Message Published to {topic}")
Then just execute it:
1
python3 python-push.py
Sending MQTT Message with C
We will need C installed and the MQTTClient package - which we will build from source:
1
2
3
4
5
6
7
8
9
10
11
sudo apt-get update
sudo apt-get install build-essential git cmake
git clone https://github.com/eclipse/paho.mqtt.c.git
cd paho.mqtt.c
cmake -Bbuild -H. -DPAHO_WITH_SSL=OFF
cd build
make
sudo make install
Create this C script:
1
nano mqtt_publish_server.c
Then we can compile our code
1
2
gcc -o mqtt_publish_server mqtt_publish_server.c -lpaho-mqtt3c #compile
./mqtt_publish_server #execute
Node-Red
Install Node-Red with Docker - we will use this image:
1
docker run -it -p 1880:1880 -v myNodeREDdata:/data --name mynodered nodered/node-red
You can access it now at: localhost:1880
Then in the UI: go tu user settings -> Install and add both (node-red-contrib-open and node-red-dashboard)
You can use [this docker-compose] to deploy Node-Red together with EMQx
Displaying MQTT in Graph
MQTT-Explorer
With MQTT-Explorer we can have a quick look on the trends of data we are receiving.
It is cross platform and you can install it with:
1
snap install mqtt-explorer #app-image also available
PostMan
You can subscribe to MQTT Topics with Postman, plus you will have a nice real time visualization out of the box.
Install it with:
1
flatpak install flathub com.getpostman.Postman
Added this thanks to nopnop2002 Project
FAQ
How to Install HA
You can install Home Assistant with Docker following this steps - It is part of another IoT Project with InfluxDB and DHT11.
- Go to:
localhost:8123
Then use the MQTT Integration (we are lucky it is not an add-on)
- Settings - Devices and Services -> Add Integration -> MQTT
- Then you will add the address and port of your MQTT Broker (and user/pass if needed)
To finish, configure MQTT integration listen to the topic that you are interested to get data.
https://github.com/home-assistant/core/tree/dev/homeassistant/components/mqtt
How to Deploy Node-Red with Docker
How to Deploy EMQx with Docker
How to build EMQx for ARM32
https://github.com/emqx/emqx?tab=readme-ov-file#build-from-source https://github.com/erlang/otp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
wget https://packages.erlang-solutions.com/erlang-solutions_2.0_all.deb
sudo dpkg -i erlang-solutions_2.0_all.deb
sudo apt-get update
# sudo apt update
# git clone https://github.com/erlang/otp.git
# cd otp
# git checkout maint-25 # current latest stable version
# ./configure
# make
# make install
#sudo apt install erlang
docker run erlang:25
erl -version
1
2
3
4
git clone https://github.com/emqx/emqx.git
cd emqx
make
_build/emqx/rel/emqx/bin/emqx console
How to visualize MQTT Data
- With Grafana - https://grafana.com/grafana/plugins/grafana-mqtt-datasource/
- With Postman
- With ekuiper
1
docker run -p 9081:9081 -d --name ekuiper -e MQTT_SOURCE__DEFAULT__SERVER=tcp://broker.emqx.io:1883 lfedge/ekuiper:latest
PostMan Alternatives
How to Push Data to MQTT
- With Python - https://www.emqx.com/en/blog/how-to-use-mqtt-in-python
- With Micro Python - https://www.youtube.com/watch?v=THUGLRGuOU8
- With C
- With Rust - https://www.emqx.com/en/blog/how-to-use-mqtt-in-rust
- MQTT Client ESP 32 + RPi - https://www.youtube.com/watch?v=ebsXSCKsHeQ
How about Streaming?
https://www.emqx.com/en/blog/connecting-millions-of-cars-using-emqx-mqtt-and-upstash-kafka https://upstash.com/docs/oss/sdks/ts/kafka/overview
When talking about streaming, think about Kafka.
Content that was helpful to put this together
- Push MQTT Data to Node-Red Gauge https://www.youtube.com/watch?v=c3WYSUaFZqA
- Setup Dashboard tools on Node-Red: https://www.youtube.com/watch?v=TNHAZxwB-9o
IoV - Internet of Vehicles
What about CanBus?
CAN bus is like a private walkie-talkie system used by different parts of a car to talk to each other quickly and directly, helping them work together smoothly.
But MQTT is more like sending messages through a mail system, where you write a message, put it in an envelope with an address (called a topic), and send it to a central post office (called a broker), which then delivers the message to anyone who is interested in receiving it.
While CAN bus is great for fast and direct communication within a single place, like a car, MQTT is better for sending messages between different places or devices, like smart home gadgets, over the internet.
This might be helpful:
Can what? https://www.youtube.com/watch?v=JZSCzRT9TTo
https://www.emqx.com/en/blog/bridging-demanded-signals-from-can-bus-to-mqtt-by-ekuiper
- https://github.com/linux-can/can-utils
- Can to MQTT: https://github.com/nopnop2002/esp-idf-can2mqtt
- ESP32 - CAN: https://www.youtube.com/watch?v=Se2KCVyD7CM
- https://github.com/nopnop2002/esp-idf-mqtt-client
- https://github.com/nopnop2002/esp-idf-can2websocket
https://github.com/nopnop2002/esp-idf-CANBus-Monitor
- https://github.com/c3re/can2mqtt
1
2
3
4
5
6
# sudo apt-get install can-utils
# ifconfig -a
# sudo ip link set can0 up type can bitrate 500000
#Replace can0 with the appropriate interface name and 500000 with the desired bitrate if necessary.