Top

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();
}