Librairie domotique: Communication avec l’extérieur

Maintenant que nous pouvons piloter des sources secteurs depuis des interrupteurs et les configurer facilement, nous allons connecter notre Arduino au réseau Ethernet.

[adsGrandRectangleTexte]

Viznet Vs ENC28J60

Il existe deux principaux shields ethernet pour Arduino. Ceux basés sur le chip Viznet dont le shield ethernet officiel et ceux basé sur le chip ENC28J60.
Les shields viznet ont l’avantage d’être supporté par la librairie ethernet officielle, ils sont plus simple à programmer et plus performant. De plus ils possèdent un lecteur de carte SD.
Les shields ENC28J60 sont plus compliqués à utiliser mais les librairies font de gros progrès et la complexité est de plus en plus cachée. Ils sont moins performants (La gestion de la pile TCP/IP est laissée à l’Arduino) mais ont l’avantage d’être moins cher et c’est bien pour cela que j’ai choisi de les utiliser (Edit: on trouve maintenant des shields viznet vraiment pas cher … à tester)

La librairie Ethercard

Pour l’utilisation des shields à base d’ENC28J60 j’utilise la librairie Ethercard. Je vous laisse le soin de regarder les exemples fournis.

Communication via HTTP

Dans cet article je vais m’attarder sur l’utilisation de l’Arduino comme serveur HTTP. D’autres articles viendront sur son utilisation en tant que client HTTP et sur l’utilisation du protocole xPL.

Toujours pour plus de simplicité dans les sketchs j’ai fais une petite classe « HttpServer » qui va servir à encapsuler au maximum les appels à la librairie pour ne laisser que l’important dans le code du sketch (Edit: je viens de m’apercevoir que le principe était similaire à l’utilisation de la librairie webduino pour le viznet)

class HttpServer
{
    protected:
        [...]

        void http200ok();
        void http404();
        char* ParseUrl(char*);

    public:
        HttpServer();
        ~HttpServer();

        // Ajout de pages a servir par le serveur
        void AddPage(String,CallbackType);
        void AddDefaultPage(CallbackType);

        // Ecriture de donnees a servir
        void Print(int);
        void Println(int);
        void Print(char*);
        void Println(char*);

        // Ecoute du port 80 (par defaut)
        void Listen(word);

        // Retourne un argument de l'url demandee
        char* GetArg(char *str = NULL);
};

Ci-dessous un exemple d’utilisation. La méthode Listen() va s’occuper d’écouter et de traiter les requêtes envoyées au port 80. Dans cet exemple l’Arduino va répondre au ping et renvoyer une erreur 404 (page non trouvée) à chaque requête HTTP.

#include <EtherCard.h>
#include <ConnectingStuff.h>

HttpServer server;

void setup()
{
  // Définition des @ mac, ip et de la passerelle
  // n'oubliez pas que l'@ mac doit etre unique sur votre reseau
  uint8_t mymac[6] = { 0x54,0x55,0x58,0x10,0x00,0x11 };
  uint8_t myip[4] = { 192, 168, 0, 133 };
  uint8_t gwip[4] = { 192, 168, 0, 240};

  // Initialisation du serveur et du shield ethernet
  server.Init(mymac, myip, gwip);
}

void loop()
{
  // Ecoute du port 80 et traiter les requetes
  server.Listen();
}

Ajoutons quelques « pages » à notre serveur

Dans le setup() du sketch, ajoutons :

server.AddPage("uptime",&showUptime);

ainsi que la fonction showUptime(…);

void showUptime(char* arg1)
{
    long t = millis() / 1000;
    word h = t / 3600;
    byte m = (t / 60) % 60;
    byte s = t % 60;
    char outValue[20];
    sprintf(outValue,"%d%d:%d%d:%d%d",h/10, h%10, m/10, m%10, s/10, s%10);

    server.Print(outValue);
}

Cette fonction sera appelée automatiquement par la méthode Listen() quand l’url http://192.168.0.133/uptime sera demandée. On peut alors faire faire ce que l’on veut à cette fonction (par exemple afficher l’état des io, basculer une entrée). Je laisse votre imagination fleurir. Nous verrons bientôt comment interagir avec nos modules par des requêtes de type REST.

Vous aimerez aussi...

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *