Mosquitto
Ein Open Source MQTT Broker der verschiedene Versionen des Protokolls unterstützt.
Damit kann er gut in IoT Projekten verwendet werden, die MQTT nutzen wollen.
Auf einem Raspberry Pi installieren.
$ sudo apt-get update && sudo apt-get upgrade -y
$ sudo apt install -y mosquitto mosquitto-clients
Damit Mosquitto beim booten mit gestartet wird nutzt man folgendes Kommando.
$ sudo systemctl enable mosquitto.service
Nach so einer Standard Installation erlaubt der Broker keine externen Zugriffe.
Dies kann anonym oder über Benutzernamen und Passwort eingestellt werden.
Um anonyme Zugriffe zu erlauben muss man in der Konfiguration allow_anonymous true
eintragen.
Benutzer werden in einer passwd
Datei verwaltet und können wie folgt erstellt werden. Auf die Datei wird dann in der Konfiguration verwiesen.
$ sudo mosquitto_passwd /etc/mosquitto/passwd <username> <password>
Mit persistence
kann man einstellen damit Mosquitto Daten auf die Platte schreibt.
Der Dateiname ist mosquitto.db
kann aber mit persistence_file
geändert werden.
Der Pfad zur Datei wird mit persistence_location
konfiguriert.
Es kann auch ein autosave_interval
in Sekunden gestetz werden.
Die Konfiguration /etc/mosquitto/mosquitto.conf
kann wie folgt angepasst werden.
# Place your local configuration in /etc/mosquitto/conf.d/
#
# A full description of the configuration file is at
# /usr/share/doc/mosquitto/examples/mosquitto.conf.example
per_listener_settings true
pid_file /run/mosquitto/mosquitto.pid
persistence true
persistence_location /var/lib/mosquitto/
log_dest file /var/log/mosquitto/mosquitto.log
include_dir /etc/mosquitto/conf.d
allow_anonymous false
listener 1883
password_file /etc/mosquitto/passwd
Nachdem die Konfiguration angepasst wurde muss der Service neu gestarten werden.
$ sudo systemctl restart mosquitto
Die installieren Clients mosquitto-clients
können zum testen verwendet werden.
$ mosquitto_sub -v -t 'test/topic'
$ mosquitto_pub -t 'test/topic' -m 'mosquitto works'
Um sich alle offenen Verbindungen zu Mosquitto anzeigen zu lassen kann netstat
verwendet werden.
$ sudo netstat -ntp | grep ESTABLISHED.*mosquitto
$ sudo netstat -natp | grep ESTABLISHED.*mosquitto | wc -l
Python Client
$ pip install paho-mqtt
Ein einfaches Skript (subscribe.py
) zum empfangen von Daten.
import paho.mqtt.client as mqtt
host = 'broker_ip'
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client.subscribe("test/topic")
# The callback function for received message
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.username_pw_set("username", "password")
client.on_connect = on_connect
client.on_message = on_message
client.connect(host, 1883)
client.loop_forever()
Ein einfaches Skript (publish.py
) zum senden von Daten.
import time
import paho.mqtt.client as mqtt
host = 'broker_ip'
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
client = mqtt.Client()
client.username_pw_set("username", "password")
client.on_connect = on_connect
client.connect(host, 1883)
for i in range(300):
client.publish('test/topic', payload=i, qos=0, retain=True)
print(f"send {i} to test/topic")
time.sleep(1)
client.loop_forever()
ESP8266/ESP32 Client
https://github.com/plapointe6/EspMQTTClient
Ein einfaches Skript (mqttClient.ino) zum senden von Daten.
#include "EspMQTTClient.h"
EspMQTTClient client(
"SSID",
"WIFIPassword",
"MQTTBroker", // MQTT Broker server ip
"MQTTUsername", // Can be omitted if not needed
"MQTTPassword", // Can be omitted if not needed
"TestClient", // Client name that uniquely identify your device
1883 // The MQTT port, default to 1883. this line can be omitted
);
void setup() {
Serial.begin(115200);
}
// This function is called once everything is connected (Wifi and MQTT) (must be implemented)
void onConnectionEstablished() {
// Publish a message to "mytopic/test"
client.publish("mytopic/test", "This is a message");
}
void loop() {
if (client.isMqttConnected() == true) {
client.publish("mytopic/test", "This is a message");
delay(1000);
}
client.loop();
}