Arduino mega web server ajax su SD card, pagine multiple, immagini e login


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
 

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