Skocz do zawartości

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


kamil2127

Pomocna odpowiedź

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.

Link do komentarza
Share on other sites

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 😉

Link do komentarza
Share on other sites

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:

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

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?

Link do komentarza
Share on other sites

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!

Link do komentarza
Share on other sites

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
  • .
  • .
  • .
Link do komentarza
Share on other sites

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ę?

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

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...

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.