LoRaWAN UDP Packet Forwarder 1
17.12.2024
Elektronik | Funk | Software
Der Technik-Blog
Mit dem SIM800 können Daten über HTTP mittels POST/GET an einen Webserver gesendet werden. Dadurch kann mach recht günstig eine selbst gebaute Wetterstation oder andere Sensoren mit dem Internet verbinden, wenn Ethernet, LoRa oder WiFi am Standort nicht verfügbar sind. In diesem Artikel geht es um das absenden einer HTTP-Abfrage mit dem SIM800 über AT-Kommandos. Alle Informationen über die Inbetriebnahme und Verdrahtung vom SIM800 zu Arduino und ESP32 gibt es im Artikel SIM800 Grundlagen.
SIM800 - Grundlagen zu Arduino (Stand Alone) & ESP32+SIM800 Board
SIM800 - Nützliche AT-Befehle
In der Regel startet das Modul automatisch, sobald die entsprechende Stromversorgung hergestellt ist. Das Modul bucht sich automatisch im GSM-Mobilfunknetz ein und kann Anrufe und SMS empfangen. In der Praxis benötigt das Modul etwa 10 Sekunden zum hochgefahren, einbuchen und Herstellen der Betriebsbereitschaft. Erst dann können Anrufe, SMS-Versand oder wie in diesem Fall GPRS Datenübertragungen durchgeführt werden.
Um mit dem SIM800 in das Internet zu kommen, wird GRPS benötigt. GPRS (General Packet Radio Service) ist ein Dienst im GSM-Netz, der eine paketorientierte Datenübertragung ermöglicht. Darüber hinaus werden einige Konfigurationsparameter benötigt, welche mit folgenden Befehlen an das SIM800 übergeben werden:
[AT+SAPBR=3,1,Contype,"GPRS"]
Dieser Befehl setzt im SIM800 den GPRS-Verbindungsparameter.
[AT+SAPBR=3,1,APN,"APN"]
Dieser Befehl schreibt den APN-Parameter in das SIM800. Beim APN (Access Point Name) handelt sich um den Zugangspunkt (Gateway) im Mobilfunknetz. Den APN finden man in der Regel auf der Webseite vom verwendeten Mobilfunknetzbetreiber.
[AT+SAPBR=3,1,USER,"Username"]
Dieser Befehl schreibt den APN Username in das SIM800. Hinweis: Einige Mobilfunknetze bzw. APN erfordern keinen Username. In diesem Fall kann dieser AT-Command gänzlich ausgelassen werden.
[AT+SAPBR=3,1,PWD,"Password"]
Dieser Befehl schreibt das APN Passwort in das SIM800. Hinweis: Einige Mobilfunknetze bzw. APN erfordern kein Passwort. In diesem Fall kann dieser AT-Command gänzlich ausgelassen werden.
Nachdem das SIM800 die Konfigurationsparameter erhalten hat, kann jetzt die eigentliche GPRS Datenverbindung aufgebaut werden. Hinweis: GPRS sollte erst unmittelbar vor dem eigentlichen HTTP-Request geöffnet werden. Nach der Datenübertragung wird die GPRS Verbindung mit [AT+SAPBR=0,1] beendet. Folgender Befehl ist für den Start vom GPRS-Träger notwendig:
[AT+SAPBR=1,1]
Dieser Befehl öffnet den Träger mit den zuvor definierten Parametern. Man kann dies als den Startbefehl für GPRS sehen.
[AT+SAPBR=2,1]
Dieser Befehl fragt den Status vom zuvor geöffneten GPRS Träger ab und dient lediglich zur Diagnose.
[AT+SAPBR=0,1]
Dieser Befehl beendet den GRPS-Träger und wird erst nach Ende der Datenübertragung ausgeführt.
Nachdem das SIM800 erfolgreich eine GPRS-Verbindung aufgebaut hat, kann ein HTTP-Request gestartet werden. Auch dafür müssen wieder einige Parameter über entsprechende AT-Kommandos an das SIM800 gesendet werden.
[AT+HTTPINIT]
Dieser Befehl initialisiert das HTTP-Service. Dem SIM800 wird somit mitgeteilt, dass ein HTTP-Request gestartet wird.
[AT+HTTPPARA=CID,"1"]
Dieser Befehl definiert das Trägerprofil. In der Regel ist dies immer 1.
[AT+HTTPPARA=URL,"URL"]
Mit diesem Befehl wird die aufzurufende URL übermittelt. Es handelt sich dabei um das gleiche Format, wie es im Webbrowser eingegeben wird. Sollte der Server nicht auf den Port 80 laufen, so wird einfach am Ende der URL oder IP der entsprechende Port angefügt. Beispiele: http://www.aeq-web.com oder http://123.123.123.123 oder http://url.com:8080
[AT+HTTPPARA=CONTENT,application/x-www-form-urlencoded]
Dieser Befehl definiert den Content Type vom aktuellen Request. Der Content Type ist hier nur für den Webserver relevant. Hier wird mitgeteilt, welcher Medientyp im Request an den Server gesendet wird.
[AT+HTTPDATA=192,10000]
Dieser Befehl definiert die zu übertragende Größe der Nutzdaten in Bytes. Hier gilt: Besser etwas mehr als zu wenig, aber auch nicht zu viel. Der Wert 192 Bytes reicht in der Regel aus, um ein paar Parameter (z.B. Messwerte einer Wetterstation) zu übertragen. Die zweite Zahl gibt an, in welcher Zeit (Millisekunden) die Daten kommen müssen, bevor das SIM800 den Request abbricht. Dies hängt von vielen Faktoren (Verbindung, Server, Datenmenge...) ab und kann ein Wert zwischen einer und 120 Sekunden sein. Auch hier sind 10 Sekunden (10000 ms) ein großzügiger Wert.
[Postname=WERT] (Nutzdaten)
Sobald der vorherige Befehl gesendet wurde, wartet das SIM800 auf die Nutzdaten. Dabei können jetzt die POST-Parameter innerhalb des zuvor definierten Zeitfensters an das SIM800 übergeben werden.
[AT+HTTPACTION=1]
Mit HTTPACTION wird die Übertragungsmethode definiert. Dabei gilt: 0=GET, 1=POST, 2=HEAD. Als Antwort kommt dabei u. a. der Statuscode vom Server sowie die Datenlänge zurück.
[AT+HTTPREAD]
Dieser Befehl gibt die empfangene Datenlänge sowie den empfangenen Datensatz (Serverausgabe) aus. Über diesen Befehl werden auch die Nutzdaten empfangen, was vom Mikrocontroller für eine weitere Steuerung ausgewertet werden kann.
[AT+HTTPTERM]
Dieser Befehl beendet den laufenden HTTP-Request.
Der Beispielcode für das ESP32 SIM800 Board beinhaltet die zuvor erwähnten AT-Kommandos und übergibt diese in der richtigen Reihenfolge. Zuerst müssen im Code grundlegende Parameter (APN...) und Pins für den erfolgreichen Betrieb richtig definiert sein. Die Pins im Beispielcode sind bereits an das Board angepasst. Alle Information dazu gibt es im Artikel SIM800 Grundlagen. Anschließend wird die Stromversorgung zum SIM800 geschaltet und die serielle Verbindung aktiviert. Die Software wartet anschließend rund 10 Sekunden, bis sich das SIM800 mit dem Mobilfunknetz verbunden hat und betriebsbereit ist. Anschließend wird die Funktion "gsm_config_gprs" aufgerufen. Dabei werden alle wichtigen Parameter (Verbindungstyp, APN, Username, Passwort) an das SIM800 übergeben. Wichtig: Wird das SIM800 abgeschaltet, müssen diese Parameter beim nächsten Start den SIM800 erneut mitgeteilt werden. Anschließend wird die Funktion "gsm_http_post" mit den entsprechenden zu übertragenden Post-Parametern aufgerufen. Hierbei wird zuerst der GRPS-Träger aktiviert und anschließend die HTTP-Funktion aufgerufen. Ist die Datenübertragung abgeschlossen, so wird der GPRS-Träger wieder getrennt und der Mikrocontroller wartet, bis diese Funktion erneut aufgerufen wird. Die Funktion "gsm_send_serial" übernimmt die bidirektionale Kommunikation mit dem SIM800. Über eine Schleife wartet der Mikrocontroller etwa 3 Sekunden auf Antworten vom SIM800. Sollte das Modul mit einer Antwort länger brauchen, wartet die Funktion, bis die Daten angekommen sind. Die Ausgabe erfolgt anschließend im Serial Monitor, was sich gut für Diagnosezwecke eignet. Sollte es dennoch zu Problemen kommen, kann die Wartezeit auf Antworten erhöht werden.
/* More information at: https://www.aeq-web.com/ * ESP32 SIM800 HTTP POST TEST | V 1.0_2020-AUG-18 */ #define SIM800L_RX 27 #define SIM800L_TX 26 #define SIM800L_PWRKEY 4 #define SIM800L_RST 5 #define SIM800L_POWER 23 String apn = "APN"; //APN String apn_u = ""; //APN-Username String apn_p = ""; //APN-Password String url = "http://testserver.aeq-web.com/sim800_test/sim800.php"; //URL of Server void setup() { pinMode(SIM800L_POWER, OUTPUT); digitalWrite(SIM800L_POWER, HIGH); Serial.begin(115200); Serial.println("ESP32+SIM800L AT CMD Test"); Serial2.begin(9600, SERIAL_8N1, SIM800L_TX, SIM800L_RX); delay(15000); while (Serial2.available()) { Serial.write(Serial2.read()); } delay(2000); gsm_config_gprs(); } void loop() { gsm_http_post("param=TestFromMySim800"); delay(30000); } void gsm_http_post( String postdata) { Serial.println(" --- Start GPRS & HTTP --- "); gsm_send_serial("AT+SAPBR=1,1"); gsm_send_serial("AT+SAPBR=2,1"); gsm_send_serial("AT+HTTPINIT"); gsm_send_serial("AT+HTTPPARA=CID,1"); gsm_send_serial("AT+HTTPPARA=URL," + url); gsm_send_serial("AT+HTTPPARA=CONTENT,application/x-www-form-urlencoded"); gsm_send_serial("AT+HTTPDATA=192,5000"); gsm_send_serial(postdata); gsm_send_serial("AT+HTTPACTION=1"); gsm_send_serial("AT+HTTPREAD"); gsm_send_serial("AT+HTTPTERM"); gsm_send_serial("AT+SAPBR=0,1"); } void gsm_config_gprs() { Serial.println(" --- CONFIG GPRS --- "); gsm_send_serial("AT+SAPBR=3,1,Contype,GPRS"); gsm_send_serial("AT+SAPBR=3,1,APN," + apn); if (apn_u != "") { gsm_send_serial("AT+SAPBR=3,1,USER," + apn_u); } if (apn_p != "") { gsm_send_serial("AT+SAPBR=3,1,PWD," + apn_p); } } void gsm_send_serial(String command) { Serial.println("Send ->: " + command); Serial2.println(command); long wtimer = millis(); while (wtimer + 3000 > millis()) { while (Serial2.available()) { Serial.write(Serial2.read()); } } Serial.println(); }
Das folgende Bild zeigt die Ausgabe im Serial Monitor während einer HTTP-Post Abfrage:
Im Gegensatz zum oberen Beispielcode verwendet dieser für die Kommunikation Software-Serial, weil das Hardware-Serial hier einige Nachteile mit sich bringt. Nähere Infos dazu siehe: SIM800 Grundlagen. Die Befehle und der Programmablauf sind mit dem oberen Beispiel nahezu identisch.
//More information at: https://www.aeq-web.com/ #include <SoftwareSerial.h> String apn = "APN"; //APN String apn_u = ""; //APN-Username String apn_p = ""; //APN-Password String url = "http://testserver.aeq-web.com/sim800_test/sim800.php"; //URL of Server SoftwareSerial SWserial(8, 9); // RX, TX void setup() { Serial.begin(115200); Serial.println("SIM800 AT CMD Test"); SWserial.begin(9600); delay(15000); while (SWserial.available()) { Serial.write(SWserial.read()); } delay(2000); gsm_config_gprs(); } void loop() { gsm_http_post("param=TestFromMySim800"); delay(30000); } void gsm_http_post( String postdata) { Serial.println(" --- Start GPRS & HTTP --- "); gsm_send_serial("AT+SAPBR=1,1"); gsm_send_serial("AT+SAPBR=2,1"); gsm_send_serial("AT+HTTPINIT"); gsm_send_serial("AT+HTTPPARA=CID,1"); gsm_send_serial("AT+HTTPPARA=URL," + url); gsm_send_serial("AT+HTTPPARA=CONTENT,application/x-www-form-urlencoded"); gsm_send_serial("AT+HTTPDATA=192,5000"); gsm_send_serial(postdata); gsm_send_serial("AT+HTTPACTION=1"); gsm_send_serial("AT+HTTPREAD"); gsm_send_serial("AT+HTTPTERM"); gsm_send_serial("AT+SAPBR=0,1"); } void gsm_config_gprs() { Serial.println(" --- CONFIG GPRS --- "); gsm_send_serial("AT+SAPBR=3,1,Contype,GPRS"); gsm_send_serial("AT+SAPBR=3,1,APN," + apn); if (apn_u != "") { gsm_send_serial("AT+SAPBR=3,1,USER," + apn_u); } if (apn_p != "") { gsm_send_serial("AT+SAPBR=3,1,PWD," + apn_p); } } void gsm_send_serial(String command) { Serial.println("Send ->: " + command); SWserial.println(command); long wtimer = millis(); while (wtimer + 3000 > millis()) { while (SWserial.available()) { Serial.write(SWserial.read()); } } Serial.println(); }
Für den produktiven Betrieb ist ein eigener Webserver/Webspace notwendig. Am AEQ-WEB Testserver gibt es ein kleines Testprogramm, wo die POST und GET Funktion vom SIM800 getestet werden kann. Dabei kann ein Request mit dem POST/GET Namen "param" an den Server gesendet werden. Das Ergebnis kann anschließend in einer Tabelle überprüft werden. Achtung: Der übertragene Parameter darf keine Sonderzeichen sowie Leerzeichen enthalten und nicht länger als 20 Zeichen sein. Ab 10 Übertragungen von der gleichen IP-Adresse sperrt der Server diese Adresse für eine Stunde. Zu jeder vollen Stunde werden alle empfangenen Datensätze automatisch gelöscht. Hinweis: Der Testserver dient als reines Diagnose-Testtool. Eine dauerhafte Verfügbarkeit ist nicht garantiert. Ebenso erklärt sich der Nutzer mit der Speicherung von Browser-Header und IP-Adresse einverstanden.
Der Testserver kann über folgende URL erreicht werden: http://testserver.aeq-web.com/sim800_test/
Das SIM800 unterstützt SSL und kann somit auch über HTTPS mit einem Webserver kommunizieren. Folgende Voraussetzungen sind dafür notwendig:
Sind die oben angeführten Anforderungen erfüllt, so kann mit dem SIM800 ein HTTPS Request mit POST oder GET Parametern durchgeführt werden. Um einen Request mit HTTPS zu starten, muss die URL entsprechend mit "https://" beginnen. Über den Befehl [AT+HTTPSSL=1] wird SSL im SIM800 aktiviert. Dieser Befehl muss im Bereich zwischen [AT+HTTPINIT] und noch vor [AT+HTTPACTION], also vor dem eigentlichen Request-Start übermittelt werden. SSL Verbindungen auf Server mit ungültigen oder selbst signierten Zertifikaten können ebenfalls durchgeführt werden. Über den Befehl [AT+SSLOPT=0,1] wird die Überprüfung von SSL-Zertifikaten deaktiviert.
In diesem Artikel geht es um den Bau von einem LoRa Gateway, was die empfangenen Daten von einem IoT Gerät an einen Webserver mit HTTPS POST weiterleiten kann
WeiterlesenIn diesem Beitrag zeigen wir, wie das Baofeng UV5-R mit einem USB-Kabel und der Software Chirp programmiert wird.
WeiterlesenAEQ-WEB © 2015-2024 All Right Reserved