Salve a tutti, ho un problema che non riesco a risolvere...basandomi sull'esempio del reference ho creato questo sketch:
//Includo le librerie necessarie
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
//Configurazione di rete
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress IP(192, 168, 1, 250);
unsigned int localPort = 9;
const int MAGIC_PACKET_SIZE = 102;
char packetBuffer[MAGIC_PACKET_SIZE];
EthernetUDP Udp;
//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;
void setup() {
//Avvio la connessione di rete e imposto Arduino in ascolto
Ethernet.begin(mac, IP);
Udp.begin(localPort);
//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() {
//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:");
Serial.println(packetBuffer);
//Se il Magic Packet contiene il mac address di questa scheda di rete, controllo lo stato del pc ed invio il comando di accensione
if (1>0) { // <<========== FARE DEBUG DEL CONTENUTO DEL PACCHETTO E CREARE UN IF CHE REALMENTE CONTROLLI SE E' UN MAGIC PACKET PER QUESTO MAC ADDRESS O NO !!!!
//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);
}
//Per debug analizzo anche il caso di pc già acceso
else Serial.println("Pc già acceso");
}
}
}
In linea generale sembra tutto funzionare.. il problema è che mi aspettavo di leggere sul serial monitor alla ricezione di un magic packet, una stringa leggibile contenente il mac address come leggo su wikipedia:
I pacchetti Ethernet che attivano la "sveglia" sono detti Magic Packet ("pacchetti magici"). Il Magic Packet è in sostanza un frame multicast, composto da una prima parte di sincronizzazione costituita da sei bytes di valore FF esadecimale, seguiti dall'Indirizzo MAC del nodo bersaglio ripetuto 16 volte, per un totale di 96 bytes, e da un campo password opzionale che può essere assente, lungo 4 bytes o 6 bytes[1].
volevo poi sostituire l'attuale (inutile) if 1 > 0 con un bel if mac (di arduino) è nella stringa ...
solo che la stringa che ricevo è illeggibile:
Ricevuto Magic Packet dall'IP: 192.168.1.8, porta: 56931
Contenente:
ÿÿÿÿÿÿôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%�À¨ú�