workshop tutorial.html

MQTT

“MQ Telemetry Transport” MQTT ist ein Protokoll zum Übermitteln/ Empfangen von z.B. Sensordaten oder Aktordaten.

Das MQTT Protokoll definiert zwei Netzwerk-Einheiten: Ein “Message Broker” und Clients.

Die Kommunikation findet zwischen einem Client und dem Broker statt. Es gibt keine Kommunikation direkt von Client zu Client.

publish - subscribe

publish: Daten werden versendet.

subscribe: Interessenten (Clients) melden sich beim Broker für Daten an und bekommen Änderungen zugesendet.

https://mqtt.org/

MQTT übermittelt Daten mit topic und payload.

‘topic’ sind hierarchische Bezeichner wie z.B.

  halle3/level2/grid4-3/sensor/temperatur
  haus/wohnzimmer/stehleuchte

Topic können bis zu 64k lang sein.

‘payload’ sind die Nutzdaten. Hier kann beliebig Information gesendet werden bis 256MB Länge.

Beispiele für Nutzdaten:

   23.4                # Temperatur

   ON                  # Schalter, ON, OFF

                       # json data
   { "temp": 22.4,    
     "humidity": 44.2, 
     "cnt": 3965,
     "comment": "maintenance needed" }       

   ...binär...         # Binärdaten. Nur bedingt empfehlenswert.

Will ‘Testament’

Programme können eine Message beim Broker hinterlegen, die dann bei Verbindungsabbruch vom Broker verteilt wird.

QOS, RETAIN

Qos ist ‘quality of service’:

0: at most once
1: at least once
2: exactly once

Retained-Flag ist

“A retained message is a normal MQTT message with the retained flag set to true. The broker stores the last retained message and the corresponding QoS for that topic. Each client that subscribes to a topic pattern that matches the topic of the retained message receives the retained message immediately after they subscribe. The broker stores only one retained message per topic.” 1

Wildcard in Topic

Beim Empfangen ‘subscribe’ können Topics mit Wildcards angebenen werden

‘#’: ab diesem Zeichen jedes passende Topic. Beispiel ‘haus/wohnzimmer/#’ passt zu allen Topic die mit ‘haus/wohnzimmer/’ anfangen.

‘+’: ein beliebiger Level. Beispiel ‘haus/+/temperatur’ passt zu ‘haus/wohnzimmer/temperatur’ und ‘haus/kueche/temperatur’.

Die nach solchen Subscribe empfangenen Daten sind immer mit voll qualifizierten Topic ausgestattet.

Sonderfall $

Topics die mit $ anfangen sind für den Broker reserviert.

Sichtbarkeit

Alle Topic sind für alle Clients eines Brokers sichtbar.

Es gibt keine Abschottung innerhalb eines Brokers. Das macht das System einfach im Aufbau, aber auch anfällig für Fehler oder Störungen.

Best Practice

–> workshop


Topologie

System besteht aus einem MQTT Broker, und ‘client’ Programmen.

Die client können dedizierte Devices sein (Sensoren mit Netzwerkanbindung, geschaltete Netzsteckdosen) oder Programme die auf Computern gestartet sind.

Netzwerk Topologie Workshop

network_setup.svg
network_setup.svg

Das Netz ist ein isoliertes Netz 192.168.1.0/24 . Es gibt voraussichtlich keine Internetanbindung 2.

Acccess point SSID MQTTTUTORIAL, key …

–> workshop


Software

Broker

wikipedia: The MQTT broker is a piece of software running on a computer (running on-premises or in the cloud), and could be self-built or hosted by a third party. It is available in both open source and proprietary implementations.
The broker acts as a post office. MQTT clients don’t use a direct connection address of the intended recipient, but use the subject line called “Topic”. Anyone who subscribes receives a copy of all messages for that topic. Multiple clients can subscribe to a topic from a single broker (one to many capability), and a single client can register subscriptions to topics with multiple brokers (many to one).

Für Raspberry ist “eclipse mosquitto” üblich.

doc mosquitto

Anmerkung auf dem Rechner ‘mqttserver’ 192.168.1.200 ist mosquitto broker installiert.
sudo apt install mosquitto

post-install: sudo vi /etc/mosquitto/mosquitto.conf eintragen:

listener 1883
allow_anonymous true

–> workshop


Grafische Client Tools

Es gibt eine Anzahl von Werkzeugen zum Beobachten von MQTT Messages. Diese Werkzeuge sind MQTT Teilnehmer ‘client’ wie jedes andere Programm auch.

mqtt.utility

cd ~/mqtt_kurs/src/C_920
java -jar org.eclipse.paho.mqtt.utility-1.0.0.jar
org.eclipse.paho.mqtt.utility-1.0.0.jar
org.eclipse.paho.mqtt.utility-1.0.0.jar
Tool Verwendung
Tool Verwendung
  1. Broker TCP/IP address: mqtt-server
  2. Connect
  3. Subscribe Topic: tutorial/hello
  4. Subscribe
  5. Publish Topic: tutorial/hello
  6. Payload eingeben: hallo Welt !
  7. Publish
  8. Ergebnis: der Text wird bei allen Gruppen(!) empfangen und angezeigt.

other graphical tools

–> workshop


Command Line Tools

Beispiel paho command line tool:

Anmerkung das Topic ‘#’ ist ein Wildcard für ‘alle Topics’ und sollte normalerweise vermieden werden.
 paho_c_sub '#' --host 192.168.1.200

Mosquitto bringt ebenfalls command line Tools mit, die aber auf den Workshop Rechnern nicht installiert sind.

–> workshop


Bibliotheken

Für python auf Linux ist die eclipse paho Bibliothek interessant.

https://www.eclipse.org/paho/clients/python/docs/

doc paho python

Anmerkung Die paho-Bibliothek für python ist auf den workshop-Rechnern installiert.
    sudo python3 -m pip install paho-mqtt

Es gibt Bibliotheken für ‘die üblichen’ Programmiersprachen bei eclipse-paho.

Siehe auch github.com/mqtt/mqtt.org/wiki/libraries

–> workshop


Software

Beispielprogramm zum Lesen von GPIO Button

import gpiozero
    
GPIO_BUTTON = 12

# default Button, pull_up=True
button = gpiozero.Button(GPIO_BUTTON)

if button.is_pressed:
    print("pressed")
else:
    print("not pressed")
  

Beispielprogramm ansteuern GPIO LED

import time
import gpiozero

GPIO_LED = 13

# default LED active_high=True
led = gpiozero.LED( GPIO_LED)

while True:
    led.high()
    time.sleep(0.5)
    led.low()
    time.sleep(0.5)

MQTT Verwendung

Im workshop wird die eclipse paho bibliothek verwendet.

doc paho python library

MQTT basic connect, loop, disconnect

HOST = "192.168.1.200"
PORT = 1883

mqttc = mqtt.Client()
mqttc.connect(HOST, PORT, 60)

mqttc.loop_start()        # non blocking loop
# mqttc.loop_forever()    # blocking loop
# mqttc.loop(timeout=0.1) # running loop in code

.. place code here

mqttc.loop_stop()
mqttc.disconnect()

MQTT publish

python bibliothek ‘paho’ Installation sudo pip3 install paho

HOST = "192.168.1.200"
PORT = 1883

mqttc = mqtt.Client()
mqttc.connect(HOST, PORT, 60)
mqttc.loop_start()

# signals are ON, OFF
mqttc.publish("tutorial/A/button", "ON")

mqttc.loop_stop()
mqttc.disconnect()

MQTT subscribe

HOST = "192.168.1.200"
PORT = 1883

def on_connect(client, userdata, flags, rc):
    """Subscribing in on_connect() means that if we lose the connection and
    reconnect then subscriptions will be renewed.
    """
    client.subscribe(
            [
                ("tutorial/A/LED", 0), 
            ]
    )


def on_message(client, userdata, msg):
    """The callback for when a PUBLISH message is received from the server."""
    print(msg.topic,str(msg.payload), "retain", msg.retain, "qos", msg.qos, str(userdata) )

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(HOST, PORT, 60)

try:
    client.loop_forever()
except KeyboardInterrupt:
    pass

client.disconnect()
client.loop_stop()

Kombinierter Status verschiedener Topic

Die subscribd messages kommen zu unterschiedlichen Zeiten an. Um auf der Basis verschiedener Sensoren Entscheidungen zu treffen muß ein lokaler cache erstellt werden.

Es bietet sich an die Daten in einem dictionary zu speichern.

cache = dict()
cache[msg.topic] =  str(msg.payload)

Damit stehen die Daten (während das Programm läuft) zur Verfügung und können ausgewertet werden.

Debugging

Wireshark

Wireshark is a tool to monitor ethernet packages

    sudo apt-get install wireshark

start as superuser sudo wireshark

Zwei Beispiele für qos 0 und 2 zeigen die unterschiedliche Anzahl von Messages bei einem Publish.

QOS 0:

wireshark publish qos 0
wireshark publish qos 0

QOS 2:

wireshark publish qos 2
wireshark publish qos 2

mosquitto broker debug level

TODO

Real World

Public Infrastructure

Es gibt einige öffentlich verfügbare MQTT Lösungen ‘cloud’.

Zwei Beispiele:

Integration Platforms

nodered
nodered

Geräte mit MQTT

Es gibt einige Geräte, die direkt mit MQTT angesteuert werden können. Beispiele sind die ESP8266 basierten Steckdosen mit “tasmota”

tasmota

Die meisten Steckdosen muß man öffnen und ‘flashen’.

Anmerkung Die beschriebenen Prozeduren sind teilweise gefährlich und die elektrische Sicherheit ist dabei im Allgemeinen nicht gewährleistet.

Es gibt wenige Geräte, die von Haus aus “tasmota” enthalten.

Im workshop stehen drei mit “tasmota” ausgestattete Steckdosen zur Verfügung:

topic: cmnd/delock/1807/POWER
ip: 192.168.1.101

topic: cmnd/delock/2008/POWER
ip: 192.168.1.102

topic: cmnd/delock/2508/POWER
ip: 192.168.1.100

Beispiel delock 11826 power socket

delock power socket Diese Socket sind mit tasmota ausgestattet und arbeiten mit einem lokalen broker.

Beispiel shelly shelly-1

Die Firma vertreibt verscheidene Installations- und Consumerprodukte. Diese sind u.A. auch mit MQTT zu benutzen und ausführlich dokumentiert.

shelly doc

shelly 1

Performance

In C_020/pt.py ist ein Performance-Test enthalten.

Das Tool benutzt python multiprocessing um mehrere Clients zu öffnen. Jeder Client meldet sich bei 4 Topics ‘pi/0’, ‘pi/1’, ‘pi/2’, ‘pi/3’ an. Dann sendet der Client für jeden Topic die Zahl ‘0’ als String codiert ab. Wenn diese Topics dann empfangen werden, wird die Zahl erhöht und wieder geschickt.

Insgesamt werden 1.000.000 Sende-Empfangs-Operationen bei qos 0 ausgeführt. Das dauert auf einem pi4 ca 120 sec.

Mit pypy3 ca 45 sec.


  1. https://www.hivemq.com/blog/mqtt-essentials-part-8-retained-messages/

  2. Die Ausstattung des Workshop mit Internetanschluß konnte vorab nicht geklärt werden. Einige benötigte Dokumentationen liegen als lokale Kopie bereit.

  3. pypy ist ein python interpreter mit Just In Time Compiler ‘JIT’ support. Programme laufen schneller, aber nicht alle Bibliotheken sind lauffähig.
    pypy ist bereits in raspbian buster enthalten
    pip muß nachinstalliert werden:

    wget https://bootstrap.pypa.io/get-pip.py
    pypy get-pip.py
    
    sudo pypy -m pip install paho-mqtt