Spiele mit MQTT Kommunikation


MQTT: Protokoll für das Internet der Dinge

MQTT (Message Queuing Telemetry Transport) ist ein weit verbreitetes Kommunikationsprotokoll, das die Datenübertragung in Form von Nachrichten über das bestehende Internetnetz ermöglicht. Ein MQTT-Clients kann zu einem frei gewählten Thema (Topic) Informationen publizieren (publish). Clients, die diese Informationen erhalten wollen, müssen dieses Topic abonieren. Sobald neue Informationen zu diesem Topic publiziert werden, erhalten alle abonierten Clients diese Information. Die zentrale Komponente von MQTT ist ein sogenannter MQTT-Broker, der die Topics verwaltet und die publizierten Informationen weiterleitet. Es laufen also alle Transaktionen über den Broker, es gibt keine direkte Verbindung zwischen den Clients (man nennt diese Organisationstruktur Hub and Spoke Architektur und wird auch im Transportwesen benutzt).

MQTT ist eine sinnvolle Alternative zur Client-Server-Kommunikation, insbesondere für die Kommunikation mit Microcomputern und mobilen Geräten, bei denen die Ressourcen knapp sind. MQTT kommuniziert sehr sparsam. Im Unterschied zu den HTTP-Requests, die viele Daten für den Protokoll-Header brauchen, beträgt der MQTT Overhead nur einige wenige Bytes. Zudem benötigen Clients keine feste IP-Adresse und können sowohl Sender wie Empfänger sein. MQTT wir in der Praxis häufig für die Übermittlung von Messwerten (z.B. Temperatur) von Microcontrollern verwendet.

MQTT sehr gut für die Kommunikation bei Online-Spiele. Die gleichen Games, die im vorhergehenden Abschnitt die Kommunikation mit TCP verwenden, können einfach auf die Kommunikation mit MQTT umgeschrieben werden. Im Internet findet man mehrere kostenlose MQTT-Broker (m2m.eclipse.org, test.mosquitto.org, broker.hivemq.com). Man kann aber auch sehr einfach einen eigenen MQTT-Broker auf einem Raspberry Pi in Betrieb nehmen. In unserer RaspiBrick-Distribution ist der Mosquitto MQTT Broker integriert. Eine Anleitung finden Sie hier.

Für die Kommunikation zwischen den beiden Spielpartnern werden die Befehle aus dem Modul mqttclient verwendet. Im Unterschied zur Client-Server Kommunikation, sind bei MQTT beide Geräte Clients und verwenden denselben Programmcode.

Als MQTT Broker wird in allen unseren Beispielen ein Gratisbroker aus dem Internet gewählt:
host = "m2m.eclipse.org"

Die Messages werden unter einem Topic, ublished und subscribed, der im Programmcode festgelegt ist. Jedes Spiel muss ein eigenes Topic verwenden, damit es keine Konflikte zwischen den Spielen gibt. In unserem ersten Beispiel wählen wir: myTopic = "/swissgame/battleship"

Die Clients werden als Instanzen der Klasse GameClient erzeugt und dabei die Callbackfunktionen onStateChanged und onMessageReceived registriert.
client = GameClient(onStateChanged, onMessageReceived, myTopic)

Der Status der Verbindung wird mit der Callbackfunktion onStateChanged(state) überwacht. Der Parameter state kennt die Zustände 'CONNECTING' (während des Verbindungsaufbaus zum Broker), 'CONNECTED' (falls mit Broker verbunden, aber noch auf den Spielpartner wartet), 'READY' (beide Spieler sind spielbereit) und 'DISCONNECTED'.

Die Callbackfunktion onMessageReceived() wird aufgerufen, wenn eine Message ankommt. Mit der Funktion sendMessage() werdenn Messages in Form eines Strings gesendet werden.

client.connect(host, port) startet den Verbindungsaufbau zum Broker auf dem gegeben Port (default 1883)
client.disconnect() beendet die Verbindung zum Broker

Die nachfolgenden Programmbeispiele können auf zwei beliebig entfernten Computern mit Internetzugang gestartet werden, vorausgesetzt, dass der Port 1883 für ausgehende Daten geöffnet ist, was auf den meisten im Homebereich verwendeten Computern der Fall ist. In öffentlichen Institutionen mit strengen Firewall Einstellungen muss die Kommunikation eventuelle über den Port 80 erfolgen. Zum Testen können auch zwei TigerJython-Fenster auf dem gleichen Gerät geöffnet werden.