Support http://amicus.ba with small donation

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.

Pocetak - http komanda

 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.

Posalji - http komanda

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.