There are a number of excellent open source MQTT (Message Queue Telemetry Transport) brokers or servers that are available. Eclipse Mosquitto is a very popular light weight server that can be run on lower end hardware such as Raspberry Pi modules.
In this blog I’ll look at setting up a Mosquitto broker and I’ll setup some connections to it using testing tools and then use JavaScript with Web Sockets to look at Mosquitto diagnostics.
Getting Started
An MQTT project will have the following components:
- MQTT Broker. The Mosquitto Server that manages and distributes messages
- MQTT Publisher. A source for the data, such as a Arduino or Raspberry Pi
- MQTT Subscriber. An application that wants the data
There is a good selection of MQTT libraries and test utilities for MQTT publishers and subscribers.
To install the Mosquitto broker and test utilities on a Raspberry Pi or Debian system enter:
sudo apt-get update sudo apt-get install mosquitto mosquitto-clients
For Windows and other systems see the Mosquitto download documentation.
The features of the mosquitto broker are defined by the mosquitto configuration file (/etc/mosquitto/mosquitto.conf). For simple testing you can leave the configuration as is, however if you need to any added features like bridging of MQTT brokers, adding diagnostics or setting up MQTT for web access then you’ll need to edit mosquitto.conf.
For my project I wanted to add diagnostic (with a 10 second update), and I wanted MQTT to also run on Websockets. To do this I edited the config file by:
sudo nano /etc/mosquitto/mosquitto.conf
then I added the lines:
listener 8080 protocol websockets sys_interval 10
The websockets can be set to any port number (9001, 8000,8080 etc.). After the file has been modified you’ll need to restart the Mosquitto service:
sudo service mosquitto restart
Test Clients
To test that your Mosquitto MQTT broker is running you can open 2 terminal sessions and run the mosquitto_sub and mosquitto_pub utilities.
In the first session we start mosquitto_sub with it subscribing to a topic called mytopic1:
~$ mosquitto_sub -t mytopic1 value1 1234
In the second session we use mosquitto_pub and we can publish some values to the topic mytopic1:
~$ mosquitto_pub -t mytopic1 -m "value1" ~$ mosquitto_pub -t mytopic1 -m 1234
If everything is working correctly then the published values should appear in the subscribing session.
JavaScript, Websockets and Mosquitto Diagnostics
We can create a simple web page to test out the Javascript, Websockets and Mosquitto Diagnostics.
The Mosquitto Diagnostics have a topic of : $SYS/broker/… Some of these diagnostics include:
$SYS/broker/bytes/received
$SYS/broker/bytes/sent
$SYS/broker/clients/connected
$SYS/broker/clients/maximum
$SYS/broker/clients/total
$SYS/broker/heap/current size
$SYS/broker/heap/maximum size
$SYS/broker/load/connections/+
$SYS/broker/load/bytes/received/+
$SYS/broker/load/bytes/sent/+
$SYS/broker/load/messages/received/+
$SYS/broker/load/messages/sent/+
$SYS/broker/load/publish/dropped/+
$SYS/broker/load/publish/received/+
$SYS/broker/load/publish/sent/+
$SYS/broker/load/sockets/+
$SYS/broker/messages/received
$SYS/broker/messages/sent
$SYS/broker/publish/messages/received
$SYS/broker/publish/messages/sent
$SYS/broker/retained messages/count
$SYS/broker/store/messages/count
$SYS/broker/store/messages/bytes
$SYS/broker/subscriptions/count
$SYS/broker/version
where + = 1min, 5min or 15min averages
For a full description of the Mosquitto diagnostics see: https://mosquitto.org/man/mosquitto-8.html .
Next we can create a web page where we can subscribe to some of these diagnostic topics. An MQTT javascript library can be remotely called from:
https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js
This library is very similiar to Python Paho MQTT library, and it supports both subscribe and publish functions.
<html> <head> <title> MQTT Subscribe Message</title> </head> <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.js" type="text/javascript"></script> <script> // Define some MQTT variables function sub_mqtt_msg() { // Send an MQTT message var mqtt_server = document.getElementById("mqtt_server").value; var mqtt_port = Number(document.getElementById("mqtt_port").value); client = new Paho.MQTT.Client(mqtt_server, mqtt_port,""); client.onMessageArrived = onMessageArrived; client.onMessageArrived = onMessageArrived; client.connect({onSuccess:onConnect}); document.getElementById("submsg").innerHTML = "Trying to connect...<br>"; } function onConnect() { document.getElementById("submsg").innerHTML = "New connection made...<br>"; var mqtt_destname = document.getElementById("mqtt_destname").value; client.subscribe(mqtt_destname); document.getElementById("submsg").innerHTML = "Subscribing to topic: " + mqtt_destname + " ...<br>"; } function onMessageArrived(message) { var result = message.destinationName + " : " + message.payloadString + "<br>"; document.getElementById("submsg").innerHTML += result; } </script> <body> <h1>MQTT Subscribe Test Page</h1> Server Name: <input type="text" id="mqtt_server" value="192.168.0.121"><br><br> Websocket: <input type="text" id="mqtt_port" value="8080"><br><br> DestinationName: <input type="text" id="mqtt_destname" value="$SYS/broker/#"><br><br> <button onclick="sub_mqtt_msg()">Subscript to MQTT</button> <hr> <h2>Subscribed Messages:</h2> <div id=submsg></div> </body> </html>
By subscribing to $SYS/broker/# we can get see all the different diagnostic values.
Summary
Mosquitto is an excellent MQTT broker that can be run on both high end servers and low end hardware like Raspberry Pi’s.
It is important to note that with most MQTT libraries, (i.e. Python Paho, JavaScript and Node Red) the default setting is to not retain only values. This can be a problem if a new MQTT subscribers starts because it will not have any data until new values are published. To ensure that old values are available set the RETAIN=YES option on the MQTT publish call.
In this blog I wanted to examine, the diagnostic features of the Mosquitto MQTT broker, however there are many more features and functions of MQTT communications that need to be examined. There are some excellent MQTT guides on the Internet. I tried to document some of my notes on MQTT with Javascript and Charts, and MQTT with Arduino and Node Red.
MQTT subscribers can see “old” values when subscribing to a new topic, you must however set the retain flag when publishing to that topic.
By default, you have no way to know how old the message is when you receive a retained message. While receiving a message, you only see the “retained” flag when you subscribed after the original message was sent.
To avoid confusing old messages with recent ones you use the retain flag to identify possibly out of date messages, add a timestamp to your data, use MQTT v5’s “Message Expiry” to set a time interval in which this message will be stored.
LikeLiked by 1 person
Thanks for your excellent comments. I updated the blog and added this.
I worked in industrial process control for a bunch of years, and the issue of data validity and quality always came up. This is why we used protocols like OPC, IEC 61850, TASE.2 etc. that had value, timestamp, quality and alarm level in the base message structure.
With any project it’s important to fully know the technical requirements and then match it up with the communications protocol. I find that I get sloppy when I do smaller IoT projects… so thanks for waking me up. In future I’ll try and add more details.
LikeLike
By the way, check out https://mqtt-explorer.com, it is nice to use MQTT Client.
LikeLiked by 1 person