MQTT ist ein Machine-to-Machine (M2M) und Internet der Dinge (IoT) Publish/Subscribe Nachrichten-Transport-Protokoll. Der Brick MQTT Proxy erlaubt den Zugriff auf Bricks und Bricklets über MQTT. Er ist in Python geschrieben und übersetzt Nachrichten zwischen dem Tinkerforge TCP/IP Protocol (TFP) und MQTT.
Bemerkung
Der Brick MQTT Proxy ist abgekündigt und wird nicht mehr weiterentwicklet. Als Ersatz werden die MQTT API Bindings empfohlen.
Der Proxy ist ein Python-Skript und kann von seinem Brick MQTT Proxy GitHub Repository heruntergeladen werden:
wget --backups=1 https://raw.githubusercontent.com/Tinkerforge/brick-mqtt-proxy/master/brick-mqtt-proxy.py
Als Abhängigkeiten müssen der Brick Daemon, die Python API Bindings und die Eclipse Paho MQTT Python Client Bibliothek installiert werden. Siehe Brick Daemon und Python API Bindings Dokumentation für Installationsanweisungen. Unter Linux kann die Paho MQTT Python Client Bibliothek mit folgendem Befehl installiert werden:
sudo pip install paho-mqtt
Anschließend kann der Proxy mit folgender Zeile gestartet werden:
python brick-mqtt-proxy.py
Um eine Liste der Kommandozeilen-Parameter für Host- und Porteinstellungen des Brick Daemon und des MQTT Broker, der Daten Updaterate und einer möglichen Debugausgabe zu bekommen, muss folgende Zeile eingegeben werden:
python brick-mqtt-proxy.py --help
In den folgenden Beispiel nutzen wir Mosquitto als Broker und Client. Andere Broker und Clients können auf eine ähnliche Weise genutzt werden. Um Mosquitto unter Linux zu installieren kann folgende Zeile eingegeben werden:
sudo apt-get install mosquitto mosquitto-clients
Anschließend startet man den Brick MQTT Proxy und führt eines der Beispiele aus. Die Struktur ist nachfolgend beschrieben. Denke daran die UID im Topic durch die des eigenen Bricklets auszutauschen.
# Enummeriere alle verfügbaren Module
mosquitto_sub -v -t tinkerforge/enumerate/available/#
# Enummeriere alle verfügbaren Laser Range Finder Bricklets
mosquitto_sub -v -t tinkerforge/enumerate/available/bricklet/laser_range_finder
# Aktiviere den Laser
mosquitto_pub -t tinkerforge/bricklet/laser_range_finder/vbM/enable_laser/set -m ''
# Lese die gemessene Distanz
mosquitto_sub -v -t tinkerforge/bricklet/laser_range_finder/vbM/distance
# Enummeriere alle verfügbaren Analog Out 2.0 Bricklets
mosquitto_sub -v -t tinkerforge/enumerate/available/bricklet/analog_out_v2
# Lese die Eingangsspannung
mosquitto_sub -v -t tinkerforge/bricklet/analog_out_v2/7xwQ9g/input_voltage
# Lese die Ausgangsspannung
mosquitto_sub -v -t tinkerforge/bricklet/analog_out_v2/7xwQ9g/output_voltage
# Setze die Ausgangsspannung auf 2.5V
mosquitto_pub -t tinkerforge/bricklet/analog_out_v2/7xwQ9g/input_voltage -m '{"voltage":2500}'
Die Topics sind geteilt in Device (aktuell nur bricklet/
) und
enumerate/
Topics.
Der Proxy veröffentlicht (publishes) retained Messages von Messwert- und Konfigurationsänderungen von unterstützen Devices mit dem folgenden Pattern:
tinkerforge/<prefix>/<uid>/<suffix>
Für ein Temperature Bricklet mit UID XYZ
wird die Temperatur wie folgt
publishen:
tinkerforge/bricklet/temperature/XYZ/temperature
Messwert- Konfigurations-Information wird als JSON im folgenden Format repräsentiert:
{
"_timestamp": <timestamp>,
"<key>": <value>
}
Alle Nachrichten die der Proxy published enthalten einen UNIX
Zeitstempel, um das Alter der Information zur Verfügung zu stellen. Das Benennung
und die Bedeutung der Schlüssel-Wert-Paare ist gleichbedeutend mit der
Payload-Definition unseres TCP/IP Protokolls.
Alle Schlüssel-Wert-Paare, die vom Proxy hinzugefügt werden beginnen mit einem
Unterstrich um Namenskonflikte zu vermeiden. Als Beispiel wird die gemessene
Temperatur eines Temperature Bricklets mit UID XYZ
wie folgt gepublished:
{
"_timestamp": 1440083842.785104,
"temperature": 2343
}
Topics die auf /set
enden, ermöglichen die Konfiguration eines Devices zu
ändern. Um zum Beispiel die Konfiguration eines Ambient Light Bricklet 2.0 mit
UID ABC
zu ändern wird folgender JSON Payload:
{
"illuminance_range": 1,
"integration_time": 2
}
unter folgenden Topic gepublished:
tinkerforge/bricklet/ambient_light_v2/ABC/configuration/set
Der Proxy parsed den Payload und ruft die dazugehörigen Konfigurations-Funktion auf.
Hierbei entsprechen die Schlüssel-Wert-Paare wieder der Payload-Definition unseres TCP/IP Protokolls. Im Beispiel wird die Illuminance Range auf 32000Lux und die Integration Time auf 150ms gesetzt.
Es gibt drei verschiedene enumerate/
Subtopics auf denen der Proxy
Ereignisse published:
tinkerforge/enumerate/available/<device-topic-prefix>
: Wenn die Liste der
verfügbaren Devices mit übereinstimmenden Topic-Prefix sich ändert wird eine
retained Message mit der aktualisieren Liste aller nun verfügbaren Devices
gepublished.tinkerforge/enumerate/connected/<device-topic-prefix>
: Wenn ein neues
Device mit übereinstimmenden Topic-Prefix verbunden wird, so wird eine
Nachricht mit Informationen über dieses Device gepublished.tinkerforge/enumerate/disconnected/<device-topic-prefix>
: Wenn ein
bekanntes Device mit übereinstimmenden Topic-Prefix getrennt wird, so
wird eine Nachricht mit Informationen über dieses Device gepublished.Ein LCD 20x4 Bricklet, dass verbunden wird, wird auf folgenden Topic gepublished:
tinkerforge/enumerate/connected/bricklet/lcd_20x4
Zusätzlich wird die
retained Message auf tinkerforge/enumerate/available/bricklet/lcd_20x4
aktualisiert. Die Device-Information wird für alle Subtopics in JSON in
folgendem Format repräsentiert:
{
"_timestamp": <timestamp>,
"uid": "<uid>",
"connected_uid": "<connected_uid>",
"position": "<position>",
"hardware_version": [<major>, <minor>, <release>],
"firmware_version": [<major>, <minor>, <release>],
"device_identifier": <device_identifier>
}
Für ein Temperature Bricklet sieht dies zum Beispiel wie folgt aus:
{
"_timestamp": 1440143404.176469,
"uid": "se3",
"connected_uid": "5VihSm",
"position": "c",
"hardware_version": [1, 1, 0],
"firmware_version": [2, 0, 3],
"device_identifier": 216
}
Die nachfolgende Tabelle zeigt alle aktuell unterstützen Devices mit deren Namen, Suffixen und Links. Die Links zeigen auf deren TCP/IP Protokoll Dokumentation, aus der die Payload-Definition entnommen werden kann.
Der Brick MQTT Proxy wurde entwickelt um einfach für andere Bricks und Bricklets
erweiterbar zu sein. Im
Source des Python-Scripts
finden sich weitere Informationen dazu wie dies funktioniert. Um ein anderes
Produkt hinzuzufügen muss nur eine eigene Proxy Klasse von DeviceProxy
abgeleitet werden. Kommentare im Sourcecode beschreiben die notwendige Struktur.