Empfang von http (chunked transfer)

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
homecontroller
User
Beiträge: 3
Registriert: Donnerstag 9. Februar 2012, 13:08

Hallo!

Ich bin absoluter Python-Anfänger und brauche für mein erstes Projekt Hilfe.
Hab mich schon durch google und dieses Forum gwühlt, aber leider noch nichts gefunden.
Und zwar möchte ich mit einem kleinen Pythonskript einen Link aufrufen, die Verbindung offen halten und jedes mal wenn etwas gempfangen wird, wird eine Ausgabe des strings gemacht.

Wenn ich den Link manuell im Browser öffne, kommt in variablen Zeitabständen (von wenigen Sekunden bis mehrere Minuten) eine neue Zeile mit dem emfangenen String.
Im Browserfenster ist dann folgendes zusehen:


1328793750;2012;2;9;Thu;14;22;30;+0100;A;6;Dimmer;dimmer;0.0
1328793776;2012;2;9;Thu;14;22;56;+0100;S;6;Livingroom;hygrometer;32.1
1328793776;2012;2;9;Thu;14;22;56;+0100;S;5;Livingroom1;temperature;18.9
1328793832;2012;2;9;Thu;14;23;52;+0100;S;2;Bedroom;hygrometer;33.6
1328793832;2012;2;9;Thu;14;23;52;+0100;S;1;Bedroom1;temperature;23.5
1328793951;2012;2;9;Thu;14;25;51;+0100;S;6;Livingroom;hygrometer;32.1
1328793951;2012;2;9;Thu;14;25;51;+0100;S;5;Livingroom1;temperature;19.0

usw. wenn ich das Browserfenster geöffnet lasse.

Die Zeilen werden im csv-Format übermittelt, und ich habe herausgefunden dass man diese Methode "Chunked Transfermode (HTTP/1.1 , RFC 2616)" nennt.

Ich denke die Schritte des Skripts sollten sein (Pseudocode):

*Öffne Link, halte Verbindung offen
*Warte auf string
*wenn string empfangen -> print string
*Springe zurück "Warte auf String"


Hat wer eine Idee wie ich das am Besten realisiern kann?
Danke!

LG
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich hätte jetzt eigentlich sagen wollen, natürlich funktioniert chunked encoding einfach so, aber laut http://stackoverflow.com/questions/7221 ... d-encoding ist das nicht der Fall.

Also würde ich's selbst machen. Da ich gerade keinen Server zur Hand habe, der Daten entsprechend sendet, hier ein ungetesteter Code-Schnipsel, wo ich mir nicht sicher bin, ob der Trenner \r\n korrekt gelesen wird. Ich bin mir sicher, dass ich nicht mit optionalen Parametern hinter der Längenangabe klar komme, aber kommen die in der Praxis vor?

Code: Alles auswählen

import urllib2

response = urllib2.urlopen(your_url)
if response.headers.get("transfer-encoding") == "chunked":
    length = int(response.readline(), 16)
    while length:
        print response.read(length)
        length = int(response.readline(), 16)
else:
    print repsonse.read()
Stefan
homecontroller
User
Beiträge: 3
Registriert: Donnerstag 9. Februar 2012, 13:08

Hallo Stefan!

Vielen Dank für die Antwort!
Hab das Skript mit meiner Serverurl ausprobiert, bekomme leider folgende Fehlermeldung:

14:08:39 Fehler in Befehl: "Python Skript"
14:08:39 Traceback (most recent call last) (1544):
14:08:39 TypeError: 'NoneType' object is not callable

Hast du eine Ahnung was ich falsch gemacht habe?
Zuletzt geändert von homecontroller am Samstag 11. Februar 2012, 14:46, insgesamt 1-mal geändert.
BlackJack

@homecontroller: Wie hast Du das denn ausgeführt? Das ist ja nicht die normale Ausgabe die man von Python bekommt. Die sollte nämlich einen kompletten Traceback enthalten und damit auch einen Hinweis auf die Programmzeile in der diese Ausnahme ausgelöst wird.
homecontroller
User
Beiträge: 3
Registriert: Donnerstag 9. Februar 2012, 13:08

@BlackJack:
Ich benutze die Automatisierungssoftware "Eventghost" (http://www.eventghost.org/). Da kann man mit Python kleine Skripts oder auch komplette Plugins schreiben.
Normalerweise kommt auch eine Fehlermeldung mit Zeilennummer, komischerweise bei diesem Fehler nicht. Hab auch schon im Eventghost-Forum nachgefragt, aber da hat überhaupt niemand eine Idee wie ich diesen chunked-transfer -"Stream" empfangen (bzw. im Hintergrund "abhorchen") kann.

Zur Info:
Ich möchte die Daten übers LAN von diesem Gerät empfangen: EzControl XS1 (http://www.ezcontrol.de. Und dann entsprechend in Eventghost auf die verschiedenen empfangenen Aktor-/Sensorwerte reagieren.

Aus der Doku der Ezcontrol XS1:
"subscribe – Aktor/Sensor Abonnement
Startet ein Abonnement von allen Aktor / Sensor Ereignissen.
Das XS1 behält die aktuelle Verbindung offen und liefert bei einen Schaltereignis, bzw. empfangenen Sensorwert eine Zeile mit Zeitstempel und Wert aus.
Die Übertragung der Daten bei den Formaten HTXT / TXT / CSV / TSV erfolgt mit dem Mimetype text/plain; charset=UTF-8 und im Chunked Transfermode (HTTP/1.1 , RFC 2616), dies sorgt dafür, dass die empfangenen Daten unmittelbar „live“ im Browser dargestellt werden und die Verbindung permanent offengehalten wird.
Anfrage (Client -> XS1):
http://192.168.1.242/control?callback=c ... format=csv
"
Antworten