Forum: Mikrocontroller und Digitale Elektronik SIM5360 HTTP- bearer einfügen


von quadrit (Gast)


Lesenswert?

Hallo schönen guten Tag :D


Hier schonmal eine Zusammenfassung:
*Arduino UNO
*SIM5360
*Über Schnittstelle verbunden
*Ziel: PostRequest mit Bearer Token..
*Wenn Bearer zu lang: Problem beim Senden -> RAM
*Gibt es wie bei SIM800  AT+HTTPPARA=USERDATA,Authorization ?
* Oder muss Header + Body in einen String für CHTTPSSEND ?

Links zu den verwendeten Bibliotheken und zum Code:
-------
Code:
https://github.com/stanleyhuangyc/Freematics/tree/master/firmware_v4/sim5360test
Bibliotheken
https://github.com/stanleyhuangyc/Freematics/tree/master/libraries/FreematicsONE
-----
Grundlage: Arduino UNO ( Atmega328 )-Board in Verbindung mit einer 
Erweiterungsmöglichkeit für ein SIM5360-Modul.
Das SIM5360-Modul ist über einen kleinen Umweg Ansprechbar.
AT- Kommandos werden an die Schnittstelle geschickt und dann automatisch 
ich denke über SPI an das SIM5360-Modul geschickt.
AT Befehle so beliebig ausgeführt werden.

Ich kann zum Beispiel , mit Hilfe des Herstellermusters in 
HTTP-POST-Request duchführen. hat bereits funktioniert.

Nun muss ich jedoch irgendwie in den Header meinen Token einfügen:
1
p += sprintf(p, "%s %s HTTP/1.1\r\nUser-Agent: Test\r\nHost: %s\r\nContent-Type: %s\r\nConnection: %s\r\nAuthorization: Bearer %s\r\n ",
2
                   method == HTTP_GET ? "GET" : "POST", path, HTTP_SERVER_URL,"application/json", keepAlive ? "keep-alive" : "close",token);

Allerdings gibt es dann ein Problem beim Senden. Es wird nur noch eine 
Meldung angezeigt, dass er sendet, aber er hört quasi nie auf xD
Wenn ich die Länge meines Bearers verringere funktioniert das senden.

Es hängt also möglicherweise vom RAM des Atmega-328  ab.

Wäre wichtig zu wissen ob man einen anderen Weg gehen kann, um das 
Authorization-Feld , also den Bearer hinzuzufügen.

Ich weiß zum Beispiel, dass beim SIM800 folgendes funktioniert hat :
(Dort wurde aber auch ein ESP32 verwendet)
1
SerialAT.println("AT+HTTPPARA=USERDATA,Authorization:"+token);  /* Sets: "Authorization:<token>" --Set Header parameters for HTTP session */

Weiß jemand ob es für das Hinzufügen des Bearers auch beim SIM5360 ein 
AT Kommando gibt ? Vllt. geht sogar das gleiche... das werde ich jetzt 
testen.
Evtl. auch einfach Schrittweise.

Also was der Hersteller dort im Moment macht ist :
1
// ############### SEND HTTP REQUEST 
2
      sprintf(buffer, "AT+CHTTPSSEND=%u\r", headerSize + payloadSize);

Wie man sieht ist alles im "buffer" gespeichert..
Es wird also nicht unterschieden zwischen Header und Inhalt...

Ich konnte bis jetzt noch keinen Befehl finden um das Schritt für 
Schritt hinzuzufügen.

Danke falls sich jemand damit auskennt !

von Εrnst B. (ernst)


Lesenswert?

quadrit schrieb:
> Es hängt also möglicherweise vom RAM des Atmega-328

Gibt es einen Grund, warum du dir erst alles im RAM zusammenstöpselst, 
um es dann über den UART rauszusenden?

Statt speicherintensiven String-Additionen und sprintfs, einfach der 
Reihe nach raussenden, ohne Zwischenspeicher:
1
// sprintf(p,"%s %s HTTP/1.1\r\nUser-Agent: Test\r\nHost: %s\r\nContent-Type: %s\r\nConnection: %s\r\nAuthorization: Bearer %s\r\n ",..
2
wird zu
3
4
if (...) Serial.print("GET") else Serial.print("POST");
5
Serial.print(' ');
6
Serial.print(path);
7
Serial.println(" HTTP/1.1"); // <<- Kontrollieren, ob das"\n" oder "\r\n" anhängt
8
Serial.println("User-Agent: Test");
9
Serial.println("Host: " HTTP_SERVER_URL); // wenn das eine #define-Konstante ist.
10
Serial.println("Content-Type: application/json");
11
usw.usf.

Edit: hab jetzt sim5360test.ino angeschaut: Da ist das leider nicht so 
einfach umzusetzen... Quickfix: "char buffer[384];" vergrößern, bis es 
klappt, und noch kein OOM-Fehler passiert.

von quadrit (Gast)


Lesenswert?

Ich versuche es gerade auch erstmal nacheinander zu schicken...
Vielleicht geht das ja bereits :D
Also danke noch mal für deine Antwort. Habe ähnliche Gedanken :D

von quadrit (Gast)


Lesenswert?

Εrnst B. schrieb:
> Quickfix: "char buffer[384];" vergrößern, bis es
> klappt, und noch kein OOM-Fehler passiert.

An dem habe ich auch schon rumgespielt ging bis etwa 500.
Ich muss dazu allerdings wirklich verstehen was dort gespeichert wird.
Also der gesamte Header zum Beispiel.
Werde das noch genauer betrachten

von quadrit (Gast)


Lesenswert?

Also ich könnte die ganzen Klassen versuchen zu umgehen und das ganze so 
nah wie möglich am SIM5360 programmieren..
Falls das jetzt nicht klappt

von quadrit (Gast)


Lesenswert?

aber noch mal ganz klar die Frage: weiß jemand ob man den bearer beim 
SIM5360 durch einen AT Befehl hinzufügen kann nach dem Stil:
1
SerialAT.println("AT+HTTPPARA=USERDATA,Authorization:"+token);
Denn ich nehme an, dass an dieser Stelle weniger RAM benötigt wird, das 
dort nur der token zwischengespeichert wird.

Man kann den befehl HTTPPARA jedoch nicht in der Anleitung finden.
Wäre die Frage ob man nach und nach den Header mit Intionen füttern 
kann, um ihn dann komplett abzuschicken.
Denn alles auf einmal zu schicken verursucht, wie beschrieben eine zu 
hohe RAM Auslastung- zu viel Zwischenspeicher wird benötigt.

:D

von quadrit (Gast)


Lesenswert?

Also einmal konnte ich es aufsplitten, wobei ich auf meinem Testserver , 
die korrekte Nachricht erhalten habe :D

1
xbWrite("POST / HTTP/1.1\r\nUser-Agent: ONE\r\nHost: enwg22tfx32ud.x.pipedream.net\r\nConnection:");
2
 xbWrite("keep-alive\r\nContent-length: 4\r\nAuthorization: test\r\n\r\n\r");

Jetzt geht es weiter.
Erst mal testen ob ich NUR den Token ( Bearer ) alleine mit einem 
xbWrite schicken kann.  Dann ob ich einen sehr langen 400 byte etwa 
großen bearer alleine schicken kann.

(xbWrite ist zwischen atmega 328 und dem SIM5360 Modul. Man muss über 
dieses , ich denke per SPI , kommunizieren.)

von quadrit (Gast)


Lesenswert?

Es funktioniert mit einer aufsplittung von 2 xbWrite..
Der ganze bearer mit 349 Zeichen passt rein ...
habe noch ein Status-Strings gekürzt... da zählt jetzt jedes Byte xD
1
Der Sketch verwendet 11774 Bytes (36%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.Globale Variablen verwenden 1886 Bytes (92%) des dynamischen Speichers, 162 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
2
Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten.

von quadrit (Gast)


Lesenswert?

Hat noch jemand Erfahrung damit ?

von quadrit (Gast)


Lesenswert?

Ich schaue mir gerade die Umsetzung von diesem Kollegen hier in GitHub 
an:
Dort macht er nämlich auch POST, PUT und GET Requests:

https://github.com/ioxhop/IOXhop_SIM5360/blob/master/SIM5360_HTTP.cpp

von quadrit (Gast)


Lesenswert?

Hier nochmal das was für mich geklappt hat !

habe es auf Grund von zu wenig RAM aus der Funktion genHTTPHeader geholt 
und klar aufgeschrieben.. Bevor man das zweite xbWrite macht, was den 
"payload" des HTTP Post beinhaltet könnte man den JSON neu 
zusammenstellen lassen.  Allerdings muss in diesem Fall auf die knappen 
RAM-Ressourcen geachtet werden.
1
headersize=countHeaderSize();
2
payloadSize=countpayloadSize();
3
xbWrite(AT+CHTTPSSEND=%u\r", headerSize + payloadSize);
4
xbWrite("POST /apiitest/t HTTP/1.1\r\nHost: targetURL\r\nContent-Type: application/json\r\nAuthorization: Bearer xs3f34f34IH"§()H()"H()!"HD!"H(DH!"()DH\r\nContent-Length: 178\r\n\r\n\r\n");
5
xbWrite("{\r\n\"Number\": \"3\",\r\n\"alNumber\": \"23\",\r\n\"e\": \"3\",\r\n\"u\": \"2\",\r\n\"Date\": \"26022020\",\r\n\"Stamp\": \"10:02:20\"\n}\n");

Damit habe ich das Thema erstmal für mich gut genug behandelt.
Es sei denn ich finde noch eine Lösung um deutlich weniger RAM zu 
verbrauchen...
:D
------

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.