Daten per Modem zu einem Server senden

Der chaotische Hauptfaden

Moderatoren: Heaterman, Finger, Sven, TDI, Marsupilami72, duese

Antworten
jodurino
Beiträge: 2109
Registriert: So 17. Nov 2013, 20:43

Daten per Modem zu einem Server senden

Beitrag von jodurino »

Hallo

hatte schon auf dem Treffen den ein oder anderen damit gelöchert (hoffentlich nicht zu sehr genervt)

Zeil ist es ein paar Daten via LTE Modem zu einem Server zu senden
Das Modem hört auf AT Befehle und wird via RS232 angesprochen

ich sende: at#gprs=1

das Modem antwortet mit: +IP: "IP Adresse " und einige Zahlen

Mein nächster Befehl:
at#sd=1,0,PORT,"IP_VOM_SERVER",0,0,0

wird mit
CONNECT quittiert

nach einer Weile kommt dann:
NO CARRIER

Hier dann auch mein Problem:
Zitat aus der AnleitungsPDF:

Open the connection toward the HTTP server on port=80. Transport protocol is TCP.

AT#SD=6,0,80,"HTTP_server_address",0,0

CONNECT  the connection is open. The module is in ONLINE mode.
Now, following the HTTP protocol, ask the homepage by sending the next lines to the
module. The entered data are sent directly to the HTTP server. The strings sent to the HTTP
server must be ended by line feed character. To see the issued commands, enable the local
echo on terminal emulator.

GET / HTTP/1.1<cr><lf>
Host: www.xxxx.com<cr><lf>
Connection: keep-alive<cr><lf>
<cr><lf>


The HTTP server replies with the HTML code of the homepage and some debugging
responses.
HTTP/1.1 200 OK
Date: Thu, 06 2003 10:21:58 GMT
Server: Apache/1.3.27 (Unix)
Last-Modified: Thu, 06 2003 10:21:58 GMT
Content-Type: text/html
Connection: close
80000ST10028A Rev. 23 Page 132 of 164 2017-10-24

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 FINAL//EN">
<HTML>
··· here is all the HTML code of the page ···
</HTML>


+++
 type in the escape sequence to suspend the connection.
OK  the module is in COMMAND mode.
AT#SH=6
OK  the connection is closed; the GSM context is still active.

ZITAT ENDE

SO nu das Problem vom TerminalProgramm aus kann ich nach dem at#sd=1,0,PORT,"IP_VOM_SERVER",0,0,0 nix mehr eingeben solange bis dann NO CARRIER kommt
Das: GET / HTTP/1.1<cr><lf>
Host: www.xxxx.com<cr><lf>
Connection: keep-alive<cr><lf>
<cr><lf>

könnte ich per RS232 senden, wenn es denn so richtig ist

Da hakt es bei mir

cu
jodurino
andreas6
Beiträge: 4165
Registriert: So 11. Aug 2013, 15:09

Re: Daten per Modem zu einem Server senden

Beitrag von andreas6 »

Zunächst mal ist die Anleitung grober Murks. Wer "line feed" im Text benennt und im Beispiel cr+lf verwendet, hat diese Thematik nicht verstanden. Probiere bitte aus was richtig ist. Oder und schaue in Foren nach, Du wirst nicht der einzige Nutzer sein. Es ist nützlich, ein ausgesprochenes Terminalprogramm zu verwenden was solche Feinheiten beherrscht und fest einstellen lässt.
Dann beachte den Hinweis auf ein lokales Echo. Schalte dies ab genanntem Zeitpunkt ein, präge Dir die Tastenkombination dafür ein und benutze sie blind. Man KANN das lokale Echo auch vorher einschalten, sieht dann aber anfangs alle Zeichen doppelt. Das ist schlecht lesbar aber es geht nichts verloren.

MfG. Andreas
jodurino
Beiträge: 2109
Registriert: So 17. Nov 2013, 20:43

Re: Daten per Modem zu einem Server senden

Beitrag von jodurino »

andreas6 hat geschrieben: Mo 21. Aug 2023, 19:16 Zunächst mal ist die Anleitung grober Murks. Wer "line feed" im Text benennt und im Beispiel cr+lf verwendet, hat diese Thematik nicht verstanden. Probiere bitte aus was richtig ist. Oder und schaue in Foren nach, Du wirst nicht der einzige Nutzer sein. Es ist nützlich, ein ausgesprochenes Terminalprogramm zu verwenden was solche Feinheiten beherrscht und fest einstellen lässt.
Dann beachte den Hinweis auf ein lokales Echo. Schalte dies ab genanntem Zeitpunkt ein, präge Dir die Tastenkombination dafür ein und benutze sie blind. Man KANN das lokale Echo auch vorher einschalten, sieht dann aber anfangs alle Zeichen doppelt. Das ist schlecht lesbar aber es geht nichts verloren.

MfG. Andreas
Hallo Andreas,

habe es mit Hterm & Termite usw. probiert, das geht dann mit "nur" dem CR LF&CR ergibt einen ERROR (EDIT SAGT NUR CR ist RICHTIG)

Mit dem Programm vom Modemhersteller bekomme ich die Antworten vom Modem dargestellt mit den anderen Terminalemulatoren nur den Befehl den ich auch sende. Schalte ich dann bei Termite den Lokal Echoo aus kommt auch nur der ERROR

wer denkt sich denn so was aus, natürlich gitb es in dem OriginalProgramm keine Tastenkombination für LokalEcho (habe da noch nix gefunden)
virtexultra
Beiträge: 139
Registriert: So 9. Dez 2018, 11:30

Re: Daten per Modem zu einem Server senden

Beitrag von virtexultra »

Ich habe das Problem nicht verstanden. Das Modem geht nach dem #SD und Bestätigung mit CONNECT in den Online Mode und überträgt somit alle eingegebenen Daten direkt an den Socket, bis es die Escape Sequenz +++ empfängt. Nach dieses Sequenz, pausiert? es die Verbindung und wechselt in den Command Mode und sollte des mit OK anzeigen.

Das <cr><lf> aus dem Beispiel ist ja etwas aus dem HTTP Protokoll und hat nichts mit dem line ending über die serielle Verbindung direkt zum Modem zu tun.
jodurino
Beiträge: 2109
Registriert: So 17. Nov 2013, 20:43

Re: Daten per Modem zu einem Server senden

Beitrag von jodurino »

virtexultra hat geschrieben: Mo 21. Aug 2023, 20:50 ....

Das <cr><lf> aus dem Beispiel ist ja etwas aus dem HTTP Protokoll und hat nichts mit dem line ending über die serielle Verbindung direkt zum Modem zu tun.
Ok sende ich dann so mit
virtexultra hat geschrieben: Mo 21. Aug 2023, 20:50 Ich habe das Problem nicht verstanden. Das Modem geht nach dem #SD und Bestätigung mit CONNECT in den Online Mode und überträgt somit alle eingegebenen Daten direkt an den Socket, bis es die Escape Sequenz +++ empfängt. Nach dieses Sequenz, pausiert? es die Verbindung und wechselt in den Command Mode und sollte des mit OK anzeigen.

...
bei mir ist halt das Problem, über die Terminalsoftware kann ich nichts mehr eingeben in dem Moment wo der Connect besteht.

Über RS232 kann ich was im Blindflug senden, aber was genau möchte der Server da von mir?
Beispiel:
(void)sprintf(sci_tx_buffer.data, "GET / HTTP/1.1<cr><lf>");
sci_buffer_send();

sendet genau: GET / HTTP/1.1<cr><lf>

warte ich dann auf:
Host: www.xxxx.com<cr><lf>

oder muss ich Host: www.xxxx.com<cr><lf> auch senden?

Da hakt es bei mir

Edit sagt:

****************************************
at#sd=1,0,80,"www.google.de",0,0,0
CONNECT
=>hier ein beliebiges Req zum Server -> wird von Google nicht mit
einem Bad Request beantwortet => hier ein +++ eingegeben ->
Command Mode OK => Timeout NO CARRIER
****************************************
at#sktd=0,80,"www.google.de",255,0
CONNECT
NO CARRIER

****************************************

das habe ich mal probiert, mann kann im ersten Fall +++ tippen und es kommt OK
dann bin ich wieder im AT-Command Mode
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Daten per Modem zu einem Server senden

Beitrag von xoexlepox »

(void)sprintf(sci_tx_buffer.data, "GET / HTTP/1.1<cr><lf>");
Hier solltest du wohl besser "\r\n" statt "<cr><lf>" verwenden, damit die korrekten Bytecodes (und nicht die eingegebenen Zeichen) versendet werden.
oder muss ich Host: www.xxxx.com<cr><lf> auch senden?
Bei "HTTP/1.1" offiziell ja, bei "HTTP/1.0" nicht -> Hängt vom Server ab.

Und nach dem HTTP-Header müssen zwei aufeinanderfolgende Zeilenumbrüche gesendet werden, damit der Server erkennen kann, daß der Request-Header nun zuende ist.

Edit: Für genauere Infos zum HTTP-Protokoll kannst du dich ja mal durch RFC 1945 quälen ;)
Benutzeravatar
Fritzler
Beiträge: 12604
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Daten per Modem zu einem Server senden

Beitrag von Fritzler »

jodurino hat geschrieben: Di 22. Aug 2023, 04:27 bei mir ist halt das Problem, über die Terminalsoftware kann ich nichts mehr eingeben in dem Moment wo der Connect besteht.
Doch, aber das Modem schickt kein Echo der eingegeben Daten mehr zurück, weil die 1zu1 ins Internet wandern.
Daher siehste nur nix.

Im Terminal rumfummeln bringt hier nix, weil man immers Gleiche eingeben muss und dann gehts doch nich und dann vertippt man sich.
Das frustriert doch nur.
Bau dirn Pythonscript aufm PC, was per RS232 raushustet (pyserial) oder greif einen uC in der Nähe, der willig is.
Da dann Code drauf und immer etwas anpassen.

Wenns ein Webserver mit HTTP ist will der HTTP Anfragen sehen, also mach dich mal schlau:
https://de.wikipedia.org/wiki/Hypertext ... r_Protocol
HTTP könnwa dir jetz nich von Grund auf Erklären.
jodurino
Beiträge: 2109
Registriert: So 17. Nov 2013, 20:43

Re: Daten per Modem zu einem Server senden

Beitrag von jodurino »

xoexlepox hat geschrieben: Di 22. Aug 2023, 06:31
(void)sprintf(sci_tx_buffer.data, "GET / HTTP/1.1<cr><lf>");
Hier solltest du wohl besser "\r\n" statt "<cr><lf>" verwenden, damit die korrekten Bytecodes (und nicht die eingegebenen Zeichen) versendet werden.
oder muss ich Host: www.xxxx.com<cr><lf> auch senden?
Bei "HTTP/1.1" offiziell ja, bei "HTTP/1.0" nicht -> Hängt vom Server ab.

Und nach dem HTTP-Header müssen zwei aufeinanderfolgende Zeilenumbrüche gesendet werden, damit der Server erkennen kann, daß der Request-Header nun zuende ist.

Edit: Für genauere Infos zum HTTP-Protokoll kannst du dich ja mal durch RFC 1945 quälen ;)
Gut denke es wird HTTP/1.1 sein (kläre ich gleich mal)

(void)sprintf(sci_tx_buffer.data, "GET / HTTP/1.1 \r\n ") Richtig N statt LF ?
(void)sprintf(sci_tx_buffer.data, " www.xxxx.com \r\n ")
(void)sprintf(sci_tx_buffer.data, " keep-alive \r\n ") Richtig N statt LF ?
(void)sprintf(sci_tx_buffer.data, " \r\n ") Richtig N statt LF ?
Fritzler hat geschrieben: Di 22. Aug 2023, 07:22
jodurino hat geschrieben: Di 22. Aug 2023, 04:27 bei mir ist halt das Problem, über die Terminalsoftware kann ich nichts mehr eingeben in dem Moment wo der Connect besteht.
Doch, aber das Modem schickt kein Echo der eingegeben Daten mehr zurück, weil die 1zu1 ins Internet wandern.
Daher siehste nur nix.

Im Terminal rumfummeln bringt hier nix, weil man immers Gleiche eingeben muss und dann gehts doch nich und dann vertippt man sich.
Das frustriert doch nur.
Bau dirn Pythonscript aufm PC, was per RS232 raushustet (pyserial) oder greif einen uC in der Nähe, der willig is.
Da dann Code drauf und immer etwas anpassen.
Na guck mal das mache ich ja schon mit dem µP der spricht schon per RS232 mit dem Modem
Fritzler hat geschrieben: Di 22. Aug 2023, 07:22
HTTP könnwa dir jetz nich von Grund auf Erklären.
Das erwarte ich auch gar nicht, aber guck mal oben so ein Satz von Dir "Doch, aber das Modem schickt kein Echo der eingegeben Daten mehr zurück, weil die 1zu1 ins Internet wandern.
Daher siehste nur nix." ist doch schon Goldwert auch so Dinge wie "Nimm da und da mal "\r\n vom xoexlepox, so was gibt mir sehr viel Hilfe.

Mal davon abgesehen das es wirklich viel Aufwand ist den Inhalt von ungefähr 20 Variablen so zu übertragen.
Also wühlen wir uns da mal weiter durch
Benutzeravatar
Fritzler
Beiträge: 12604
Registriert: So 11. Aug 2013, 19:42
Wohnort: D:/Berlin/Adlershof/Technologiepark
Kontaktdaten:

Re: Daten per Modem zu einem Server senden

Beitrag von Fritzler »

Kleiner Exkurs:
sprintf IST BÖÖSEEEE!
Wenn der String mal durch einen Fehler länger ist als der sollte überschreibt das eiskalt weiter hinter dem Bufferende und kann dort alle möglichen Variablen zerstören.
Das gibt die lustigsten Abstürze, die man nie finden wird.
-> nimm snprintf
Dem kann man die maximale Länge mitgeben.

Ansonsten bin ich kein Freund dieser "spezial" AT Befehle.
Es gibt einen Befehl um sich ins Internet einzuwählen und dann überträgt das modem PPP über den UART.
Da kann man dann einen normalen TCPIP Stack ranhängen und hat direkt Socketzugriff.
Dann ist es der Anwendung später egal obs mal WLAN werden soll oder sonstnochwas.
Benutzeravatar
xoexlepox
Beiträge: 4815
Registriert: So 11. Aug 2013, 19:28
Wohnort: So etwa in der Mitte

Re: Daten per Modem zu einem Server senden

Beitrag von xoexlepox »

(void)sprintf(sci_tx_buffer.data, "GET / HTTP/1.1 \r\n ") Richtig N statt LF ?
(void)sprintf(sci_tx_buffer.data, " www.xxxx.com \r\n ")
(void)sprintf(sci_tx_buffer.data, " keep-alive \r\n ") Richtig N statt LF ?
(void)sprintf(sci_tx_buffer.data, " \r\n ") Richtig N statt LF ?
Das sieht schon besser aus! Nur solltest du noch die Leerzeichen am Anfang und Ende weglassen, denn sonst folgen die beiden Zeilenumbrüche nicht direkt aufeinander. Du kannst auch die ganze letzte Zeile weglassen und dafür in der vorletzten Zeile "\r\n\r\n" schreiben. "\n" bedeutet in einem printf-Formatstring "ein Linefeed (0x0a)" und ein "\r" ist ein 0x0d -> man printf. In einem Terminalprogramm kannst du auch "Ctrl-M" für CR und "Ctrl-J" für LF verwenden, denn was "Return" dort macht ist nicht immer sicher/gleich.
jodurino
Beiträge: 2109
Registriert: So 17. Nov 2013, 20:43

Re: Daten per Modem zu einem Server senden

Beitrag von jodurino »

Fritzler hat geschrieben: Di 22. Aug 2023, 09:44 Kleiner Exkurs:
sprintf IST BÖÖSEEEE!
Wenn der String mal durch einen Fehler länger ist als der sollte überschreibt das eiskalt weiter hinter dem Bufferende und kann dort alle möglichen Variablen zerstören.
Das gibt die lustigsten Abstürze, die man nie finden wird.
-> nimm snprintf
Dem kann man die maximale Länge mitgeben.
wird gemacht, Danke. Bis jetzt sende ich jeden Buffer nach jedem sprintf
Fritzler hat geschrieben: Di 22. Aug 2023, 09:44 ......
Ansonsten bin ich kein Freund dieser "spezial" AT Befehle.
Es gibt einen Befehl um sich ins Internet einzuwählen und dann überträgt das modem PPP über den UART.
Da kann man dann einen normalen TCPIP Stack ranhängen und hat direkt Socketzugriff.
Dann ist es der Anwendung später egal obs mal WLAN werden soll oder sonstnochwas.
Wird nur in dieser Kombination laufen, von RS232 auf das Modem und dann per Funk zum Server
die AT Befehle habe ich aus der Anleitung vom Modem

und siehe man wird sogleich bestraft der Befehl:
(void)sprintf(sci_tx_buffer.data,"at#sd=1,0,nn,"123.123.123.123",0,0,0";

wird vom Compiler mit ERROR C2703: Illegal character in float number quittiert und dabei sind die " " vor und nach der IP markiert, lasse ich diese weg mault das Modem mit ERROR

das muss anders.
andreas6
Beiträge: 4165
Registriert: So 11. Aug 2013, 15:09

Re: Daten per Modem zu einem Server senden

Beitrag von andreas6 »

Klammern sind sensibel, sie treten immer paarweise auf und mögen niemals getrennt werden.

MfG. Andreas
jodurino
Beiträge: 2109
Registriert: So 17. Nov 2013, 20:43

Re: Daten per Modem zu einem Server senden

Beitrag von jodurino »

andreas6 hat geschrieben: Di 22. Aug 2023, 11:40 Klammern sind sensibel, sie treten immer paarweise auf und mögen niemals getrennt werden.

MfG. Andreas
stimmt ist ein insforumdoofkopiertfehler:

(void)sprintf(sci_tx_buffer.data, "at#sd=1,0,nn,"IP Adresse",0,0,0"); //"Diesmal mit ) "

da kommt dann der Fehler mit den ""

Edit sagt:
(void)sprintf(sci_tx_buffer.data, "at#sd=1,0,nn,\"IP Adresse"\,0,0,0");

die zwei \\ wirken beruhigend auf den Compiler
andreas6
Beiträge: 4165
Registriert: So 11. Aug 2013, 15:09

Re: Daten per Modem zu einem Server senden

Beitrag von andreas6 »

Es wäre nützlich, die Syntax des benutzten Befehls und allgemeine Formulierungen der Sprache zu lernen. Und dann eigenständige Blöcke für einzelne Datenfelder zu bilden, zeilenweise, zur Übersicht. Sind die sauber und nachweisbar in Ordnung, kann man das in eine Zeile bringen. Wildes Herumprobieren führt hier mal ausnahmsweise nicht zum Ziel.

MfG. Andreas
jodurino
Beiträge: 2109
Registriert: So 17. Nov 2013, 20:43

Re: Daten per Modem zu einem Server senden

Beitrag von jodurino »

andreas6 hat geschrieben: Mi 23. Aug 2023, 05:55 Es wäre nützlich, die Syntax des benutzten Befehls und allgemeine Formulierungen der Sprache zu lernen. Und dann eigenständige Blöcke für einzelne Datenfelder zu bilden, zeilenweise, zur Übersicht. Sind die sauber und nachweisbar in Ordnung, kann man das in eine Zeile bringen. Wildes Herumprobieren führt hier mal ausnahmsweise nicht zum Ziel.

MfG. Andreas
Verstehe ich jetzt nicht so ganz worauf Du Dich da beziehst.

Habe hier die Kurzanleitung & die Referenzguide der AT Befehle und die Übersicht der C Befehle für den µP da versuch ich schon mich dran zu halten. Aber so ein \ zu übersehen ist doch kein Einzelfall denke ich.
Antworten