Forum: Mikrocontroller und Digitale Elektronik Daten aus ATMEGA per GPRS an IExplorer senden


von Konrad R. (kritter)


Lesenswert?

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

von A0 S. (as0)


Lesenswert?

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

von der Tscheche (Gast)


Lesenswert?

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...)

von A0 S. (as0)


Lesenswert?

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

von Jan S. (jan_s)


Lesenswert?

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.

von Konrad R. (kritter)


Lesenswert?

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

von Jan S. (jan_s)


Lesenswert?

Konrad Ritter schrieb:
> Zu Deinem Hinweis, muss ich jetzt noch den IP Stack realisieren?

Nein musst Du nicht mehr.

von Konrad R. (kritter)


Lesenswert?

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

von A0 S. (as0)


Lesenswert?

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.

von Konrad R. (kritter)


Lesenswert?

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

von A0 S. (as0)


Lesenswert?

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 &deg; 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

von Konrad R. (kritter)


Lesenswert?

$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

von A0 S. (as0)


Lesenswert?

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

von Konrad R. (kritter)


Lesenswert?

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

von frank s. (Gast)


Lesenswert?

@kritter
hallo
welches gprs modem nutz du ?

von Konrad R. (kritter)


Lesenswert?

Hallo,

ich verwende Motorola G24L.

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
Noch kein Account? Hier anmelden.