Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino WiFi Server
#1
Uzeo sam malo da se igram sa Arduino UNO WiFi-em i pade mi na um jedno pitanje.

Da li je moguce konfigurisati ga da svaki http klijent koji je zakacen na taj arduino wifi server, da za bilo koji http request ja mogu da vracam moju custom web stranicu?
Reply
#2
Moze, sve je stvar rutiranja upita na strani web servera

String request = client.readStringUntil('\r');

Dakle ti sam moras da rasclanis GET ili POST zahtev i odatle da uzmes potrebne podatke sa kojim odlucis koja stranica ce se prikazati.
E sad ako hoces da imas dva razlicita sadrzaja na isti GET zahtev onda moras da se poigras sa sesijama i/ili cookies.
U sustini sve moze da se odradi samo si sad na dosta nizem nivou baratanja sa HTTP nego sto je to slucaj sa PHP, C# i slicno, sve sto hoces mora da se isprogramira ...

Uzgred, video sam da koriste i WebSockets, to je odlicna varijanta za komunikaciju server-klient!
Reply
#3
(02-26-2017, 09:30 PM)mikikg Wrote: Moze, sve je stvar rutiranja upita na strani web servera

String request = client.readStringUntil('\r');

Kad meni dodje request na moj loop to je vec lako, medjutim, meni je problem kako da "preusmerim" traffic.

Tj. meni radi sve to ali kad pristupim direktno IP-u koji dobijem ako se zakacim na moj home wifi. Ako ne, ne znam sta bih mogao da gadjam kao endpoint u browseru da ga trigerujem.

Npr. WiFi podesavanja su mi dostupana na 192.168.240.1, ako se tu zakacim na moj home WiFi i dobijem prvi slobodni IP dodljen od mog rutera npr. 192.168.1.15. 
I onda preko mreze bilo iz browser-a ili sa mobilnog mogu da posetim http://192.168.1.15/arduino/webserver i da dobijem response koji sam ubacio u svoj loop na arduinu. Medjutim, ono sto ja hocu je da kad ukucam www.bilo-sta.com da dobijem taj isti response ukoliko sam ukonektovan na WiFi mog arduina.

Ovo je onaj standardni code sample koji dolazi uz Arduino Uno WiFi:
Code:
#include <Wire.h>
#include <UnoWiFiDevEd.h>

void setup() {
Wifi.begin();
Wifi.println("Web Server is up");
}
void loop() {

while(Wifi.available()){
process(Wifi);
}
delay(50);
}

void process(WifiData client) {
String command = client.readStringUntil('\r'); //ne radim nista s ovim jer sam hteo samo da propustim sve direktno preko ovog WebServer(client) metode...

WebServer(client);
}
void WebServer(WifiData client) {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 20");
client.println();
client.println("<html>");
client.println("<head> <title>Hello World</title> </head>");
client.print("<body>");
client.print("<h1>Hello World!</h1>");
client.print("</body>");
client.println("</html>");
client.print(DELIMITER);
}

Kad se ukonektujem recimo sa mobilnog na ovaj moj arduino WiFi i otvorim browser, dobijem prvo poruku da nisam konektovan na net, a zatim kad probam da ucitam bilo koji sajt, da je DNS los.
Reply
#4
Prva stvar je da probas da postavis sebe kao DNS za te uredjaje i da onda podesis u svom DNS serveru gde koja adresa vodi. Ovo mozda nije uvek moguce jer je mozda zakucan DNS kod klijenta u podesavanjima ili aplikacija ima u sebi zakucane IP adrese za odredjene URL-ove.

Druga stvar je da sebe postavis kao proxy pa da radis zamenu sadrzaja koji serviras klijentu. I ovde ces verovatno imati problema kod HTTPS saobracaja zbog pinovanja sertifikata unutar samih aplikacija.

I treca opcija ti je captive portal protokol: https://en.wikipedia.org/wiki/Captive_portal
“If you think you are too small to make a difference, try sleeping with a mosquito.” - Dalai Lama XIV
Reply
#5
Ne snalazis se sa DNS ...
Ko ce domen da rezolvuje tj pretovi u IP? Smile

Ukratko, editujes svoj /etc/hosts (na Windows se isto fajl zove, putanju ne znam, potrazi) i dodas svoju DNS definiciju {IP} {domen}
("hosts" ima priorited u odnosu na sve ostale DNS resolvere, tvog ISP, rutera itd):

Code:
192.168.1.15 bilo-sta.com
192.168.1.15 www.bilo-sta.com
Reply
#6
@Miki, ovo sto si ti pomenuo je end result koji bi ja zeleo da dobijem. Ali ne na ovaj nacin jer problem je s tim je sto host koji se edituje tu je na strani klijenta. Na win-u je to na C:\Windows\System32\Drivers\Etc\Host. 

Ovo sto je @1van pomenuo ne znam da li je moguce da se odradi na strani arduina, ali probacu da iscackam.

Edit, izgleda da je moguc captive protokol na arduino wifi shieldovima, videcu samo da iscackam za ovaj kako se tacno implementira. Smile
Reply
#7
Pazi, uredjaji na mrezi se prozivaju iskljucivo preko IP-a, domen tu prakticno nema veze (ima veze ali je drugacije, objasnicu) tako da kada ti hoces da prozoves neki uredjaj ti njega preko IP zoves (ti to ne vidis jer OS i browser to radi za tebe) i tu je ukljucen Domain Name System, to su servisi na mrezi koji samo sluze da nekome ko ih pita "gde je domen www.bilo-sta.com" vrati IP adresu koju on ima kod sebe zabelezenu a koja moze da bude tu neka lokalna definicija ili da povuce ako nema kod sebe definiciju iz glabalne "svetske" baze sa root DNS-ova samog Interneta, sve zavisi kako je sta podeseno.

Dakle da bi neki domen bio prozvan, neko mora da vrati definiciju IP adrese.
OS i Browser PRVO pitaju /etc/hosts, ako ne nadje tu onda pita sledeci definisan DNS server od tvoje ISP konekcije ili rutera, ako ni tu ne nadje nista onda, ne moze da otvori stranicu, DNS not resolved!
Po tome ispada da ako neces da menjas /etc/hosts jedino ti preostaje da definiciju onda globalno postavis, dakle kupis klasicno domen www.bilo-sta.com i u CP-u kod provajdera podesis lepo sve pod/domene koje hoces da rezolvju na IP i to je to!
Nakon toga ce ti raditi tvoj ESP/Arduino bez menjanja hosts fajla, www.bilo-sta.com ce pokazivati na 192.168.1.15 i svi srecni i veseli!

Medjutim, bices samo ti srecan jer ce samo tebi raditi! Sto? Zato sto si uneso u DNS LOKALNE IP adrese koje ne vaze na WAN (Internet) mrezi!!!

Da bi i to resio naravno moras svoj Arduino da vezes na WAN mrezu bilo direktno ili preko svoje ISP konekcije kao DMZ, ili kroz Proxy ili da forwardujes 80/443 portove na ruteru i onda tvoju javnu IP uneses u DNS definiciju kod provajdera gde si uzeo domen. Naravno staticka IP je vrlo pozeljna osim ako ne uspostavis DDNS (Dynamic DNS) koje moze "u letu" da menja definiciju IP-Domen.
Na taj nacin ce svima na internetu biti dostupan tvoj Arduino ...

Dalje, ako hoces da imas vise domena ili pod-domena a da Arduino na to odgovara drugacije, to je vec stvar HTTP protokola i tvog programa, moras da obradujes Headers-e samog HTTP zahteva, u njemu pise koji se domen explicitno proziva pa na osnovu toga ti serviras razlicite stranice (tako rade WEB serveri).

I zadnja stvar, sigurnost, tog malca ESP/Arduino kad stavis na WAN ima u roku od "odmah" da ga nadju da postoji tu na toj IP, samo se upitaj sta ce da mu se desi ako ga salete sa 1000 zahteva u sekundi ili paketima zahteva od par megabajta ili lose formulisanim HTTP zahtevima itd itd ...
O tome 1van moze mnogo vise da ti kaze, vrlo je nezgodno postaviti bilo sta na WAN bez nekih mehanizma zastite, Proxy, FireWall itd itd ...
Reply
#8
Nismo se razumeli @miki. Jasno je meni to sto ti pricas ali se @1van lepo dosetio prave reci koja mi je trebala. Smile

Inicijalna ideja mi nije ni bila da ga postavim dostupan od "spolja" da hendla sve to. Vise je bilo samo za neki mali test bez pravog pristupa internetu. 

No, problem sa inicijalno pomenutim board-om (Arduino Uno WiFi) je sto nema access point mode. Na srecu, pri ruci za test mi je bio i ESP8266i modul i ovo malo cudo proradi, doduse na mobilnom samo. Kad sam konektovan na ovako napravljen wifi i probam bilo koji http sajt vraca lepo zeljeni response za bilo koji, https verzije ne, kao sto je @1van i pomenuo.

Zanimljivo je da na desktop browserima, bar na MacOS-u izgleda da imaju neku dodatnu proveru. Probacu sutra i Win varijantu da vidim da li ce da prodje.
Reply
#9
ESP8266 je imao problem sa SSL. Ne znam da li je to sve zakrpljeno. Inače, može da radi u AP+STA modu.
Reply
#10
Ispravka za gornji post, izgleda da i Arduino Uno WiFi moze da radi u AP modu i da je i on baziran na ESP8266. E sad, samo treba da se odradi malo portovanje biblioteka, ali ni to ne bi trebalo da bude toliki problem... Smile

[Image: arduinosrl_unowifi_detail.jpg]
Reply


Forum Jump:


Users browsing this thread: 3 Guest(s)