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 :
- Un nom de 1 à 8 caractères,
- le symbole .
- une extension de 1 à 3 caractères.
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 :
- Identifiant du client web.
- Nom de la variable qui contiendra le nom du fichier à envoyer au
navigateur
- Taille de la variable précédente.
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 :
- index.html
- index.htm
- index.php
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">
Contenu du menu qui apparaît sur un colonne à gauche.
</div>
<div id="contenu">
Contenu principal de la page qui occupe le reste de la largeur de
la fenêtre du navigateur.
</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.