Stránka 1 z 2
ESP8266 jak odeslat data
Napsal: 27 zář 2019, 15:42
od Le_Ze
Zdravím.
Mam vytvořený servr a jsem připojený k routru.
Takto si zvladnu z ESP8266 stahnoud data jak přes python, lazarus,PHP.
Kód: Vybrat vše
void loop()
{
WiFiClient client = server.available();
if (!client) {
return;
}
client.println("Jsem tu");
}
Jak ale na to, když chci data odeslat z ESP8266 na raspi?
Je jiný zpusob, než PHP?
Ja to zkoušel přes ten PHP a nějak mi to nefunguje.
Kde muže byt kopanec?
Kód: Vybrat vše
const char* host = "http://192.168.1.91";
WiFiClient client;
void loop() {
if (client.connect(host,8888)) {
client.print("POST /update HTTP/1.1\n");
client.print("Host: /nacti.php\n");
client.print("test");
}
else
{
Serial.println("nepovedlo se");
}
client.stop();
delay(30000);
}
Napsal: 27 zář 2019, 20:06
od Osmdesat
Matně si pamatuji, že mezi sekcí záhlaví a dat musejí být dvě odřádkování. No a samozřejmě na konci http přenosu musí být odřádkování také. No a hlavička host je jen název domény, ne soubor, jak tam píšeš. Jak potom v php skriptu čteš přijatá data (pole $_POST asi nic obsahovat nebude, kdyžs to neposlal v url-formátování arg1=bla1&arg2=bla2...)?
WifiClient bere asi snad jen adresu, bez protokolové předpony (http://)?
Takže by tam bylo:
Kód: Vybrat vše
const char* host = "192.168.1.91";
WiFiClient client;
void loop() {
if (client.connect(host,8888)) {
client.print("POST /update/nacti.php HTTP/1.1\n");
client.print("Host: 192.168.1.91\n\n");
client.print("test\n");
}
else
{
Serial.println("nepovedlo se");
}
client.stop();
delay(30000);
}
Ale jestli je chyba opravdu v tomhle, nemohu zaručit.
Napsal: 27 zář 2019, 20:23
od FHonza
Kód: Vybrat vše
HTTPClient http;
http.begin("http://192.168.1.88:8888/nacti.php");
http.addHeader("Content-Type", "text/plain");
int navrat = http.POST("Zprava od ESP");
String data = http.getString();
http.end();
Takhle ve zkratce mi to funguje.
Napsal: 28 zář 2019, 22:07
od Le_Ze
@FHonza
Mi ne.
V tom nacti.php mam toto
Kód: Vybrat vše
<?php
$soubor = fopen("./Disk1/text.txt", "w");
fwrite($soubor, "$_POST");
fclose($soubor);
?>
A do toho text.txt se uklada misto Zprava od ESP tak Array
Napsal: 28 zář 2019, 22:59
od FHonza
Jestli si dobře pamatuju, tak $_POST je vždy asociativní pole. A php převede pole na text jako řetězec "Array". Zkus
Napsal: 29 zář 2019, 10:15
od Le_Ze
fwrite($soubor, implode($_POST));
Textak furt prazdný.
Timto zpusobem člověk nevi, kde je problem, jestli na straně ESP8266, nebo PHP.
Jsem zkusil wiresharka a filtr ip.addr == 192.168.1.20
a hledal něco, co odesila, a nic.
ip.addr == 192.168.1.20 and http.request.method == "POST"
Vubec nic nevypsal.
Asi bude rozumnější to řešit přes client.print, kde vidim, že se to vypisuje a pak to jen řešit na straně PHP.
Kód: Vybrat vše
void loop()
{
WiFiClient client = server.available();
if (!client) {
return;
}
client.println("Jsem tu");
}
Kód: Vybrat vše
<?php
$homepage = file_get_contents('http://192.168.1.20');
echo $homepage;
$soubor = fopen("./Disk1/text.txt", "w");
fwrite($soubor, "$homepage");
fclose($soubor);
?>
Toto funguje, ale tu PHP stranku musim spustit ja.
Takže nějak pořešit, aby tu PHP stranku spustila ta ESP8266.
Napsal: 29 zář 2019, 12:08
od FHonza
Tu stránku "spustí" dotaz na server (ať už GET nebo POST). V první řadě bych se podíval důkladně na obsah superglobální proměnné $_POST při zpracování dotazu. Vypiš si na straně serveru někam do logu (nebo prostě kamkoli) obsah pomocí metody var_dump, případně print_r.
Ten příklad, jak jsem psal, mi funguje. Myslím si, že je něco špatně při zpracování na straně serveru.
Napsal: 29 zář 2019, 12:22
od Le_Ze
FHonza píše:Vypiš si na straně serveru někam do logu (nebo prostě kamkoli) obsah pomocí metody var_dump, případně print_r.
Tak v PHP zrovna moc neumím
Toto jde mimo mně.
Napsal: 29 zář 2019, 12:33
od FHonza
Jestli provozuješ Windows, tak Ti zítra můžu napsat krátký testovací prográmek pro
WAMPServer.
Napsal: 29 zář 2019, 18:25
od Le_Ze
Zkusim počkat na kamoše, možna poradi, pokud ne, ozvu se.
Dik.
Napsal: 30 zář 2019, 12:55
od Le_Ze
Tak toto poslal kamoš
Kód: Vybrat vše
$req_dump = print_r($_REQUEST, TRUE);
$fp = fopen('./Disk1/request.log', 'a');
fwrite($fp, $req_dump);
fclose($fp);
V souboru mam
Napsal: 30 zář 2019, 13:35
od FHonza
zkus ještě $_POST místo $_REQUEST
Napsal: 30 zář 2019, 14:31
od Le_Ze
To same ale napadla mně takova prasarna.
O kousek výše jsem dal to co mi funguje.
Takže vytvořit toho klienta.
V něm zavolat tu php stranku.
HTTPClient http;
http.begin("http://192.168.1.88:8888/nacti.php");
a pak mu tam vlepit client.println("Jsem tu");

Napsal: 30 zář 2019, 15:03
od FHonza
A jakou hodnotu Ti vrací
Kód: Vybrat vše
int navrat = http.POST("Zprava od ESP");
?
Večer se na to ještě jednou podívám u sebe a dám vědět.
Napsal: 30 zář 2019, 20:07
od Le_Ze
1852798249