Site statique multi pages


Ce deuxième programme est capable d'afficher plusieurs pages web distinctes. Chacune de ces pages figure dans un fichier différent de la carte micro SD.

La différence avec le programme "Compteur de passages" est que maintenant, on va récupérer le nom de la page demandée pour afficher le bon contenu.

Le site est statique, c'est à dire que le serveur renverra le contenu du fichier HTML sélectionné sans aucune modification.

Pour téléverser ce programme sur la carte Arduino, il faut d'abord mettre dans un répertoire les 3 fichiers suivants :
Sur la carte SD, on mettra les fichiers :

Le programme Arduino

Tous les programmes Arduino décrits sur ce site fonctionnent selon le même principe.

On supposera que l'adresse MAC et l'adresse IP de la carte Ethernet ont été configurées conformément à ce qui est dit dans la page Généralités

La fonction setup () qui initialise le matériel, est la même que pour le compteur de passages.

Intéressons-nous à ce que fait la fonction loop ()



Tout d'abord, dans la partie déclaration des variables du programme, on trouve :
    // Nom du fichier à récupérer
    char url [14];
Cette variable url va mémoriser le nom du fichier demandé par le navigateur web.

Il s'agit d'un tableau de 14 caractères. Cette taille est liée aux noms des fichiers mémorisés par la carte micro SD.

En effet, le lecteur de carte micro SD implanté sur le module éthernet de la carte Arduino n'accepte que des noms de fichiers au format MS-DOS.

Ces noms de fichiers sont composés de :
Au total, ces noms de fichiers font 12 caractères au maximum. Il n'est pas nécessaire de créer de sous répertoire pour mettre ces fichiers HTML.

Par contre, le bon fonctionnement de la bibliothèque de fonctions trthtml nécessite de réserver 2 caractères de plus, soit un total de 14.

Lorsque la carte Arduino détecte une demande de page, le processus est le même que pour le programme "Compteur de passages", on va utiliser la fonction lire_trame_client (...) pour récupérer le message envoyé par le navigateur.

Toutefois, cette fois-ci, il est nécessaire de récupérer le nom de la page que le navigateur web a demandé. Pour cela, on va utiliser la fonction lire_trame_client (...) avec 3 paramètres :
    lire_trame_client (client, url, sizeof (url));
Les 3 paramètres de cette fonction sont les suivants :
Remarque : Pour le 3ème paramètre, on aurait pu aussi bien mettre 14, mais si on vient à changer la taille du tableau dans la déclaration de la variable url, il faudra aussi changer la valeur de ce paramètre.
L'utilisation de la fonction sizeof (...) évite ce genre de complication.

Normalement, on a récupéré de nom de la page demandée par le navigateur. Mais, il se peut qu'elle n'ait pas été indiquée, si par exemple on a tapé seulement l'adresse IP de la carte Arduino.

Dans ce cas, tous les services web ont une page par défaut qui a l'un des 3 noms suivants :
Pour notre serveur, le nom du fichier choisi est index.htm

On commence donc par vérifier que le navigateur web a demandé une page particulière, et ce ce n'est pas le cas, on prend la page par défaut :
    // si aucun nom de fichier ne figure dans l'url
    if (! url [1])
        // mettre le nom du fichier d'accueil
        strcpy (url, "index.htm");
Ensuite, on peut tenter d'accéder au fichier sélectionné. Et si ça ne marche pas, on essaiera avec la page d'erreur à la place :
    // tenter d'accéder à au fichier HTML
    descfic = SD.open (url, FILE_READ);

    // si on n'a pas réussi, tenter la page d'erreur
    if (! descfic)
        descfic = SD.open (F("/err404.htm"), FILE_READ);
Il reste à présent à envoyer le fichier HTML au navigateur. Comme précisé plus haut, les fichiers HTML de ce site n'ont pas besoin d'être modifiés. Dans ce cas, l'envoi du fichier HTML se fait en une instruction :
    copie_jusque_fin (descfic, client);
Les autres instructions de la fonction loop () ont déjà été expliquées en détail pour le programme "Compteur de passages".

Le navigateur a demandé et reçu 2 fichiers

Si on regarde le code source d'un fichier du site, par exemple index.htm :



On peut remarquer à la fin de l'entête de ce fichier la ligne :
    <link href="moncss.css" rel="stylesheet" type="text/css">
et le contenu de la page a la structure suivante :
    <div id="menu">
    </div>

    <div id="contenu">
    </div>
C'est le fichier moncss.css qui définit les 2 zones d'affichage et d'autres caractéristiques graphiques de la page.
Si on observe les échanges réseau entre le navigateur web et la carte Arduino, après avoir demandé le fichier index.htm (ou un autre), le navigateur web a demandé le fichier moncss.css et l'a reçu.

Cet envoi successif des 2 fichiers a fonctionné sans qu'il n'ait été nécessaire de rajouter quelque-chose dans le programme Arduino pour le ficher css.

Toutefois, si on met plusieurs fichiers css, (ce qui est courant dans un vrai site web), seule la demande du premier sera détectée et traitée par la carte Arduino.

La raison de cette limitation est probablement due au fait que le navigateur demande les autres fichiers css trop tôt et que le programme serveur sur Arduino n'est prévu pour traiter qu'une demande de fichier à la fois.