L’Internet des Objets
33.1 Ethernet, pour l’UNO
La méthode gourmande consiste à installer un serveur web sur l’Arduino. Pour cela, nous pouvons ajouter l’exemple WebServer de la librairie Ethernet. Cet exemple est un peu gros et il va falloir être très habile pour rester dans la limite mémoire de l’UNO.
Nous allons utiliser quelque chose de plus simple, la communication textuelle sur UDP. Pour cela, nous utiliserons UDPSendReceiveString.
Il faudra commencer par adapter l’adresse MAC (éventuellement) et surtout l’adresse IP. Les autres paramètres IP pourront être adaptés en cas de besoin. En particulier, cela pourra être utile d’avoir le support DHCP.
// The IP address will be dependent on your local network:
byte mac[] = {0x42, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(10, 33, 105, 177);
unsigned int localPort = 8888; // local port to listen on
Pour vérifier si la carte est bien active, un ping doit aboutir. Si nous obtenons une réponse au ping, nous pouvons vérifier l’ouverture du port :
-
• Avec nmap :
nmap -PN -sU -pU:8888 10.33.105.177 PORT STATE SERVICE 8888/udp open|filtered ddi-udp-1 MAC Address: 42:AD:BE:EF:FE:ED (Unknown)
-
• Avec netcat, le moniteur série affichera la chaîne reçue :
$ netcat -u 10.33.105.177 8888 foobargee acknowledged
Ensuite, nous pouvons modifier le code. Pour faire joli, c’est mieux d’ajouter un retour chariot à la réponse d’acquitement :
Udp.write(ReplyBuffer);
Udp.write("\n");// ajout d'un retour chariot
Puis chercher où le programme récupère la chaîne reçue :
// read the packet into packetBufffer
Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE);
Serial.println("Contents:");
Serial.println(packetBuffer);
La lecture UDP rempli le buffer packetBuffer, puis l’affiche sur le terminal. Nous allons changer cela pour utiliser une fonction qui va traiter l’information :
traite(packetBuffer);
Le code peut alors être ajouté. Nous ajoutons une fonction qui permet de réninitialiser le microcontrôleur. Pour diminuer la probabilité d’erreur et rester concis, nous pouvons utiliser un langage similaire à celui des Modems : les commandes AT ou Hayes. Ainsi, ATZ peut réinitialiser l’Arduino. Pour le réinitialiser, il faut aller à l’adresse zéro. Par exemple en définissant une fonction bizarre : ResetFunc.
Ensuite, il faut définir les actions possibles et les effectuer en fonction de la chaîne reçue. Attention aux caractère invisibles ! Le protocole UDP peut transporter le retour chariot. La chaîne de caractère "ATZ" peut être en fait "ATZ(CTRL-M)".
void(* resetFunc) (void) = 0;//declare reset function at address 0
void traite (char * question)
{
String Q,isat,cmd;
Q=String(question);
isat=Q.substring(0,2);
cmd=Q.substring(2,3);
if (AT.equals(isat))
{
Serial.print("doing: ");
Serial.println(cmd);
if (cmd.equals(ResetZ))
{
Serial.println("Reseting");
resetFunc();
}
}
else
{
Serial.print("Erreur: ");
Serial.println(question);
}
}
Il est possible de faire toutes les actions désirées avec une fonction traite (et quelques autres) adaptée. Par exemple, allumer une diode avec la chaîne ATL, l’éteindre ATl. Ou encore, allumer la diode 7 ATL7…Par contre, la diode intégrée (broche 13) ne semble pas compatible avec la librairie Ethernet. La broche semble être affectée lors de l’initialisation d’Ethernet à l’horloge SPI.