prendendo spunto da una serie di articoli veramente interessanti di w.a. smith sul sito http://startingelectronics.com, ho scritto uno sketch per un web server con arduino mega, pagine memorizzate su sd card, immagini e aggiornamento asincrono con ajax.
tutto funziona alla perfezione se il client si collega direttamente senza effettuare un login.
provando inserire una semplice basic authentication ho notato che arduino non mi risponde più alle richieste ajax, posso solo inviare comandi ma le pagine non si aggiornano perchè non arriva nessuna risposta dal server. veramente non cosa fare!
qualcuno può aiutarmi?
allego sketch e pagine da mettere su sd card
tutto funziona alla perfezione se il client si collega direttamente senza effettuare un login.
provando inserire una semplice basic authentication ho notato che arduino non mi risponde più alle richieste ajax, posso solo inviare comandi ma le pagine non si aggiornano perchè non arriva nessuna risposta dal server. veramente non cosa fare!
qualcuno può aiutarmi?
allego sketch e pagine da mettere su sd card
prima parte del codice:
code: [select]
#include <spi.h>
#include <ethernet.h>
#include <sd.h>
#define req_buf_sz 120 // dimensione del buffer che memorizza la richiesta http (aumentata per la richiesta di username e password)
// mac address della ethernet shield
byte mac[] = { 0xde, 0xad, 0xbe, 0xef, 0xfe, 0xed };
ipaddress ip(192, 168, 0, 254); // ip address, di arduino
ethernetserver server(80); // porta di comunicazione 80
file webfile; // file della pagina web su sd card
char http_req[req_buf_sz] = {0}; // memorizzazione nell'array di una stringa nulla
char req_index = 0; // indice per esplorare http_req buffer
boolean led_state[4] = {0}; // memorizzazione dello stato dei led
boolean login = false;
unsigned int previousmillis = 0;
unsigned int currentmillis = 0;
unsigned long interval = 300 * 1000; // 5 minuti di attività libera del client
// pin utilizzati come uscite pwm
int pwmpins[3] = {12, 8, 11};
int pwmslider[3] = {0, 0, 0};
/*attuatori*/
const int outpina = 22; // pin attuatore a
const int outpinb = 24; // pin attuatore b
const int outpinc = 26; // pin attuatore c
const int outpind = 28; // pin attuatore d
/*pulsanti*/
const int inpina = 23; // pin pulsante a
const int inpinb = 25; // pin pulsante b
const float ldr_u = 50000.0; // valore ldr illuminamento unitario
const float pend = 0.66; // valore gamma fotoresistenza
int page = 0;
void setup()
{
// disabilitazione pin ethernet chip
pinmode(10, output);
digitalwrite(10, high);
serial.begin(9600); // per controllo su porta seriale
// inizializzazione sd card
serial.println("initializing sd card...");
if (!sd.begin(4)) {
serial.println("error - sd card initialization failed!");
return; // non riuscita
}
serial.println("success - sd card initialized.");
// ricerca file index.htm
if (!sd.exists("index.htm")) {
serial.println("error - can't find index.htm file!");
return; // file index.htm non trovato
}
serial.println("success - found index.htm file.");
// ricerca file page1.htm
if (!sd.exists("page1.htm")) {
serial.println("error - can't find page1.htm file!");
return; // file page1.htm non trovato
}
serial.println("success - found page1.htm file.");
// ricerca file page2.htm
if (!sd.exists("page2.htm")) {
serial.println("error - can't find page2.htm file!");
return; // file page2.htm non trovato
}
serial.println("success - found page2.htm file.");
// ricerca file slider.htm
if (!sd.exists("slider.htm")) {
serial.println("error - can't find slider.htm file!");
return; // file page2.htm non trovato
}
serial.println("success - found slider.htm file.");
// ricerca file slider.htm
if (!sd.exists("page2bis.htm")) {
serial.println("error - can't find slider.htm file!");
return; // file page2bis.htm non trovato
}
serial.println("success - found page2bis.htm file.");
// pulsanti
pinmode(inpina, input);
pinmode(inpinb, input);
// leds
pinmode(outpina, output);
pinmode(outpinb, output);
pinmode(outpinc, output);
pinmode(outpind, output);
// inizializzo pin delle uscite pwm
(int = 0; < 2; i++) {
pinmode(pwmpins[i], output);
analogwrite(pwmpins[i], 255);
}
ethernet.begin(mac, ip); // inizializzazione ethernet device
server.begin(); // inizio l'ascolto dei client
}
void loop()
{
currentmillis = millis();
ethernetclient client = server.available(); // ricerca dei client
if (client) { // se c'è un client
boolean currentlineisblank = true;
while (client.connected()) {
if (client.available()) { // dati provenienti dal client disponibili
char c = client.read(); // lettura di un byte (carattere) dal client
serial.print(c);
// memorizzazione dei caratteri nell'array
if (req_index < (req_buf_sz - 1)) {
http_req[req_index] = c;
req_index++;
}
if (currentmillis - previousmillis > interval) //sessione scaduta
{
login = false;
previousmillis = currentmillis;
}
// l'ultima linea che proviene dal client è vuota e termina con \n
// la risposta al client si deve inviare solo se arriva l'ultima linea vuota
if (c == '\n' && currentlineisblank) {
if (strcontains(http_req, "znjhbmnvoje5njq=")) // codice corrispondente a: franco:1964
{
login = true;
previousmillis = currentmillis;
}
login = true; // in questo modo non ho problemi!
serial.println("**********************************************************************");
serial.println(http_req);
serial.println("**********************************************************************");
// il client può:
// richiedere una pagina web o pagina xml
// effettuare una richiesta ajax di invio file xml
if (login == false && strcontains(http_req, "get / "))
{
client.print(f("http/1.1 401 authorization required\n"
"www-authenticate: basic realm=\"area privata\"\n"
"content-type: text/html\n"
"connnection: close\n\n"
"<!doctype html>\n"
"<html><head><title>error</title>\n"
"</head><body><h1>401 accesso non autorizzato</h1></body></html>\n"));
}
if (login == false && (strcontains(http_req, "get /index.htm") || strcontains(http_req, "get /page1.htm") || strcontains(http_req, "get /page2.htm")
|| strcontains(http_req, "get /slider.htm") || strcontains(http_req, "get /page2bis.htm")))
{
client.println("http/1.1 200 ok");
client.println("content-type: text/html");
client.println("connection: keep-alive");
client.println();
webfile = sd.open("fine.htm");
if (webfile) {
while (webfile.available()) {
client.write(webfile.read()); // invio della pagina web al client
}
webfile.close();
}
}
Arduino Forum > International > Italiano > Software (Moderator: leo72) > Arduino mega web server ajax su SD card, pagine multiple, immagini e login
arduino
Comments
Post a Comment