Hallo zusammen, ich bin hier am Experimentieren und möchte einen Temperaturwert der in meinem ATMEGA16 vorliegt per GPRS versenden und auf meinem PC im Firefox angezeigt bekommen. Ich war schon bei gidf aber wirklich weitergekommen bin ich dort nicht. Wie weit bin ich: Also der Atmel hat den Temperaturwert und ist mit dem GPRS Modem via UART verbunden (die beiden verstehen sich auch). Im GPRS Modem habe ich eine TCP/IP Verbindung zum Telekomrechner aufgebaut (AT Befehle). Mein Rechner zu Hause hat per dynDNS eine "öffentliche" IP Adresse. Das GPRS Modem unterstützt mich jetzt nicht mehr weiter (mit AT Befehlen etc.), die TCP/IP Verbindung steht und nun? Hier hänge ich also gerade und suche Rat, den mir hoffentlich jemand von Euch geben kann. Ich sag schon mal DANKE! Was und in welcher Form muss ich an das Modem jetzt senden damit der Firefox z.B. 100 anzeigt (100°C). Muss ich dafür einen kompletten WEB Server im Atmel integrieren oder geht es auch einfacher? Grüße K. Ritter
eine möglichkeit wäre es, einen http get header an den port 80 eines existierenden webservers (auf deinem rechner, nicht am atmega) zu schicken, diesen musst du natürlich einrichten, und auf diesem muss eine seite liegen (z.b. php) die den parameter "100" übernimmt und z.b. in eine datenbank abspeichert und anzeigt. hierzu solltest du dich über mehrere sachen erkundigen: 1) wie sieht der http header aus und schaffst du es, so einen (mit parameter) zu senden? 2) wie setzt man einen webserver, evtl mit datenbank, auf und wie macht man den übers internet erreichbar (port forward?)? 3) wie schreibt man eine php seite, die einen parameter entgegennimmt und diesen in eine datei / in die datenbank schreibt? 4) wie schreibt man eine php seite, die auf die datei / datenbank aus (3) zugreift und den letzten eintrag anzeigt? viel zu tun also ;) mfg
Du müsstest dann mehrere Schichten aufbauen: a) die GPRS Verbindung (per AT Kommandos) b) mit PPP ins Netzt kommen (also die IP Schicht) c) TCP d) HTTP Weiss nicht, ob ATMega16 dafür genug wäre; würde eher ATMega644, oder so nehmen. Für TPC/IP gibt's schon Sachen, wie uIP, parat... Joa, und dann noch ein Problem: weiss nicht, ob man so einfach eine öffentliche IP Adresse bei dem Handy Anbieter bekommt (jedenfalls bei uns, d.H. in der Tscheichei, kostet so was ziemlich viel, wenn's überhaupt angeboten wird...)
ok, evtl habe ich das problem vorher falsch verstanden. ich würde nicht mit dem standpc den yc pollen, sondern umgekehrt mit dem yc die daten auf den server pushen. das spart einen haufen arbeit und platz im yc. außerdem spart das eine statische ip beim gprs modem (oder einen dynamischen fqdn). laut TE funktioniert tcp ja schon, also wird es wohl nicht notwendig sein den stack erneut zu implementieren. mfg
Konrad Ritter schrieb: > Das GPRS Modem unterstützt mich jetzt nicht mehr weiter (mit AT Befehlen > etc.), die TCP/IP Verbindung steht und nun? Bist Du dir da sicher? Üblicherweise ist dazu noch eine PPP Kommunikation zwischen Modem und µC nötig. Sprich Du müsstest sehr wohl einen PPP und IP Stack auf dem µC laufen haben.
Hallo, also besten Dank für die Hinweise, ist genau das wonach ich gesucht habe, eben einen Schubser in die richtige Richtung! @Jan S. Das GPRS Modem hat u.a. folgenen Befehl: ... AT+MIPOPEN, Open a Socket (UDP or TCP) This command causes the module to initialize a new socket and open a connection with a remote side. Each socket allocates an accumulating buffer whose size is 1372 bytes. EXAMPLE: AT+MIPOPEN=1,0,"WWW.GOOGLE.COM",80,0//TCP OK... Zu Deinem Hinweis, muss ich jetzt noch den IP Stack realisieren? Grüße K. Ritter
Konrad Ritter schrieb: > Zu Deinem Hinweis, muss ich jetzt noch den IP Stack realisieren? Nein musst Du nicht mehr.
Hallo @A0 S0 also ich denke ich bin schon mal ein ganzes Stück weiter auf dem von Dir vorgezeichneten Weg. Der lokale WebServer läuft und ist per dyndns von Außen ansprechbar. Die Datei index.php enthält folgenden Code: <?php echo "Temperatur 1: "; echo $_GET["Temperatur1"]; echo "<br />"; echo "Temperatur 2: "; echo $_GET["Temperatur2"]; ?> und wird so aufgerufen: http://xxx.dyndns.org/index.php?Temperatur1=37%B0C&Temperatur2=42%B0C Die so übergebenen Temperaturwerte werden dann im Webbrowser angezeigt. Morgen kommt dann der get Befehl dran! Grüße K. Ritter
also das ist schon ganz gut. natürlich muss das ganze auch noch gespeichert werden, also ein teil soll schreiben und einer lesen. hierzu entweder zwei php dateien verwenden, oder aber einen neuen parameter &write=1 oder so einführen. die aufteilung in 2 dateien würde ungefähr wie folgt aussehen (ungetestet, aber die wichtigsten befehle sollten vorhanden sein) write.php <?php $temp1 = $_GET["Temperatur999"]; $temp2 = $_GET["Temperatur123"]; $datei = fopen("log.txt", "w"); fwrite($datei, "$temp1\n$temp2"); fclose($datei); ?> read.php <?php $temparr = file("log.txt"); echo $temparr[0] . "<br>"; // wird die erste zeile aus log.txt ausgeben echo $temparr[1]; // wird die zweite zeile aus log.txt ausgeben ?> fehlerbehandlung ist keine vorhanden, es hätte vorerst auch keinen sinn in der write.php fehler auszugeben, da ja dann der yc darauf reagieren müsste (--> noch mehr aufwand). in der php doku zu den jeweiligen befehlen werden mögliche fehler behandelt, siehe als z.b. http://php.net/fwrite oder http://php.net/file wenn die lese-datei übrigens read.php heißt und von mehreren personen eingesehen werden kann, sollte die schreib-datei nicht write.php heißen, das könnte zu leicht erraten und fehlverwendet werden. einfach den seitennamen in 32 random zeichen ändern schafft schon ein minimum an sicherheit. mfg edit: bitte nur die werte übergeben, nicht die einheiten. spart übertragungsvolumen und nerven, da sie sich ja sowieso nicht ändern. das grad zeichen kann bei der ausgabe wieder angehängt werden.
Hallo @A0 S0 danke für Deine nützlichen Hinweise, am Web-Server mittels PHP Schreiben und Auslesen funktioniert mit dem WebBrowsser als Testumgebung schon mal. Ich hab die Anzeigefunktion noch etwas umgebaut, es führen ja viele Wege nach Rom: (damit werden alle abgespeicherten Werte aus der Datei gelistet) $counter = 0; while (!feof($handle)) { $data = fgets($handle, 512); if ($data!="\r\n" && $data!="") { echo "Temperatur "; echo $counter; echo ": "; echo $data; echo " °C"; echo "<br>"; $counter++; } else echo "<br>"; } Mein Ziel ist es ja die Temperaturwerte via "Get-Methode" das HTTP vom ATMEGA zu senden. Dazu muss ich mir in C# jetzt erst mal eine kleine Testumgebung bauen um damit das GPRS Modem entsprechend komfortabel steuern zu können. Alles nur aus dem Hyperterminal auslösen ist sehr umständlich. Mit Wireshark habe ich dann vor die ankommenden Pakete am Web-Server einzufangen und zu analysieren. Die wichtigsten Kommandos des eingesetzten GPRS Modems sind: // T-Mobile SIM Karte im Einsatz // baut eine PPP Verbindung zum Telekom Rechner auf at+mipcall=1,"internet.t-d1.de","tm","tm" // TCP Socketverbindung zum Web-Server aufbauen // local Port 1280; remote Port 80 (HTTP) AT+MIPOPEN=1,1280,"x.x.x.x",80,0 // x IP Adresse des Web-Servers // Daten HEX codiert in Socketbuffer schreiben, (Daten werden noch nicht gesendet) AT+MIPSEND=1,"41424344" // ascii “ABCD” // Werte aus Socketbuffer senden AT+MIPPUSH=1 // Socket schließen at+mipclose=1 // Abbau der Verbindung zum Telekom Rechner at+mipcall=0 So wie hier beschrieben funktioniert das ganze auch schon, ABCD kommen schon mal im Wireshark an, der Web-Server kann damit jedoch noch nicht viel anfangen. Deshalb die oben genannte Testumgebung – alle Zeichen der Get-Methode müssen nach Hex gewandelt werden…das ist zu Fuß nicht wirklich lustig…. GET /Werte_speichern.php?Temperatur1=2&Temperatur2=1 HTTP/1.1\r\n Host:web-server.dyndns.org Ich hoffe dass es dann so auch funktionieren wird! Grüße K. Ritter
klingt alles ganz erfolgversprechend. falls du das nicht schon getan hast, würde ich noch die write.php um das speichern eines datums erweitern, sinngemäß date("Y-m-d H:i:s"). das grad zeichen evtl noch durch ° ersetzen. was spricht zum codieren gegen eine seite wie: http://www.maxi-pedia.com/ascii+to+hex+converter (gefunden mit google "ascii hex converter online") spuckt für deine zwei get-zeilen nach einem replace von % auf null folgendes aus: 474554202F57657274655F73706569636865726E2E7068703F54656D7065726174757231 3D322654656D70657261747572323D3120485454502F312E315C725C6E486F73743A7765 622D7365727665722E64796E646E732E6F7267 zum testen könntest du versuchen, mittels mini programm oder terminal die seite am server aufzurufen (die der atmega später aufrufen soll). dass die übertragung im normalfall fehlerfrei das überträgt, was du übertragen willst, kann glaube ich als gegeben angenommen werden. wünsche weiterhin viel erfolg. mfg
$A0 S0 Die kleine Testumgebung und der Konverter waren schnell "zusammengenagelt"... Probleme bereitet noch die HTTP-Datenübertragung. Per AT Kommando lassen sich alle möglichen Daten an den Webserver senden (WireShark zeigt diese an), sobald jedoch in der Nachricht eine HTTP Methode enthalten ist, kommt diese nicht mehr an. Scheint fast so als ob der Telekom-Server diese rausfischt..., blos warum? zur Zeit nutze ich diese Zugangsdaten: APN (Zugangspunkt): internet.t-d1.de Benutzername: tm Password: tm Gibt es einen anderen Server der HTTP durchlässt? Grüße K. Ritter
im moment fällt mir da nichts dazu ein (ist auch schon ein bisschen spät), aber wenn du deine testumgebung selbst programmiert hast, wäre es doch auch möglich eine kleine serverapplikation zu schreiben, die auf einem nicht well-known port lauscht und wertepaare in form von z.b. 1:30 (für temp1, 30°C) entgegennimmt und diese in die textdatei schreibt. damit würde man den ganzen http krempel umgehen, der in dem fall vielleicht sowieso nichts bringt. mfg
A0 S0, Danke noch mal für Deine hilfreichen Hinweise. Ich denke ich bin ein ganzes Stück weitergekommen. Neben dem WebServer habe ich mir einen kleien TCP Server "gefrikkelt". Dieser lauscht auf Port (3xxx) und nimmt die GPRS Daten entgegen. Funktioniert prächtig, aber eben nicht mit Port 80. Ich werde trotzdem noch versuchen mit dem Provider zu klären warum er die HTTP-Methoden rausfischt. Evtl. gibt es ja noch eine Einwahl wo dieses nicht passiert. Direkt über HTTP hätte eben Charm, da dieser Port fast überall offen ist. Also, besten Dank noch mal!!! Grüße K. Ritter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.