Mi autorispondo...dopo vari tentativi ecco il codice completo e funzionante... ho anche aggiunto la possibilità di collegarmi tramite browser (con una paginetta html attualmente scarna ma giusto per avere un idea di cosa si può fare...)
//Includo le librerie necessarie
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
//Configurazione di rete
byte mac[] = { 0xAA, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress IP(192, 168, 1, 250);
//Porta UDP per la ricezione dei MagicPacket
unsigned int localPort = 9;
EthernetUDP Udp;
const int MAGIC_PACKET_SIZE = 102;
char packetBuffer[MAGIC_PACKET_SIZE];
//Porta utilizzata per il web server
EthernetServer server(80);
//Pin digitali usati per leggere lo stato di accensione del pc e per inviare il segnale di accensione
int on_PIN = 2;
int check_PIN = 3;
//Variabili utilizzate per il conteggio dei MagicPacket e per la gestione del web server
unsigned long previousMillis = 0;
#define max_wait 5000
byte flag = 0;
boolean error = false;
String state = "";
String readString;
void setup() {
//Avvio la connessione di rete e imposto Arduino in ascolto
Ethernet.begin(mac, IP);
Udp.begin(localPort);
server.begin();
//Avvio il monitor seriale per debug
//Serial.begin(9600);
//Imposto come ingresso il pin di controllo stato del pc e come uscita LOW per non inviare segnali di accensione quello di accensione
pinMode(check_PIN, INPUT);
pinMode(on_PIN, OUTPUT);
digitalWrite(on_PIN, LOW);
}
void loop() {
//////////////////
/// WEB SERVER ///
//////////////////
//Imposto il server in ascolto di eventuali client
EthernetClient client = server.available();
if (client) {
//Una richiesta http termina con una linea vuota, uso la variabile per identificare il termine di una richiesta
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
//Leggo la richiesta http un carattere alla volta per analizzare la URL richiesta
if (readString.length() < 100) {
readString += c;
}
//Ricevendo una riga vuota, la richiesta http è terminata e possiamo mandare la risposta
if (c == '\n' && currentLineIsBlank) {
//Se ricevo la stringa wta=0 vuol dire che è stato lanciato il comando per lo spegnimento/sospensione remota del pc
if (readString.indexOf("index.php?wta=0") > 0) {
if (digitalRead(check_PIN) == LOW) state = "Pc gia' spento!";
else {
state = "Comando inviato, attendere lo spegnimento!";
//Imposto il pin d'accensione come HIGH per un tempo simile alla pressione di un pulsante
digitalWrite(on_PIN, HIGH);
delay(300);
//Rimetto il pin come LOW, ormai il pc si è acceso
digitalWrite(on_PIN, LOW);
}
}
//Se ricevo la stringa wta=1 vuol dire che è stato lanciato il comando per l'accensione remota del pc
else if (readString.indexOf("index.php?wta=1") > 0) {
if (digitalRead(check_PIN) == LOW) {
state = "Comando inviato, attendere l'accensione!";
//Imposto il pin d'accensione come HIGH per un tempo simile alla pressione di un pulsante
digitalWrite(on_PIN, HIGH);
delay(300);
//Rimetto il pin come LOW, ormai il pc si è acceso
digitalWrite(on_PIN, LOW);
}
else state = "Pc gia' acceso!";
}
//La stringa check.php controlla lo stato del pc e restituisce la risposta html
else if (readString.indexOf("check.php") > 0) {
if (digitalRead(check_PIN) == LOW) state = "Pc attualmente spento!";
else state = "Pc attualmente acceso!";
}
//Se non è stato trovata nessuna stringa compatibile con i comandi riconosciuti, genera un errore
else error = true;
//Genera l'output considerando eventuali errori altrimenti fornendo lo stato della serranda dopo un movimento o per un semplice controllo
if (error == false) client.println("HTTP/1.0 200 OK");
else client.println("HTTP/1.0 404 Not Found");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html><body>");
if (error == false) client.println(state);
client.println("</body></html>");
break;
}
//Controllo se ho ricevuto una riga vuota per inviare poi la risposta
if (c == '\n') {
currentLineIsBlank = true;
}
else if (c != '\r') {
currentLineIsBlank = false;
}
}
}
//Attendi per la fine della trasmissione dei dati e chiudi la connessione
delay(1);
client.stop();
//Pulisci la variabili per le prossime letture
readString = "";
error = false;
}
//////////////////
// MAGIC PACKET //
//////////////////
//Controllo ed azzeramento a tempo della variabile in cui viene memorizzata la ricezione del pacchetto per lo spegnimento/sospensione
if ((flag == 1) && (millis() - previousMillis > max_wait)) flag = 0;
//Controllo la dimensione del pacchetto ricevuto
int packetSize = Udp.parsePacket();
if (packetSize) {
/*Serial.print("Ricevuto Magic Packet dall'IP: ");
IPAddress remote = Udp.remoteIP();
for (int i = 0; i < 4; i++) {
Serial.print(remote[i], DEC);
if (i < 3) {
Serial.print(".");
}
}
Serial.print(", porta: ");
Serial.println(Udp.remotePort());
*/
Udp.read(packetBuffer, MAGIC_PACKET_SIZE);
//Serial.println("Contenente:");
byte mac2[] = {
};
byte I2 = 0;
for (byte I = 6; I < 12; I ++) {
//Serial.print(packetBuffer[I], HEX);
//Serial.print("\t");
mac2[I2] = packetBuffer[I];
if (mac[I2] != mac2[I2]) break;
I2++;
//Se il Magic Packet contiene il mac address di questa scheda di rete, controllo lo stato del pc ed invio il comando di accensione/spegnimento/sospensione
//Se il confronto è risultato positivo per tutte e 6 le coppie vuol dire che il MAC address è quello di Arduino
if (I2 == 6) {
//Se il computer è spento e quindi il check_PIN non riceve tensione, accendi il pc
if (digitalRead(check_PIN) == LOW) {
//Imposto il pin d'accensione come HIGH per un tempo simile alla pressione di un pulsante
digitalWrite(on_PIN, HIGH);
delay(300);
//Rimetto il pin come LOW, ormai il pc si è acceso
digitalWrite(on_PIN, LOW);
}
//Se invece il computer è già acceso, ignora il primo pacchetto ma memorizane l'arrivo e manda il comando di spegnimento/sospensione all'arrivo di un secondo pacchetto in un determinato lasso di tempo
else {
if (flag == 0) {
previousMillis = millis();
flag = 1;
}
else {
//Imposto il pin d'accensione come HIGH per un tempo simile alla pressione di un pulsante
digitalWrite(on_PIN, HIGH);
delay(300);
//Rimetto il pin come LOW, ormai il pc si è acceso
digitalWrite(on_PIN, LOW);
flag = 0;
}
}
}
}
}
}