Internet je plný návodů, ale nic nefungovalo. Chyběla mi řada knihoven, ale jejich instalace to nevyřešila a prostě žádné odezva. Pak jsem našel takové, které nezvládli před DNS a to by znamenalo, že bych musel přistupovat přímo na IP, to jsem také nechtěl... Až jsem našel tento skript a chci se o něj podělit.
Pracuje s jedinou knihovnou: #include < ESP8266WiFi.h >
Má jedno zásadní omezení... neumí SSL verze stránek. Nelze použít pro https! Což mě dost štve, protože všechny svoje webové stránky mám na https verzi. A kdo ne, že? Musíte si to vyřešit tím, že buď budete přistupovat na IP druhého Arduina (a nemusíte řešit DNS) nebo třeba díky .htaccess vypodmínkovat jeden adresář, který se nebude na SSL verzi automaticky přesměrovávat.
Rozhodně nemůžete skript upravit jen tím, že byste změnili port na 443 a přidali k url https. Nefunguje to. Server vám odpoví stranou 400 špatný požadavek a bude vás nabádat k tomu, abyste použili správný prohlížeč, protože tento špatně komunikuje se serverem. :-D Ne, není to ani vtipný, je to škoda.
Možná časem budu pátrat po skriptu, který umí https, ale teď už na to kašlu a spokojím se s méně bezpečnou http verzí. Pokud byste přistupovali na IP druhého arduina v sítí bylo by to bezpečnější na odpolech apd. Neposílejte přes http žádná hesla!
Tady je ta krása:
#include < ESP8266WiFi.h >
const char* ssid = "jméno wifi sítě";
const char* password = "heslo do ní";
const char* host = "URL kam chci"; //třeba www.google.com bez lomítka a bez http
String line;
void setup()
{
Serial.begin(9600);
Serial.println();
Serial.printf("Connecting to %s ", ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println(" connected");
}
void loop()
{
WiFiClient client;
Serial.printf("
[Connecting to %s ... ", host);
if (client.connect(host, 80))
{
Serial.println("connected]");
Serial.println("[Sending a request]");
String url = "ovladani/lednice.php?datum=1"; //URL bez lomítka na začátku
client.print(String("GET /") + url + " HTTP/1.1
" +
"Host: " + host + "
" +
"Connection: close
" +
"
"
);
Serial.println("[Response:]");
while (client.connected())
{
line = client.readStringUntil();
Serial.print(line);
}
client.stop();
Serial.println("
[Disconnected]");
}
else
{
Serial.println("connection failed!]");
client.stop();
}
delay(5000);
}
Co to dělá? Jen to otevře URL www.google.com/ovladani/lednice.php?datum=1, což je nesmysl, ale na mojí stránce je to skript, který vyhodnotí, co se po něm chce.
include(databaze.php);
$v = mysql_query("select * FROM domacnost where zarizeni=lednice");
$z=MySQL_Fetch_Array($v);
$dstav=$z["stav"];
$ddatum=$z["datum"];
echo"$dstav - $ddatum";
if($datum>0){
echo"Uprava";
$date = date(Y-m-d H:i:s);
$v = MySQL_Query("UPDATE ovladani SET datum=$date where zarizeni=lednice");
}
?>
Pokud se přistoupí s parametrem?datum=1 (>0) Zobrazí text Úprava a změní datum v DB na aktuální. Parametry můžete řetězit a dát vědět více informací?datum=1&teplota=22&pocasi=na+prd a tím roste užitečnost. Arduino si můžete načíst z DB stavy z jiného zařízení a podle nich třeba sepnout či vypnout relé atd.
Bez?datum=1 se jen zobrazí aktuální stav.
Moje vize je tím ovládat tepelné čerpadlo pro bazén. V domě bude arduino, které bude počítat podmínky pro jeho spuštění a pokud bude potřeba změní stav v DB na internetu a druhé Arduino tím bude ovládat. Samozřejmě to vůbec není potřeba dělat přes web a stačí aby se připojili na sebe, ale v rámci serveru můžu mít třetí stranu, která bude podmínky hlídat či sama ovládat nějakou rutinou v CRONu. Uvidím, co nakonec s tím provedu, ale test se mi líbí!