Skocz do zawartości

Wysyłanie danych na serwer metodą POST ESP8266 + NodeMCU v3 Arduino


Pomocna odpowiedź

Napisano

Dzień dobry

To mój pierwszy post, problem z jakim borykam się skłonił do napisania tego tematu.

Chciałbym zbudować na prosty model inteligentnego domu, gdzie sterowanie/odczyt zmiennych odbywałby się za pomocą strony internetowej. Strona ta działa, dane bez problemu można nadpisać z paska przeglądarki metodą GET, niestety przy użyciu ESP8266 I POST pojawia się jedynie następujący komunikat:

Kod w Ardiono ide

#include <ESP8266WiFi.h>
#include <ArduinoHttpClient.h>
const char* ssid = "siec"; // nazwa sieci
const char* password = "12345678"; //hasło sieci
char serverAddress[] = "81.171.31.230"; // adres mojej strony, uzyskany przy użyciu polecenia ping

int port = 80;
const char* host = "http://81.171.31.230";

WiFiClient wifi;
HttpClient client = HttpClient(wifi, host, port);
int status = WL_IDLE_STATUS;


String response;
int statusCode = 0;

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

// połącznie z siecią Wifi

Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);


/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
would try to act as both a client and an access-point and could cause
network-issues with your other WiFi-devices on your WiFi-network. */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("Signal Strenght : " + String(WiFi.RSSI()) + " dBm");

while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}

Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}

int value = 0;

void loop() {

Serial.println("making POST request");
String contentType = "application/x-www-form-urlencoded";
String postData = "temp_szklarni=20&wilgotnosc_szklarni=50&brama=1&list=0"; //przesyłane dane
client.post("/wifi.php", contentType, postData); //sciezka pliku (?)
// read the status code and body of the response
statusCode = client.responseStatusCode();
response = client.responseBody();

Serial.print("Status code: ");
Serial.println(statusCode);
Serial.print("Response: ");
Serial.println(response);


Serial.println("Wait five seconds");
delay(5000);
}

Tak wygląda drzewko plików w FileZilla, oczywiście wszystko jest na serwerze cba.pl:

Plik odpowiedzialny za odbiór informacji w PHP:

<?php
//$temp_szklarni = $_GET['temp_szklarni'];
//$wilgotnosc_szklarni= $_GET['wilgotnosc_szklarni'];
//$brama = $_GET['brama'];
//$list = $_GET['list'];

$temp_szklarni = $_POST['temp_szklarni'];
$wilgotnosc_szklarni= $_POST['wilgotnosc_szklarni'];
$brama = $_POST['brama'];
$list = $_POST['list'];


session_start();
$id_user=$_SESSION['id'];
require_once "connect.php";
$polaczenie = @new mysqli($host,$db_user,$db_password,$db_name);
if($polaczenie->connect_errno!=0) //sprawdza czy nawiazano polaczenie
{
echo "Error ".$polaczenie->connect_errno; //blad gdy polaczenie nie nawiazane
}
else
{

if($polaczenie->query("UPDATE ogrod2 SET wilgotnosc_szklarni='$wilgotnosc_szklarni', temp_szklarni='$temp_szklarni',list='$list' WHERE id='$id_user'"))


		{
			echo 'udalo sie';
			echo $wilgotnosc_szklarni;
			echo $temp_szklarni;
			echo $brama;
			echo $list;
		}
		else
		{
			echo 'nie udalo sie';
			echo $wilgotnosc_szklarni;
			echo $temp_szklarni;
			echo $brama;
			echo $list;
		}


$polaczenie->close(); //konczy polaczenie
}
?>

Domyślam się, ze problem tkwi w kodzie .ino odpowiedzialnym za wysyłanie danych metodą POST lub w samym pliku wifi.php którego zadaniem jest odbiór informacji. Zakomentowana część dotycząca metody GET działa poprzez adres przeglądarki.

Prosiłbym więc o sugestię dotyczące rozwiązania tego problemu oraz sposobu pobierania przykładowych zmiennych ze trony.

Drobiazg: nie podałeś z jaką to właściwie stroną (vhostem) ma się Twój ESP połączyć. Na jednym serwerze jest trochę więcej stron czyli sam IP nie wystarczy.

No - chyba, że Twoja strona to www.cba.pl 😉

Rozumiem, ze ta cześć kodu powinna być poprawiona w następujący sposób:

char serverAddress[] = "moja_nazwa_domeny.cba.pl"; // adres mojej strony, uzyskany przy użyciu polecenia ping 

int port = 80; 
const char* host = "http://moja_nazwa_domeny.cba.pl"; 

Próbowałem dziś zmiany te wdrożyć w życie, niestety pojawia się komunikat o błędzie:

  • Nieznana płytka nodemcuv2 (platforma esp8266, pakiet esp8266)

  • Błąd kompilacji dla płytki NodeMCU 1.0 (ESP-12E Module).

Dodatkowo przy podłączeniu płytki do COMu widoczny jest następujący, zapętlający się co jakiś czas komunikat:

  • Błędna biblioteka znaleziona w C:\Users\Kamil\Desktop\wifirifi\libraries\examples: C:\Users\Kamil\Desktop\wifirifi\libraries\examples

W katalogu tym znajdują się 2 foldery SerialESP8266_library_test oraz SerialESP8266_tcp_cli mieszące po jednym pliku o tej samej nazwie z rozszerzeniem .ino

Od wczoraj, tzn. dnia napisania poprzedniego postu nie było nic zmieniane, internet podpowiada, że przyczyną błędu mogły być 2 katalogi esp8266 o róznych wersjach kodowych. Mam tylko jeden, reinstalacja esp8266 by ESP8266 Community także nie pomogła.

Konfiguracja płytki:

Przede wszystkim - jeśli informujesz że wystąpił błąd kompilacji to może pokaż jaki...

Poza tym użyj właściwej biblioteki, czyli w tym przypadku ESP8266HTTPClient a nie ArduinoHttpClient.

Tutaj masz przykład użycia.

Podmieniłem biblioteki, ten sam efekt. Przy próbie wgrania programu z podanego linku komunikat błędu jest identyczny:

Arduino:1.8.5 (Windows 10), Płytka:"NodeMCU 1.0 (ESP-12E Module), 80 MHz, 4M (1M SPIFFS), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

C:\Program Files (x86)\Arduino\arduino-builder -dump-prefs -logger=machine -hardware C:\Program Files (x86)\Arduino\hardware -hardware C:\Users\Kamil\AppData\Local\Arduino15\packages -tools C:\Program Files (x86)\Arduino\tools-builder -tools C:\Program Files (x86)\Arduino\hardware\tools\avr -tools C:\Users\Kamil\AppData\Local\Arduino15\packages -built-in-libraries C:\Program Files (x86)\Arduino\libraries -libraries C:\Users\Kamil\Desktop\wifirifi\libraries -fqbn=esp8266:esp8266:nodemcuv2:CpuFrequency=80,FlashSize=4M1M,LwIPVariant=v2mss536,Debug=Disabled,DebugLevel=None____,FlashErase=none,UploadSpeed=115200 -ide-version=10805 -build-path C:\Users\Kamil\AppData\Local\Temp\arduino_build_387201 -warnings=none -build-cache C:\Users\Kamil\AppData\Local\Temp\arduino_cache_218331 -prefs=build.warn_data_percentage=75 -prefs=runtime.tools.esptool.path=C:\Users\Kamil\AppData\Local\Arduino15\packages\esp8266\tools\esptool\0.4.13 -prefs=runtime.tools.xtensa-lx106-elf-gcc.path=C:\Users\Kamil\AppData\Local\Arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\1.20.0-26-gb404fb9-2 -prefs=runtime.tools.mkspiffs.path=C:\Users\Kamil\AppData\Local\Arduino15\packages\esp8266\tools\mkspiffs\0.2.0 -verbose C:\Users\Kamil\Desktop\wifirifi\wifirifi.ino

Nieznana płytka nodemcuv2 (platforma esp8266, pakiet esp8266)

Błąd kompilacji dla płytki NodeMCU 1.0 (ESP-12E Module).
Błędna biblioteka znaleziona w C:\Users\Kamil\Desktop\wifirifi\libraries\examples: C:\Users\Kamil\Desktop\wifirifi\libraries\examples
Błędna biblioteka znaleziona w C:\Users\Kamil\Desktop\wifirifi\libraries\examples: C:\Users\Kamil\Desktop\wifirifi\libraries\examples

Wykasowanie na czysto Arduino IDE wraz z folderami i instalacja od nowa wraz z bibliotekami jest jakimś rozwiązaniem?

Tu Ci nie pomogę - w Linuksie wystarczy po prostu wywalić konkretny katalog. Ale wydaje mi się, że wywalenie wszystkiego tak, żeby śladu nie zostało może być dobrym rozwiązaniem.

Poza tym - jak instalowałeś płytkę ESP8266? Kilka starych poradników mówi coś o ściąganiu jakichś exe i ich uruchamianiu... Tutaj masz wszystko, jeśli robisz coś inaczej to najprawdopodobniej źle!

Uporałem się w końcu z kompilatorem.

Niestety po dodaniu biblioteki ESP8266HTTPClient pojawia się ten sam błąd tj.Error 400 bad request.

Spróbowałem wiec uporać się z problemem za pomocą metody GET, niestety także nie działa.

Wpisując w przeglądarkę poniższe zapytanie dane w bazie aktualizują się:

Natomiast użycie poniższego kodu nie zmienia nic w bazie danych:

#include <ESP8266WiFi.h> 
#include <ArduinoHttpClient.h> 
#include <ESP8266HTTPClient.h>

int temp_szklarni=20;
int wilgotnosc_szklarni=10;
int brama=0;
int list=5;
const char* ssid = "siec"; // nazwa sieci 
const char* password = "moja_strona.cba.pl"; // adres mojej strony, uzyskany przy użyciu polecenia ping 

int port = 80; 
const char* host = "https://moja_strona.cba.pl"; 

WiFiClient wifi;
HttpClient client = HttpClient(wifi, host, port); 
int status = WL_IDLE_STATUS; 


String response; 
int statusCode = 0; 

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

// połącznie z siecią Wifi 

Serial.println(); 
Serial.println(); 
Serial.print("Connecting to "); 
Serial.println(ssid); 


/* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default, 
would try to act as both a client and an access-point and could cause 
network-issues with your other WiFi-devices on your WiFi-network. */ 
WiFi.mode(WIFI_STA); 
WiFi.begin(ssid, password); 
Serial.println("Signal Strenght : " + String(WiFi.RSSI()) + " dBm"); 

while (WiFi.status() != WL_CONNECTED) { 
delay(500); 
Serial.print("."); 
} 

Serial.println(""); 
Serial.println("WiFi connected"); 
Serial.println("IP address: "); 
Serial.println(WiFi.localIP()); 
} 

int value = 0; 

void loop() { 

wysylanie_dane();
Serial.println("Wait five seconds"); 
delay(5000); 
} 
void wysylanie_dane()
{
 if (wifi.connect(serverAddress,port))
 {
   wifi.print("GET/wifi.php?");
   wifi.print("temp_szklarni=");
   wifi.print(temp_szklarni);
   wifi.print("&wilgotnosc_szklarni=");
   wifi.print(wilgotnosc_szklarni);
   wifi.print("&brama=");
   wifi.print(brama);
   wifi.print("&list=");
   wifi.print(list);

  wifi.println(" HTTP/1.1"); // Part of the GET request
   wifi.println("Host:moja_strona.cba.pl");
   wifi.println("Connection: close"); 
   wifi.println(); // Empty line
   wifi.println(); // Empty line
   wifi.stop();    // Closing connection to server
   Serial.println("Wyslano");

 }
 else
 {
   Serial.println("nie Wysłano");
 }
}

Port szeregowy:

  • Connecting to siec
  • Signal Strenght : 31 dBm
  • ..................................
  • WiFi connected
  • IP address:
  • 192.168.43.241
  • Wyslano
  • Wait five seconds
  • Wyslano
  • Wait five seconds
  • Wyslano
  • Wait five seconds
  • .
  • .
  • .

Nie mieszaj bibliotek - zapomnij o ArduinoHttpClient. Masz używać tylko ESP8266WiFi i ESP8266HTTPClient.

Poza tym między GET i path nie masz spacji - powinno być:

wifi.print("GET /wifi.php?");

a masz:

wifi.print("GET/wifi.php?");

Widzisz różnicę?

Jeżeli dobrze rozumiem to ArduinoHttpClient nie wspiera HTTPS jedynie HTTP stąd błąd 400.

Zauwazyłem tez, że nazwę hosta podałem właśnie jako HTTPS:

const char* host = "http://moja_strona.cba.pl"; //poprawione z https

Wspomniane błędy poprawiłem, bibliotekę usunąłem, podobnie jak obiekt client:

//HttpClient client = HttpClient(wifi, host, port);

Podczas kompilacji linia ta zgłaszała błąd braku biblioteki a ''client'' nie był w kodzie więcej używany.

Kod wygląda następująco:

#include <ESP8266WiFi.h> 
#include <ESP8266HTTPClient.h>

int temp_szklarni=20;
int wilgotnosc_szklarni=10;
int brama=0;
int list=5;
const char* ssid = "siec"; // nazwa sieci 
const char* password = "12345678"; //hasło sieci 
char serverAddress[] = "moja_strona.cba.pl"; // adres mojej strony, uzyskany przy użyciu polecenia ping 

int port = 80; 
const char* host = "http://moja_strona.cba.pl"; //poprawione z https

WiFiClient wifi;
//HttpClient client = HttpClient(wifi, host, port); 
int status = WL_IDLE_STATUS; 


String response; 
int statusCode = 0; 

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

// połącznie z siecią Wifi 

Serial.println(); 
Serial.println(); 
Serial.print("Connecting to "); 
Serial.println(ssid); 



WiFi.mode(WIFI_STA); 
WiFi.begin(ssid, password); 
Serial.println("Signal Strenght : " + String(WiFi.RSSI()) + " dBm"); 

while (WiFi.status() != WL_CONNECTED) { 
delay(500); 
Serial.print("."); 
} 

Serial.println(""); 
Serial.println("WiFi connected"); 
Serial.println("IP address: "); 
Serial.println(WiFi.localIP()); 
} 

int value = 0; 

void loop() { 

wysylanie_dane();
Serial.println("Wait five seconds"); 
delay(5000); 
} 

void wysylanie_dane()
{
 if (wifi.connect(serverAddress,port))
 {
   wifi.print("GET /wifi.php?");
   wifi.print("temp_szklarni=");
   wifi.print(temp_szklarni);
   wifi.print("&wilgotnosc_szklarni=");
   wifi.print(wilgotnosc_szklarni);
   wifi.print("&brama=");
   wifi.print(brama);
   wifi.print("&list=");
   wifi.print(list);

   wifi.println(" HTTP/1.1"); // Part of the GET request
   wifi.println("Host:moja_strona.cba.pl"); 
   wifi.println("Connection: close"); over transmitting the message
   wifi.println(); // Empty line
   wifi.println(); // Empty line
   wifi.stop();    // Closing connection to server
   Serial.println("Wyslano");

 }
 else
 {
   Serial.println("nie Wysłano");
 }
}

Niestety kod ten dalej nie uaktualnia wartości w bazie danych.

Wiesz co? Biblioteka ESP8266HTTPClient jest całkiem nieźle udokumentowana, może więc przede wszystkim poczytaj sobie dokumentację, potem jej użyj. Bo jak tak będziesz macać nie rozumiejąc tego co piszesz, to za jakieś pół roku dojdziemy do tego, że coś się w bazie uaktualni...

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...