Support http://amicus.ba with small donation

 
Četvrtak 8 Juni 2023

Zvjezdica neaktivnaZvjezdica neaktivnaZvjezdica neaktivnaZvjezdica neaktivnaZvjezdica neaktivna
 

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.

Dodaj komentar

Komentari odražavaju stavove svojih autora a NE stavove http://amicus.ba. Možete slobodno izraziti svoje mišljenje o članku koji komentarišete ili o komentarima drugih sve dok su vaši komentari u granicama uljudnosti. Uvredljivi, vulgarni, rasistički, nacionalistički i ostali opšte neprihvatljivi komentari će biti izbrisani! Ako imate neku sugestiju, prijedlog ili primjedbu ovo je dobro mjesto da je iznesete.

Coments WILL NOT BE published automatically. Administrator will check and publish each comment.

Amicus copyright 2023