Budući da ESPDuino ima ugrađen WiFi čip, idealan je za kreiranje upravljanih uređaja kojima se komande šalju iz web browser-a bilo kojeg uređaja.
Sketch ispod predstavlja kreiran web server na ESPDuino ploči koji se konektuje na podešeni WiFi access point (mojWiFi) i na portu 88 kreria web server.
Taj web server osluškuje konekcije klijenata te iz GET zahtjeva izdvaja komande koje šalje klijent.
U ovom primjeru su podešene dvije komande klijenta:
1. ako klijent pošalje komadnu POCETAK, ESPDuino odgovori sa USPOSTAVLJENA JE KONEKCIJA što je prikazano u prozoru web browser-a iz koga je komanda poslata.
Na slici iznad je screenshot poslate komande i primljenog odgovora iz Mozilla Firefox for mobile browser-a.
2. ako klijent pošalje komandu POSALJI ESPDuino odgovara slanjem podataka (vrijednost varijable strOdgovor) 1556668831;21.10;66.60;8.90;99.90;17.52
U ovom primjeru odgovor sadrži timestamp te vrijednosti izmjerenih temperatura i vlažnosti.
Bitno je napomenuti da su komande case sensitive što znači da je bitno da poslata komanda bude potpuno ista kao ona u Arduino sketch-u, inače će biti ignorisana.
Za slanje komande je, u web browser, potrebno upisati IP adresu ESPDuino ploče, port na kome radi server (nije potrebno za port 80) te kosu crtu i komadnu.
Npr.: 192.168.1.123:88/POSALJI
Kada ESPDuino primi ovaj http zahtjev, odgovoriće na njega slanjem vrijednosti varijable strOdgovor.
Ispod je cijeli Arduino sketch.
//////////////////////////////////////////////////////////
// //
// ESPDuino se povezuje na WiFi mrežu i podatke šalje //
// http klijentu na njegov zahtjev //
// //
// //
// Verzija: 1.0. //
// Datum: 4. V 2019. //
// //
// Autor: Samir Gutić, http://amicus.ba //
// //
//////////////////////////////////////////////////////////
#include <SPI.h>
#include <ESP8266WiFi.h> // Biblioteka za ESP8266 WiFi modul
const char* WiFi_mreza = "mojWiFi"; // Ime WiFi mreže
const char* WiFi_sifra = "sifraZaMojWifi"; // Password WiFi mreže
long lngJacinaSignala; // Jačina WiFi signala
// Za WiFi server
WiFiServer server(88); // Definisanje servera na portu 88 (moguće je izabrati port po želji)
String strLinija = ""; // Kreirati string koji će sadržavati podatke koji dolaze od klijenta
String strOdgovor = "0;0;0;0;0;0"; // Unaprijed podešeni tekst za slučaj da komanda klijenta nije shvaćena
String strKomanda = ""; // String koji će sadržavati komandu koju je poslao klijent
void setup()
{
Serial.begin(115200); // Pokretanje serijske komunikacije
// Konfigurisanje fiksne IP adrese WiFi shield-a
IPAddress ip(192, 168, 1, 123); // IP adresa za WiFi shield
IPAddress dns(208, 67, 222, 222); // DNS server za WiFi shield
IPAddress gateway(192, 168, 1, 1); // Default gateway
IPAddress subnet(255, 255, 255, 0); // Subnet maska
const char* charHostname = "httpKomande"; // Ime ESPDuina
// Brisanje postojeće konfiguracije
WiFi.disconnect();
WiFi.softAPdisconnect();
WiFi.mode(WIFI_OFF);
delay(500);
WiFi.hostname(charHostname); // Hostname ESPDuina
WiFi.mode(WIFI_STA); // Postavljanje modusa rada na klijent
WiFi.config(ip, gateway, subnet, dns); // Podešavanje fiksne konfiguracije WiFi shield-a
WiFi.begin(WiFi_mreza, WiFi_sifra); // Startanje klijent konekcije
// Konektovanje na WiFi mrežu
Serial.println("Konektovanje na WiFi");
while (WiFi.status() != WL_CONNECTED)
{
delay(250);
// Prikaz tačkica u prozoru serial monitora dok traje konektovanje na WiFi mrežu
Serial.print(".");
}
// Prazna linija poslije tačkica za konekciju
Serial.println("\n");
// Ispis podataka o WiFi konekciji na serial monitor
Serial.print("Konektovan na: ");
Serial.println(WiFi_mreza);
Serial.print("IP adresa: ");
Serial.println(WiFi.localIP());
lngJacinaSignala = WiFi.RSSI(); // Printaj jačinu WiFi signala:
Serial.print("Jacina signala (RSSI):");
Serial.println(lngJacinaSignala);
Serial.println("-------------------------------------------------");
// Pokretanje web servera
server.begin();
}
void loop()
{
if (WiFi.isConnected())
{
// Pauza da se spriječi prebrzo slanje naredbi
delay(500);
WiFiClient klijent = server.available(); // Osluškivanje klijenata
if (klijent) // Dobijen je klijent
{
while (klijent.connected()) // Izvršavati petlju dok je klijent konektovan
{
if (klijent.available()) // Ako postoje podaci za čitanje koje je poslao klijent
{
char charZnak = klijent.read(); // Pročitaj byte
if (charZnak == '\n') // Ako je pročitani byte znak za novu liniju (newline character)
{
// Ako je trenutna linija prazna, uzastopno su primljena dva znaka za novu liniju.
// To je kraj klijentovog HTTP zahtjeva. Znači, pošalji odgovor.
if (strLinija.length() == 0)
{
// Slanje odgovora klijentu samo ako je poslao odgovarajuću komandu
if (strKomanda == "POCETAK" || strKomanda == "POSALJI")
{
// HTTP zaglavlje
klijent.println("HTTP/1.1 200 OK");// HTTP zaglavlja uvijek počinju sa kodom odgovora (npr. HTTP/1.1 200 OK)
klijent.println("Content-type:text/html;charset=UTF-8"); // Zatim ide tip sadržaja tako da klijent zna šta dolazi
// i charset da se omogući prikaz znakova čćđšž (UTF).
klijent.println();
// Sadržaj HTTP odgovora
klijent.print(strOdgovor); // Sadržaj HTTP odgovora ide iza zaglavlja
klijent.println(); // HTTP odgovor završava praznom linijom
// Reset zadnje komande
strKomanda ="";
}
break; // Izlazak iz while petlje
}
else
{
strLinija = ""; // Ako je primljena nova linija, izbrisati trenutnu liniju
}
}
else if (charZnak != '\r')
{
// Ako je primljeno bilo šta osim znaka za novu liniju (carriage return znaka)
strLinija += charZnak; // Dodati znak na kraj trenutne linije
}
// Formiranje odgovora klijentu na osnovu primljene komande
if (strLinija.endsWith("GET /POCETAK")) // Poslata je komanda za provjeru konekcije
{
// Formiranje odgovora ako je poslat zahtjev za provjeru konekcije
strOdgovor = "USPOSTAVLJENA JE KONEKCIJA";
// Setovanje komande
strKomanda="POCETAK";
}
else if (strLinija.endsWith("GET /POSALJI")) // Poslata je komanda za slanje podataka
{
// Slanje podataka klijentu
// Formiranje odgovora klijentu u slučaju komade za slanje podataka (primljeno POSALJI)
// strOdgovor može biti formiran od pročitanih stanja ESPDuino ulaza/izlaza ili podaci sa SD kartice...
strOdgovor = "1556668831;21.10;66.60;8.90;99.90;17.52";
// Setovanje komande
strKomanda="POSALJI";
}
} // if (klijent.available)
} // While (klijent.connected)
} // If (klijent)
// Zatvaranje konekcije
klijent.stop();
} // if (WiFi.IsConnected)
}// Loop
Tokom pokretanja u Serial monitor prozoru Arduino IDE je mogiće vidjeti sljedeći tekst:
Konektovanje na WiFi
.............
Konektovan na: mojWiFi
IP adresa: 192.168.100.10
Jacina signala (RSSI):-62
-------------------------------------------------
Ako bi unutar else if (strLinija.endsWith("GET /POSALJI")) postavili While ili For petlju, onda bi bilo moguće poslati više podataka - npr. sadržaj cijelog niza ili čak dokumenta pročitanog sa SD kartice.
Treba napomenuti da u ovom sketch-u nije implementirana nikakva autentifikacija. Svako ko poznaje IP adresu, port i komande može poslati naredbu ESPDuino ploči i ona će biti izvršena.
Umjesto iz web browser-a komande je moguće slati i iz Android aplikacije čime se kreira dvosmjerna komunikacija između aplikacije i ESPDuina.