[RISOLTO] udp.read caratteri strani, come interpretarli?

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¯%�À¨ú�

Prova ad analizzare byte per byte il contenuto esadecimale del packetBuffer.

Cioè trasforamando questo:

Udp.read(packetBuffer, MAGIC_PACKET_SIZE);
    Serial.println("Contenente:");
    Serial.println(packetBuffer);

in questo:

Udp.read(packetBuffer, 1);
    Serial.println("Contenente:");
    Serial.println(packetBuffer);

come esempio e vedere cosa esce ?
La cosa che non capisco poi è che da quello che tiro fuoi dal serial monitor, sembra rispettare quello che è il magic packet, ovvero:

ÿÿÿÿÿÿôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%ôm¯%�À¨ú�
ÿÿÿÿÿÿ (primi sei bytes di valore FF esadecimale)

ôm¯% che si ripete 16volte sarebbe il mac address

�À¨ú� ultimi bytes relativi al campo opzionale password...

No, intendevo qualcosa come questo:

for (byte I = 0; I < MAGIC_PACKET_SIZE; I ++) {
  Serial.print(packetBuffer[I], HEX);
  Serial.print("\t");
{

Serial.println();

Ok, grazieeeeee!! Adesso riesco a leggere cosa mi arriva..ma ho ancora bisogno di capire una cosa!
Intanto mi sono adattato il codice per leggere solo i bytes contenenti il mac address destinatario del pacchetto:

    for (byte I = 6; I < 12; I ++) {
      Serial.print(packetBuffer[I], HEX);
      Serial.print("\t");
    }
    Serial.println();

Se invio un magic packet a questo indirizzo mac: 1E3D4E5F5E6D

Ricevo sul serial monitor:

Ricevuto Magic Packet dall'IP: 192.168.1.8, porta: 49685
Contenente:
1E 3D 4E 5F 5E 6D

Ma se per caso il mac a cui invio il pacchetto ha una lettera oppure un 8 o un 9 all'inizio di una delle coppie, esempio: aE3D4E5F5E6D

allora nel serial monitor, quello che leggo diventa:

Ricevuto Magic Packet dall'IP: 192.168.1.8, porta: 64294
Contenente:
FFFFFFAE 3D 4E 5F 5E 6D

Ovviamente la cosa accade anche se è un'altra la coppia che inizia con una lettera, esempio se invio a: 9E3DaE5FbE6D

ottengo:

Ricevuto Magic Packet dall'IP: 192.168.1.8, porta: 51273
Contenente:
FFFFFF9E 3D FFFFFFAE 5F FFFFFFBE 6D

Perchè ?

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;
          }
        }
      }
    }
  }
}