Rückgabe von http.getString()

Hallo zusammen,

ich versuche mit Hilfe eines WeMos D1 Mini Pro einen Repetier-Server (Druckserver für 3D-Drucker) über sein API anzusprechen. Die Datenübermittlung funktioniert und der Server reagiert auch auf die Anfragen, nur bekomme ich die Rückgabe nicht zum laufen.

der Aufruf der Seite geschieht im Browser über

http://192.168.8.22:3344/printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c60&a=jobInfo&data={""}

die Rückgabe im Browser wäre dann z.B:
[{“active”:true,“job”:“none”,“name”:“Ultimaker_2+”,“online”:1,“pauseState”:0,“paused”:false,“slug”:“Ultimaker_2”}]

Im Browser funktioniert es wunderbar. Die W-Lan Verbindung des WeMos funktioniert und wenn ich im Ausführung-Commandos schicke welche keine Rückmeldung haben, läuft es auch. Also scheint die Kommunikation nicht das Problem zu sein.

Die Verkürzte Version meines Quellendes sieht wie folgt aus:

const String listPrinter  = "&a=listPrinter";

#include <ESP8266HTTPClient.h>
#include <WiFiManager.h>

String API = "637d4996-c02b-4d3e-8d78-9feb18978c60";
String ipAdressRepetierServer = "192.168.8.22";
String portRepetierServer = "3344";

void setup() {
  Serial.begin(115200);

  // W-Lan aktiviren
  init_WLAN();
}

void loop() {
  sendDataToServer2();
  delay(500000);
}

void sendDataToServer2() {
  HTTPClient http;
  String dummyURL = "http://" + ipAdressRepetierServer + ":" + portRepetierServer + "/printer/api/Ultimaker_2?apikey=" + API + listPrinter;
  Serial.println(dummyURL);
  http.begin(dummyURL);

  // Send HTTP GET request
  int httpResponseCode = http.GET();

  if (httpResponseCode > 0) {
    Serial.print("HTTP Response code (2): ");
    Serial.println(httpResponseCode);
    String payload = http.getString();
    Serial.println(payload);
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
  // Free resources
  http.end();
}

void init_WLAN() {
  WiFi.mode(WIFI_STA); // explicitly set mode, esp defaults to STA+AP

  // add a custom input field
  int customFieldLength = 40;

  const char* custom_radio_str = "
<label for='customfieldid'>Custom Field Label</label><input type='radio' name='customfieldid' value='1' checked> One
<input type='radio' name='customfieldid' value='2'> Two
<input type='radio' name='customfieldid' value='3'> Three";
  new (&custom_field) WiFiManagerParameter(custom_radio_str); // custom html input

  wm.addParameter(&custom_field);
  wm.setSaveParamsCallback(saveParamCallback);

  std::vector<const char *> menu = {"wifi", "info", "param", "sep", "restart", "exit"};
  wm.setMenu(menu);

  // set dark theme
  wm.setClass("invert");

  wm.setConfigPortalTimeout(30); // auto close configportal after n seconds
  drawConfigScreen();
  connection = wm.autoConnect("AutoConnectAP", "password"); // password protected ap

  if (!connection) {
    Serial.println("Failed to connect or hit timeout");
    ESP.restart();
  }
  else {
    //if you get here you have connected to the WiFi
    Serial.println("connected...yeey :)");
    wlanConnectScreen();
  }
}

Im Log erhalte ich dann:

23:09:15.245 → http://192.168.8.22:3344/printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter
23:09:15.280 → HTTP Response code (2): 200
23:09:15.280 →

Auch wenn ich die länge der Antwort auslese kommt 0 raus.
Der Code soll nachdem was ich gefunden habe ja heissen, dasss die übergäbe geklappt hat.

Jemand eine Idee, was ich falsch mache?

Grüße

Steve

Hi,

Der Code ist der aus dem Beispiel httpclient auch hier das gleiche Problem. Hatte ich schon gemacht leider

Hallo noiasca,

Ergebnis ist das gleich:

10:59:37.875 -> [SETUP] WAIT 3...
10:59:38.884 -> [SETUP] WAIT 2...
10:59:39.886 -> [SETUP] WAIT 1...
10:59:40.877 -> [HTTP] begin...
10:59:40.877 -> [HTTP] GET...
10:59:40.910 -> [HTTP] GET... code: 200
10:59:40.910 ->

Das ist das Ergebnis mit dem Original Sketch

Mir kommt gerade ein ganz anderer Gedanke.
Das hier ist die Doku zu der API

API Doku

Ich bin bisher davon ausgegangen, das ich im "json" nur senden muß. Kann es sein, dass ich es aber auch zurück bekomme? Dann müsste ich das anderes abfangen oder? im Browser macht das das Programm ja automatisch denke ich.

?Wie meinen?

du stellst einen GET request und solltest eine Antwort in JSON erhalten.

Wo in der Doku ist das API
api/Ultimaker_2
beschrieben?

du hast im Sketch von deinem Eingangsposteinen einen anderen apikey gesendet als unterhalb in dem Seriell Output rausgeschrieben. ...c60 vs. c49

eigenartig.

unbeantwortet:

Welchen ESP Core verwendest du?

Ultimaker_2 ist der Name des Druckers in der Doku genannt

den Standard der mit der IDE installiert werden kann ESP8266 (glaube ich) wo kann ich das nachschauen?

Da kannst Du 7 verschiedene Versionen installieren.
Nachschauen im Boardverwalter.

Gruß Tommy

im Boardmanager siehst du das,
über den ESP8266 - Beispielen bei einer halbwegs aktuellen IDE,
und in den Compiler Meldungen eigentlich auch.

esp8266 Version 2.7.4 ist installiert zeigt er mir an

Sorry hatte das mit dem API Key überlesen. Hatte ich zwischendurch mal geändert, weil ich gedacht hatte ob es daran liegt. (Eigentlich quatsch weil es ja mit diesem über den Browser geht) aber auch daran lag es nicht

Dann installiere Dir mal einen Netzwerksniffer (z.B. Wireshark) und schau Dir mal an, was beim funktionierenden Aufruf aus dem Browser zurück kommt.

Gruß Tommy

Lies die Antwort des Servers zeilenweise ein! Erste Zeile ist ein Header, der ggf leer ist. Dann folgt die (ggf json-codierte) Antwort dessen, was du vom Browser schon kennst.

ok,

und wie kann ich das machen? alles was ich gefunden habe, ist nur der http.getstring() wie kann ich das den sonst einlesen?

Liest Du auch das, was wir schreiben?

Gruß Tommy

Verstehe gerade nicht was du meinst? Wireshark liest doch die Daten über die Schnittstelle die zurück kommen, aber darum geht es doch beim post von plavnik nicht sondern beim Empfang der Daten alles einzeln auszulesen, oder habe ich das falsch verstanden?

Wenn ja dann sorry.

Gruß Steve

Es geht bei Wireshark erst mal darum, zu erfahren, was bei der funktionierenden Anfrage iom Browser zurück kommt.
Das kann dann die Basis für weitere Recherchen sein.

Gruß Tommy

Werde es mal probieren, aber aktuell erschlägt der mich noch mit Paketen. Im Prinzip soll ich die Anfrage über meinen Browser starten, und dann schauen was der Server antwortet richtig?

Grüße

Steve

Ja. Du kannst in Wireshark filtern, dass Du nur HTTP(s) Pakete sehen willst und auch nur von einer bestimmten Verbindung.

Gruß Tommy

So habe es zwar immer noch nicht ganz verstanden, aber bin glaube ich auf gutem weg, Wireshark dazu zu bekommen, dass zu machen, was ich möchte.

Habe außerdem mal den Debug Level erhöht und dort bei der Ausgabe was interessantes gefunden:

[HTTP-Client][end] still data in buffer (114)

[HTTP] begin...
17:43:23.500 -> [HTTP-Client][begin] url: http://192.168.8.22:3344/printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter
17:43:23.500 -> [HTTP-Client][begin] host: 192.168.8.22 port: 3344 url: /printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter
17:43:23.500 -> [HTTP] GET...
17:43:23.500 -> [HTTP-Client][sendRequest] type: 'GET' redirCount: 0
17:43:23.673 -> [HTTP-Client] connected to 192.168.8.22:3344
17:43:23.673 -> [HTTP-Client] sending request header
17:43:23.673 -> -----
17:43:23.673 -> GET /printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter HTTP/1.1
17:43:23.673 -> Host: 192.168.8.22:3344
17:43:23.673 -> User-Agent: ESP8266HTTPClient
17:43:23.673 -> Accept-Encoding: identity;q=1,chunked;q=0.1,*;q=0
17:43:23.707 -> Connection: keep-alive
17:43:23.707 -> Content-Length: 0
17:43:23.707 -> 
17:43:23.707 -> -----
17:43:23.707 -> [HTTP-Client][handleHeaderResponse] RX: 'HTTP/1.1 200 OK
'
17:43:23.707 -> [HTTP-Client][handleHeaderResponse] RX: 'Date: Tue, 08 Dec 2020 16:43:23 GMT
'
17:43:23.707 -> [HTTP-Client][handleHeaderResponse] RX: 'Connection: Close
'
17:43:23.707 -> [HTTP-Client][handleHeaderResponse] RX: 'Server: 0.94
'
17:43:23.707 -> [HTTP-Client][handleHeaderResponse] RX: 'Access-Control-Allow-Origin: *
'
17:43:23.744 -> [HTTP-Client][handleHeaderResponse] RX: 'Content-Type: text/html; charset=utf-8
'
17:43:23.744 -> [HTTP-Client][handleHeaderResponse] RX: 'Cache-Control: public, max-age=0
'
17:43:23.744 -> [HTTP-Client][handleHeaderResponse] RX: '
'
17:43:23.744 -> [HTTP-Client][handleHeaderResponse] code: 200
17:43:23.744 -> Opening URL: http://192.168.8.22:3344/printer/api/Ultimaker_2?apikey=637d4996-c02b-4d3e-8d78-9feb18978c49&a=listPrinter
17:43:23.744 -> [HTTP] GET... code: 200
17:43:23.744 -> [HTTP-Client][end] still data in buffer (114), clean up.
17:43:23.777 -> [HTTP-Client][end] tcp keep open for reuse
17:43:23.777 -> 0
17:43:23.777 -> [HTTP-Client][end] tcp is closed
17:43:26.168 -> pm open,type:2 0

Folgende Zeile ist mir hierbei aufgefallen:
[HTTP-Client][end] still data in buffer (114)

Kann es sein, dass nur die Ausgabe nicht richtig funktioniert. Das würde ja dafür sprechen, was Plavnik meinte, dass noch Daten irgendwo vorhanden sind? Oder?

[{"active":true,"job":"none","name":"Ultimaker_2+","online":1,"pauseState":0,"paused":false,"slug":"Ultimaker_2"}]

Das sind die 114 Bytes die ich such, er liest es also schreibt es aber nicht....