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:
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 :
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 !
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:
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.
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
Ε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
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
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.)
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
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.
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
------