Einleitung


TheOpenTransporter (kurz: TOT) ist als Teil eines Teamprojektes, des Studiengang Informatik, der Hochschule Harz entstanden. TOT wurde als Teilprojekt in Auftrag gegeben, damit ein weiterer Teil des Teams die Möglichkeit bekommt via HTTP auf FHEM zugreifen zu können. Die Aufgabenstellung lag darin, nicht nur das lesen, sondern auch das schreiben und modifizieren aller Daten zu ermöglichen. Es wurde festgelegt, dass der Datentransfer per JSON durchgeführt werden soll. Aus verschiedenen Gründen konnte das Gesamtprojekt leider nicht fertiggestellt werden. TheOpenTransporter wurde aber voll funktionsfähig fertiggestellt und konnte daher der FHEM-Community zur Verfügung gestellt werden.

Modulstruktur


In dem FHEM-Modul TheOpenTransporter wird in der Define-Funktion ein passiver TCP-Socket aufgebaut, der ab diesem Zeitpunkt auf einen Verbindungsaufbau wartet. Sollte eine Verbindung angefordert werden, wird die Funktion „Read“ durch FHEM in TOT aufgerufen. In der Methode wird dann ein aktiver Socket angelegt. (Dies kann bei Bedarf auch ein SSL-Socket sein, sofern dies im Hauptmodul konfiguriert wurde.) Nach erfolgreichem anlegen des Client-Socket (aktiver Socket) kann dieser nun Anfragen entgegen nehmen. Es wird nicht nur ein Socket definiert, sondern ein Kind-Modul für diesen Socket mit dessen Port erzeugt. Sollten Daten eingegangen sein, wird der dafür genutzte Service festgestellt (GET, POST usw.). Bei einem bekannten Service (sind in einer Hashtable definiert) wird die dem Service zugehörige Verarbeitungsroutine aufgerufen. Bei einem unbekannten Service wird ein Http-Fehler-Code zurückgegeben (501 – Not Implemented). Die Verbindung bleibt nun solange bestehen, bis der Client diese beendet oder der Timeout abgelaufen ist. Der eigentliche Aufruf von Funktionen von TOT geschieht mittels Standard RFC-Konformität. Dies bedeutet, dass Funktions-Namen an die URL angehängt werden.

HTTP-Aufruf:
http://<Server-IP>:<Port>/<Funktionsname>?<Parametername1>=<Parameter1>&<Pname2>=<P2>

Je nach Art des Service werden die entsprechenden Routinen aufgerufen, welche die Funktion bestimmen und eine weitere Routine aufrufen, welche prüft, ob die angeforderte Funktion vorhanden ist. Sollte diese vorhanden sein, wird die entsprechende Funktion aufgerufen, andernfalls wird der HTTP-Fehlercode „404 – Not found“ zurückgegeben. Ein weiteres Feature ist, die explizite Unterscheidung der einzelnen Content-Types, die von den Clients gesendet werden und extra Abwicklungsroutinen besitzen. Sollte eine der beiden Seiten einen Content-Typen nicht unterstützen, wird dieser auf „text/html“ eingestellt.

Über die Autoren

Oliver Jathe
E-Mail: ojathe@TheOpenTransporter.de
Wohnort: Hannover

Marcus Viererbe
E-Mail: marcus.viererbe@TheOpenTransporter.de
Wohnort: Magdeburg