ESP8266 HTTPS PUT Request mit Bearer Authentifizierung

Versuche jetzt schon seit zwei Tagen mein Mozilla WebThings Gateway mit meinen ESP anzusprechen, doch habe bis jetzt noch keinen Erfolg gehabt.

Ich hoffe, mir kann hier jemand mit einem passenden Beispiel helfen.

Danke

Klar helfen wir dir.
Wenn du uns mal ein paar genauere Informationen lieferst.

Und deinen Thread musst du nicht doppelt posten, wir sehen das auch so.

Hey,

sorry wegen dem Doppelpost.

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>

#ifndef STASSID
#define STASSID "xxxx"
#define STAPSK  "xxxx"
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

const char* host = "api.github.com";
const int httpsPort = 443;

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
const char fingerprint[] PROGMEM = "59:74:61:88:13:CA:12:34:15:4D:11:0A:C1:7F:E6:67:07:69:42:F5";

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  // Use WiFiClientSecure class to create TLS connection
  WiFiClientSecure client;
  Serial.print("connecting to ");
  Serial.println(host);

  Serial.printf("Using fingerprint '%s'\n", fingerprint);
  client.setFingerprint(fingerprint);

  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }

  String url = "/repos/esp8266/Arduino/commits/master/status";
  Serial.print("requesting URL: ");
  Serial.println(url);

  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "User-Agent: BuildFailureDetectorESP8266\r\n" +
               "Connection: close\r\n\r\n");

  Serial.println("request sent");
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  String line = client.readStringUntil('\n');
  if (line.startsWith("{\"state\":\"success\"")) {
    Serial.println("esp8266/Arduino CI successfull!");
  } else {
    Serial.println("esp8266/Arduino CI has failed");
  }
  Serial.println("reply was:");
  Serial.println("==========");
  Serial.println(line);
  Serial.println("==========");
  Serial.println("closing connection");
}

void loop() {
}

Diesen Beispielcode habe ich gefunden, doch das Problem ist, dass hier noch irgendwie die Request Header hinzugefpgt werden müssen, bzw. der Payload. Wie mache ich das?

Das ist aber kein PUT, sondern ein GET.
Den Payload setzt Du hinter die URL(also alles ab ?):

https://host/pfad?wert1=123& wert2=Paul

Gruß Tommy

Ja, da hast du recht, hatte ich aus Testzwecken abgeändert und vergessen wieder zu tauschen. :wink: Wie schaut das dann aber mit den Request Headern aus? Kann ich die auch irgendwie der URL beifügen?

Danke aber schonmal.

Hier ist PUT für HTTP beschrieben. Das musst Du dann auf Deine HTTPS-Verbindung ummünzen.

Bist Du sicher, dass Du PUT und nicht POST meinst?

Gruß Tommy

Jap Put ist schon richtig :slight_smile:

Das Tutorial, was du verlinkt hast, hatte ich auch schon gefunden, aber so einfach ist das nicht mit dem umschreiben auf HTTPS, da in dem Beispiel die HTTPClient Bibliothek genutzt wird und mir wäre kein HTTPSClient Bibliothek bekannt. Und einfach https:// vor anstatt http:// vor die URL zu setzen führt zu Fehlern.

Was willst Du denn mit PUT übertragen? Hier ist es inhaltlich beschrieben.

  1. Zeile ist das Ziel
    Die Leerzeile ist wichtig.

Gruß Tommy

Ich möchte die Eigenschaften meiner Smarthome Geräte in Mozilla WebThings ändern.
Mit Javascript ist das schon gelungen, das schaut dann ungefähr so aus:

var xhr = new XMLHttpRequest();

xhr.addEventListener('load', function() {
  console.log(this.responseText);
});
		
xhr.open('PUT', 'https://xxxxx.mozilla-iot.org/things/virtual-things-custom-bf5ec3d4-d87d-4df9-bb89-d4a09fa057c6/properties/temperature'); //Virtueller Temperatursensor

xhr.setRequestHeader('Content-Type', 'application/json');
xhr.setRequestHeader('Authorization', 'Bearer <Bearer Token>');		
			
xhr.send(JSON.stringify({"temperature": 40})); // Absenden des Request mit Payload

Und so wie im oberen Beispiel möchte ich das auch mit dem ESP8266 hinbekommen :slight_smile: