Internetverbindung

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Hi,
also ich betreibe eine Kombination zwischen Raspberry Pi und einem Arduino. Der Arduino sendet in regelmäßigen Abständen Sensordaten an mein RasPi, welcher diese Informationen an ein php Script auf meinem Server schicken soll. Dafür versuche ich ein Post-Request abzusetzen, was mir leider nicht so ganz gelingt. Die Fehlermeldung plobt leider nur kurz auf: irgendetwas mit Response und Ready.

Vielleicht fällt der Fehler ja auch schon beim Blick auf den Programmcode auf:

Code: Alles auswählen

import serial
import urllib
print "Sensorprogramm gestartet"
ser = serial.Serial('/dev/ttyUSB0',115200)
while True:
           t1 = ser.readline()
           t2 = ser.readline()
           params = urllib.urlencode({'temp1':t1,'temp2':t2})
           f = urllib.urlopen("www.example.com/input.php',params)
           f.close()


Vielen Dank für eure Hilfbereitschaft
Georg
Zuletzt geändert von RudelGurken am Dienstag 28. Mai 2013, 12:03, insgesamt 7-mal geändert.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

wenn Dein Port 443 ist, dann willst Du wahrscheinlich HTTPS??
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie startest du denn dein Programm, dass du den Fehler nur kurz siehst? Aus einem Terminal heraus sollte die nicht verschwinden. Ansonsten wird ein Programm spätestens in Zeile 7 abschmieren, da i nicht bekannt ist (Hinweis: itertools.count).
Das Leben ist wie ein Tennisball.
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Nein, "i" ist bekannt, sorry, habe lediglich vergessen diese Zeile abzutippen.
Ich starte das Programm über die Shell und versuche es gerade mit der IDLE-Umgebung. Da steht dann:

Code: Alles auswählen

Traceback (most recent call las)
File "..../sensor.py" line 29, in <module>
content = connection.getresponse()
File ".../httplib.py" line 1022, in getresponse
 raise ResponseNotReady
ResponseNotReady
Der Fehler ist identisch, selbst wenn ich den Port weglasse.

vielen Dank
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Wie oft wird die Schleife denn durchlaufen, bzw. in welchem Durchlauf befindet sich die Schleife, wenn das Programm abgebrochen wird? Vielleicht machen die ungeschlossenen Verbindungen irgendwann Probleme.
Das Leben ist wie ein Tennisball.
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Gleich beim ersten Durchlauf, erst werden die Sensorwerte ausgegeben (obiger Quellcode ist jetzt absolut komplett) und dann kommt der Error.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Obriger Quelltext ist immer noch inkorrekt wie man am Syntax-Highlighting sieht. Warum kopierst du das nicht direkt vom Pi, statt das immer fehlerbehaftet abzuschreiben? Das ist doch Quatsch das so zu machen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Drache
User
Beiträge: 51
Registriert: Montag 29. November 2010, 21:51
Wohnort: Berlin
Kontaktdaten:

ersetze doch mal "www.example.com" durch die ip Adresse des raspberry pi.
BlackJack

@Drache: Das würde keinen Sinn machen, denn das example.com steht ja für einen Server zu dem die Daten vom Raspi aus versendet werden sollen. Der hat die Messwerte ja schon und will sie nicht zu sich selbst senden.

@RudelGurken: Ich schliesse mich Leonidas an: Zeig den tatsächlichen Quelltext und schreib ihn nicht ab, sondern kopiere ihn.

Das der Quelltext im ersten Beitrag immer noch nicht der tatsächliche sein kann, sieht man doch ziemlich deutlich am Syntax-Highlighting. Nach der ``connection.request(…``-Zeile gehört alles zu einem Zeichenkettenliteral welches nicht beendet wird.

Anstelle von `httplib` und `urllib` würde ich das `requests`-Modul empfehlen. Das muss man zwar zusätzlich installieren, aber es stellt eine wesentlich schönere API zur Verfügung und hat ausser der Standardbibliothek keine weiteren Abhängigkeiten.

Ich verstehe den Umstand mit dem `i` in der Schleife auch nicht so wirklich. Wenn Du die beiden Werte nacheinande von der seriellen Verbindung lesen willst, dann mach das doch einfach. Also einfach zwei `readline()`-Aufrufe hintereinander ausführen. Nichts anderes passiert jetzt ja auch, nur halt deutlich umständlicher.
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Hi, vielen Dank für die Antwort.
Ich kann nicht ohne weiteres auf den RasPi zugreifen, wodurch ich den Quellcode nicht einfach kopieren kann. Ich arbeite nun lediglich mit urllib und habe es hinbekommen. Als nächstes schaue ich mir einfach mal die request-Bibliothek an, vielleicht ist das ja noch einfacher.
Zum i:
wenn i=1 dann ist das Sensor1
wenn i=2 dann ist das Sensor2
nur so kann ich die Werte als Einheit abschicken, sprich, wenn alle Werte zusammen sind (hier 2) kann der Request abgesendet werden.
mfg
RudelGurken

Ich habe meinen funktionstüchtigen Code jetzt oben eingetragen-wieder von Hand.
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Ich weiß es ist ätzend jemandem zu helfen, der sich mit Python nicht so richtig auskennt, dennoch würde ich gerne noch ein Image-File als Post mit übergeben. Wie realisiere ich das am besten, wonach muss ich da gezielt suchen?
mfg
Gurke
BlackJack

@RudelGurken: Der Quelltext ist immer noch falsch, und zwar syntaktisch. Und TRUE würde immer noch zu einem `NameError` führen.

Offensichtlich hat der Raspi ja eine Internetverbindung, also musst Du doch da auch drauf zugreifen können, zum Beispiel mit SSH und/oder Daten kopieren mit SCP.

Zum `i`: Das verstehe ich nicht. Wieso kannst Du nicht erst den einen Wert abfragen und dann den anderen und dann beide schicken, ohne dieses unnötige zählen und testen mit dem `i`? Es gibt echt keinen Grund in dem Quelltext warum man das so kompliziert machen müsste.

Was meinst Du mit Image-File? Ein Bild? Das müsstest Du irgendwo anders hochladen wo man drauf verlinken kann, und dann einen Link darauf mit dem Img-Tag setzen.
Benutzeravatar
Kebap
User
Beiträge: 786
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Anscheinend kann man i komplett weglassen, ohne die Logik zu verändern:

Code: Alles auswählen

while True:
       x=ser.readline()
       t1 = x
       print t1
       x=ser.readline()
       t2 = x
       print t2
       params = urllib.urlencode({'temp1':t1,'temp2':t2})
       f = urllib.urlopen("www.example.com/input.php',params)
       f.close()
x könnte man auch noch weglassen, das überlasse ich dem geneigten Leser.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
RudelGurken
User
Beiträge: 29
Registriert: Freitag 24. Mai 2013, 09:51

Okay, das mit dem i stimmt, habe ich behoben und es funktioniert super. Danke, kann ein jpeg-Bild nicht auch irgendwie per Post mitgeben? Indem ich diedatei einlese und das Objekt dann mit schicke?
mfg
Gurke
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Nutz ``requests`` wie BlackJack sagte, dann funktioniert das übergeben von JPEG-Daten (oder irgendwelchen anderen) auch einfach.

Und wenn du keinen Zugriff auf den Raspberry Pi hast, wie programmierst du ihn dann? Ich glaube du übersiehst dass es durchaus Möglichkeiten gibt den Quelltext zu übertragen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten