Salve a tutti..
Sto cercando di portar su le prime pagine del webserver che dovrò caricare su arduino.
Il progetto di partenza è un sistema di allarme, con relativi sensori di movimento, schermo lcd, tatiera, riconoscimento RFID, ecc ecc..il tutto funzionante, ma pensando di implementare una gestione remota del sistema, ho iniziato a fare dei test..(Utilizzo un'arduino Mega 2560 r3 e una scheda di rete compatibile con chipset Wiznet 5100..)
Sono riuscito con qualche esempio trovato online a caricare un'ipotetica pagina INDEX.htm dalla scheda SD.
A questo punto, ho pensato di caricare una pagina di LOGIN per gestire gli accessi. Ecco il codice della stessa:
<!DOCTYPE html>
<html>
<head >
<title>OSAS - Login</title>
</head>
<body >
<hr>
<hr>
<table width="40%" border="0" align="center" bgcolor="#e8e8e8">
<tr align="center">
<td><form>
<font face="Arial" size="2"><b>User</b></font>
<input type="text" name="login">
<font face="Arial" size="2"><b>Password</b></font>
<input type="password" name="password">
<input type="submit" value=" Accedi ">
</form></td>
</tr>
</table>
<hr>
</body>
</html>
<hr>
Adesso, se volessi gestire le richieste HTTP che invio col codice soprastante(sul quale ho qualche dubbio rispetto alla gestione del tag "Action" nel form),cosa dovrei fare con arduino?
Ho questo codice:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192, 168, 1, 127};
EthernetServer server(80);
File htmlFile;
void setup ()
{
Ethernet.begin(mac, ip);
server.begin();
if (!SD.begin(4)) { return; }
Serial.begin(9600);
}
void loop ()
{
EthernetClient client = server.available();
if (client)
{
boolean currentLineIsBlank = true;
while (client.connected())
{
if (client.available())
{
char c = client.read();
if (c == '\n' && currentLineIsBlank)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
htmlFile = SD.open("login.htm");
if (htmlFile)
{
while (htmlFile.available())
{
client.write(htmlFile.read());
}
htmlFile.close();
}
break;
}
else if (c == '\n')
{
currentLineIsBlank = true;
}
else if (c != '\r')
{
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
Se ora volessi controllare che non sia una stringa vuota, ma appunto una richiesta di tipo POST inviata dalla pagina, ipoteticamente potrei aggiungere qualche linea di codice, e far scrivere il contenuto della variabile C in una stringa e poi eseguire i relativi controlli per definire il tipo di richiesta e ho pensato di farlo in questo modo..
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {192, 168, 1, 127};
EthernetServer server(80);
File htmlFile;
void setup ()
{
Ethernet.begin(mac, ip);
server.begin();
if (!SD.begin(4)) { return; }
Serial.begin(9600);
}
void loop ()
{
EthernetClient client = server.available();
if (client)
{
boolean currentLineIsBlank = true;
boolean currentLineIsGet = true;
boolean currentReqIsOk = false;
int i=0;
int bufind = 0;
char buffer[64];
while (client.connected())
{
if (client.available())
{
char c = client.read();
if(currentLineIsGet && bufind < 63)
{
buffer[bufind] = c;
bufind++;
buffer[bufind] = 0;
i++;
if (c== '\n' && i>1)
{
CurrentReqIsOk = true;
}
}
if (CurrentReqIsOk)
{
///ISTRUZIONI DI CONTROLLO
//poi apertura file INDEX.htm
}
if (c == '\n' && currentLineIsBlank)
{
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();
htmlFile = SD.open("login.htm");
if (htmlFile)
{
while (htmlFile.available())
{
client.write(htmlFile.read());
}
htmlFile.close();
}
break;
}
else if (c == '\n')
{
currentLineIsBlank = true;
currentLineIsGet = false;
}
else if (c != '\r')
{
currentLineIsBlank = false;
}
}
}
delay(1);
client.stop();
}
}
Mancano le operazioni di controllo stringa, ma anche decidendo di stampare su serial monitor la stringa ricevuta, non mi stampa nulla..cosa sbaglio?
Qualcuno sa darmi una mano?