Patch per Arduino e Ethernet Library in Debian Sid


Posted: ottobre 2nd, 2012 | Author: | Filed under: Arduino, Bug, Embedded, Linux, Senza categoria | Tags: , , , , , , , , , | No Comments »


Premetto che questo è uno sviluppo di quanto ho scritto nel precedente post, ma comunque ricapitoliamo per completezza.

Ho avuto un problema programmando Arduino Uno con Ethernet Shield per cercare di fare una richiesta DNS. In particolare la board non riusciva a ritrovare l’indirizzo IP del server richiesto, al suo posto infatti veniva ritornato l’indirizzo 0.0.0.0.

Il codice del programma per effettuare la richiesta DNS è il seguente:

#include <SPI.h>
#include <Ethernet.h>
#include <Dns.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

EthernetClient client;

char server[] = "www.arduino.cc";
int serverport = 80;

void setup() {
  // start serial port:
  Serial.begin(115200);
  // give the ethernet module time to boot up:
  delay(1000);
  // start the Ethernet connection using a fixed IP address and DNS server:
  //Ethernet.begin(mac, ip, ipdns, ipgw, mask);
  Ethernet.begin(mac);
  // print the Ethernet board/shield's IP address:
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
}

void loop() {

  DNSClient dns;
  // OPENDNS
  IPAddress dns_ip(208, 67, 222, 222);
  IPAddress out_ip;
  dns.begin(dns_ip);

  dns.getHostByName(server, out_ip);

  Serial.println(out_ip);

  delay(5000);

}

Analizzando il problema e spulciando tra le librerie di Arduino (/usr/share/arduino) sono riuscito ad identificare il problema nel file libraries/Ethernet/Dns.cpp:

// Check we've got a valid DNS server to use
    if (iDNSServer == INADDR_NONE)
    {
        return INVALID_SERVER;
    }

È infatti questa la condizione che non si verifica (controllo se l’indirizzo inserito è diverso da 0.0.0.0) anche se in effetti l’indirizzo inserito è diverso da INADDR_NONE.
Questo perché è sbagliato l’operatore di confronto per la classe IPAddress, infatti questo è definito come:

bool operator==(const IPAddress& addr) { return _address.a32 == _address.a32; }

mentre noi abbiamo bisogno di confrontare il campo a32 della struttura _address dell’oggetto a sinistra del confronto con quello corrispondente dell’oggetto addr, ossio il secondo elemento del confronto, qui in realtà si confrontano i due campi dello stesso oggetto.

La soluzione è semplice dunque:

  bool operator==(const IPAddress& addr) { return _address.a32 == addr._address.a32; };

Questo problema, come è spiegato in questo post e questo post, non è un problema della libreria Ethernet di Arduino ma un bug del pacchetto Debian.
Infatti, come è spiegato in questo bugreport, la versione della libreria Ethernet inclusa in Debian è una versione modificata poiché viene utilizzata una versione più recente del compilatore, che ha dei problemi con la libreria standard.

Comunque il bug è stato segnalato e la patch inviata, quindi aspettatevi nei prossimi giorni un aggiornamento del pacchetto Debian di Arduino in Sid. Nel frattempo potete o modificare il codice della libreria inclusa nel sistema (la patch è presente come allegato di una delle mail nel bugreport), oppure utilizzare l’IDE di Arduino del sito ufficiale.



Leave a Reply

  • Articoli Recenti:

  • Tag

  • Categorie

  • Meta

  • Licenza Creative Commons

    Copyright © 2019, | ldlabs.org – Blog is proudly powered by WordPress All rights Reserved | Theme by Ryan McNair modified By Francesco Apollonio

    Smilla Magazine Il Bloggatore iwinuxfeed.altervista.org Feedelissimo - tecnologia WebShake - tecnologia