<< Die Sprache der Bahn | Home | Kommunikation mit Buderus Gateway KM100 (Teil 2) >> | Kontakt

Kommunikation mit Buderus Gateway KM100 (Teil 1)

Alles nacheinander!

Als Programmierer bin ich natürlich daran interessiert, die im Hause verbaute Hardware so gut es geht zu nutzen, ggf. auch unter Zuhilfenahme selbst geschriebener Programme. So war ich sehr erfreut, als ich im großen Netz lesen konnte, daß sich für das Buderus Gateway Logamatic web KM100 schon jemand die Mühe gemacht hatte, das Protokoll zu entschlüsseln. Mein Dank geht an Andreas Hahn, der seine Untersuchungen dokumentierte.

Mein erstes Testprogramm sollte in Java geschrieben werden und den Betriebszustand der Heizung regelmäßig in einer (MySQL-) Datenbank vermerken. Ich hatte zwar verschiedene Beispiele für die Kommunikationsschnittstelle im Netz gefunden, so ganz entsprach keines aber ganz meinen Anforderungen. Also fing ich an, den Kern der Kommunikation selbst zu implementieren. Da es sich um eine einfache HTTP/1.0-Schnittstelle handelt, startete ich mit URL und HttpURLConnection. Das funktionierte prinzipiell erst mal, beim Auslesen der Diensteübersicht mit vielen aufeinanderfolgenden Anfragen erhielt ich aber immer wieder Fehlermeldungen. Diese waren meist eine SocketException, die Verbindung wurde unerwartet unterbrochen.

Also schaute ich mit tcpdump nach, was da wirklich auf der Leitung passierte. Die Ursache war auch schnell gefunden: Von meinem Client wurde eine HTTP-Verbindung aufgebaut. Das KM100 teilte in der Antwort mit, daß es nur HTTP/1.0 sprechen würde, dazu paßte auch, daß die Verbindung nach dem Senden der Antwort mit einem FIN-Paket abgebaut werden soll. Daraufhin baute mein Client schon eine neue Socket-Verbindung auf, der SYN-Handshake begann. Im Hintergund wurde parallel die vorige Verbindung abgebaut, mein Client schickte das abschließende FIN. Und da kam das KM100 wohl ducheinander: auch die neue Verbindung wurde sofort durch ein FIN beendet, was für den Client natürlich unerwartet kam und Fehlermeldungen provozierte.

Ich versuchte durch verschiedene Parameter das Verhalten der HttpURLConnection zu ändern, konnte aber keine fehlerfreie Kommunikation hinbekommen. Da das Protokoll recht einfach ist, war es aber kein Problem, HTTP/1.0 soweit wie nötig auf Basis eines Sockets selbst zu implementieren. Mit der richtigen Reihenfolge von write-Operationen, flush und close konnte ich schließlich erreichen, daß eine fehlerfreie Kommunikation mit dem KM100 möglich ist, auch bei vielen aufeinanderfolgenden Anfragen.

Lektion 1:
Bevor eine 2. Anfrage per HTTP an das KM100 geschickt wird, muß gewährleistet sein, daß die vorige Socket-Verbindung von allen Seiten per FIN sauber beendet wurde.
Tags :



Kommentar hinzufügen Trackback senden