Go Down

Topic: $_POST() von ESP8266 zum php server (Read 402 times) previous topic - next topic

Emma-Marie

Nov 24, 2019, 09:15 pm Last Edit: Nov 24, 2019, 09:19 pm by Emma-Marie
Hallo zusammmen! Ich progrmmiere nur gelegentlich und für gewöhnlich find ich auch alles. Dieses mal steh ich aber echt auf der Leitung!

Ich hab ein ESP8266 Modul mit Sensor für Temp und Luftdruck. Diese Werte sollen an eine Serverseitige PHP Datei übergeben und angezeigt werden.

Das ist ein Teil vom C code:
Code: [Select]

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h>
#include <ESP8266WiFi.h>

#define BMP_SCK 13
#define BMP_MISO 12
#define BMP_MOSI 11
#define BMP_CS 10

#define FORCE_DEEPSLEEP

Adafruit_BMP280 bme; // I2C

String apiKey = ""; //API KEY eintragen
const char* ssid = "FingerWeg";
const char* password = "36180253";
const char* server = "192.168.0.192";
WiFiClient client;

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));
 
  if (!bme.begin()) { 
    Serial.println("Could not find a valid BMP280 sensor, check wiring!");
    while (1);
  }
  WiFi.begin(ssid, password);
 
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(100);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected"); 
}


void loop() {
    Serial.print("Temperatur: ");
    Serial.println(bme.readTemperature());
   
    Serial.print("Luftdruck: ");
    Serial.println(bme.readPressure());

    Serial.print("Seehoehe: ");
    Serial.println(bme.readAltitude(1012.20)); // this should be adjusted to your local forcase
    Serial.print("---------------------------\n");

    if (client.connect(server,80))
    {
        // String postStr = apiKey;
        String postStr ="temp=";
        postStr += String(bme.readTemperature());
        postStr +="&pres=";
        postStr += String(bme.readPressure());
        postStr += "\r\n\r\n";
       
        client.print("POST api.php HTTP/1.1\n");
        client.print("Host: 192.168.0.192\n");
        //client.print("Connection: close\n");
        //client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
        client.print("Content-Type: application/x-www-form-urlencoded\n");
        client.print("Content-Length: ");
        client.print(postStr.length());
        client.print("\n\n");
        client.print(postStr);

        Serial.print(postStr);
 
    }
    client.stop();

    int minutes2sleep = 1;
    goToBed(minutes2sleep); //sending into deep sleep
}

void goToBed (int minutes) {
  #ifdef FORCE_DEEPSLEEP
    Serial.print("Uaaah. I'm tired. Going back to bed for ");
    Serial.print(minutes);
    Serial.print(" minutes. Good night!");
    ESP.deepSleep(minutes * 60 * 1000000);
  #endif
}


Der Code liegt am Server in der api.php. Leider werden keine Daten übergeben aber warum??
Code: [Select]

<?php

    
if(isset($_POST['temp'])){
        echo 
$_POST['temp'];
        echo 
"Daten vorhanden!";
    }else{
        echo 
"Keine Daten für die Temperatur!!";
    }

    if(isset(
$_POST['pres'])){
        
$pres $_POST['pres'];
        echo 
$pres;
        echo 
"Daten vorhanden!";
    }else{
        echo 
"Keine Daten für den Luftdruck!!";
    }            
?>



Als Server läuft ein Raspberry Pi mit Apache2 und php 7 Server.
Es werden keine Daten in die 'temp' geschrieben. Was mach ich da falsch? Wo ist mein Denkfehler?
Wenn ich die api.php aufrufe bekomme ich "Keine Daten für den..." angezeigt.
httpCode kommt 200 zurück
Ich steh echt am Schlauch!![/code]

Tommy56

#1
Nov 24, 2019, 09:37 pm Last Edit: Nov 24, 2019, 09:42 pm by Tommy56
Ich würde schätzen, hier fehlt das ?
vor temp.

Ach nee, Du willst post machen. Kann es sein, dass Dein Server nur HTTPS will?

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Tommy56

Werte doch mal die Antwort vom Server aus (lasse sie Dir anzeigen) dann siehst Du, was ihm nicht gefällt.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Tommy56

#3
Nov 24, 2019, 10:44 pm Last Edit: Nov 24, 2019, 10:48 pm by Tommy56
Mein Test damals (mit HTTPS) war so:
Code: [Select]

/*
*  HTTP over TLS (HTTPS) example sketch
*
*  Created by Ivan Grokhotkov, 2015.
*  This example is in public domain.
*/

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

const char* ssid = "ssid";
const char* password = "geheim";

const char* host = "www.host.tld";
const int httpsPort = 443;
const uint32_t timeout = 60 * 1000UL; // 60 Sekunden
uint32_t timoutStart;

// Use web browser to view and copy
// SHA1 fingerprint of the certificate
// const char* fingerprint = "87:F9:CB:2C:B1:58:84:F8:0F:55:44:C0:39:A0:81:77:5C:8E:C8:35";
const uint8_t fingerprint[20] = {0x87,0xF9,0xCB,0x2C,0xB1,0x58,0x84,0xF8,0x0F,0x55,0x44,0xC0,0x39,0xA0,0x81,0x77,0x5C,0x8E,0xC8,0x35};

void setup() {
  Serial.begin(115200);
  Serial.println();
  Serial.print("connecting to ");
  Serial.println(ssid);
  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;
  // client.setInsecure();
  client.setFingerprint(fingerprint);
  Serial.print("connecting to ");
  Serial.println(host);
  if (!client.connect(host, httpsPort)) {
    Serial.println("connection failed");
    return;
  }

  // if (client.verify(fingerprint, host)) {
    // Serial.println("certificate matches");
  // } else {
    // Serial.println("certificate doesn't match");
  // }
  // Die Werte
  String content = "utc=123456&test=222.50";
  String url = "/wetter/posttest.php";
  Serial.print("requesting URL: ");
  Serial.println(url);

  // client.println("POST /wetter/posttest.php HTTP/1.1");
  client.print("POST ");
  client.print(url);
  client.println(" HTTP/1.1");
  client.print("Host: ");
  client.println(host);
  client.println("Cache-Control: no-cache");
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.print("Content-Length: ");
  client.println(content.length());
  client.println();
  client.println(content);

  Serial.println("request sent");
  timoutStart = millis();
  while(!client.available()) {
    if (millis() - timoutStart >= timeout) {
      Serial.println("Server timeout");
      return;
    }
    delay(2);
  }
  // Header vom Server
  while (client.connected() && client.available()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
    if (line == "\r") {
      Serial.println("headers received");
      break;
    }
  }
  // Payload
  while (client.connected() && client.available()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
  }
}

void ausgabe(char *txt) {
  Serial.println(txt);
}

void loop() {
}


Und auf dem Server:
Code: [Select]

<?php
 
echo "POSTTEST\n";
 
print_r($_REQUEST);
 echo 
"\n";
?>



Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Emma-Marie

Danke für die Anregungen.
Hab jetzt doch eine
HTTP/1.1 400 Bad Request   <-- ok, aber was stimmt nicht? Kann das sein das der Server nur https erlaubt?
da muss ich mich schlau machen.


Tommy56

#5
Nov 24, 2019, 11:49 pm Last Edit: Nov 25, 2019, 11:47 am by Tommy56
Dann musst Du den Fingerptint Deines Severs ermitteln.
Im FF oben auf das Icon - eitere Informationen bis zum Fingrprint durchhangeln.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Emma-Marie

hm..., hab jetzt nix gefunden. Du meist das Schloss und der Adressleite.
Mit fingerprint, API und so weiter hab ich mich noch nicht auseinander gesetzt.
Ist doch nicht so einfach wie gedacht.

agmue

Beim FF auch Extras/Seiteninformationen/Sicherheit/Zertifikat anzeigen/Allgemein/Fingerabdrücke
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Tommy56

Die Karawane zieht weiter. Da können wir hier ja aufhören.

Gruß Tommy
"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)

Go Up