Bonjour Bktero
,
avant tout, en ce qui concerne
PS : utilises-tu Firefox ? Essaye avec Chrome pour voir, il semble qu'il laisse passer ce genre de choses.
j'utilise Firefox. Je n'ai pas installé Chrome, mais j'ai essayé avec IE, puisqu'il est là et apparemment inamovible, et il n'y a pas de différence. Mais de toute manière, je veux que ça fonctionne avec n'importe quel navigateur et pas uniquement avec un plus permissif que les autres. De plus, je suis fidèle et depuis le temps que je fréquente Firefox, la séparation serait atroce
. ET puis bon! Je n'ai rien contre Google mais il faut bien que tout le monde vive.
Alors voilà le contexte:
Le couple Arduino/Shield Ethernet constitue le serveur. Je suis maitre de l'identité de ce serveur sur le réseau privé dans la mesure où je lui assigne, dans les déclarations et dans le "setup()", la clé MAC que je veux, bien qu'une valeur soit proposée avec le shield, et où je lui fixe moi-même une IP fixe en dehors de la plage DHCP de ma box, à savoir, ici entre 192.168.1.2 et 192.168.1.9 d'une part, et 192.168.1.151 et 192.168.1.255 d'autre part. J'ai fixé arbitrairement l'IP du serveur à 192.168.1.200 (et donné la valeur 0.0.0.0.0.0 à la clé MAC qui n'est pas utilisée). Ce serveur est connecté à mon réseau via un câble RJ45 relié à un adaptateur CPL. Je précise que le réseau est parfaitement standard et fonctionne parfaitement.
Le couple ordi/navigateur (ou tablette/navigateur), câblé ou wifi constitue le client. Le client est relié au réseau selon le même procédé que le serveur.
L'adresse IP de la box sur le réseau est 192.168.1.1 (non négociable).
Dans l'Arduino, j'entre un programme qui, en utilisant bien sûr la bibliothèque qui va bien, est chargé, lorsque le shield reçoit une requête html valide, de renvoyer au client une page au standard html, pour qu'il puisse l'afficher, à l'aide d'instructions "print()". Pour envoyer la requête, il suffit, coté client, de saisir l'adresse IP du serveur, ici 192.168.1.200, dans la barre d'adresse du navigateur, et de valider. Rien d'exotique, la procédure est tout à fait standard. La page s'affiche dans le navigateur et dépend, bien sûr du texte (puisqu'il s'agit de texte, en fait) que je lui ai envoyé. Si ce texte représente bien une page html, tout va bien, si c'est un poème de Victor Hugo, eh bien... il s'affichera quand même correctement exception faite des caractères non anglo-saxons, puisqu'on n'a pas fixé le "charset". La gestion du réseau par le shield est transparente et fonctionne très bien.
Jusque là, aucun problème. Si je demande le code de la page au navigateur, il me retourne exactement le texte que je lui ai fait parvenir avec mes instructions "print()", ce qui est satisfaisant et rassurant en soi
.
L'Arduino UNO, du moins l'ATmega328, ne disposant que de 2K de Sram, à moins de se contenter d'une page html affichant "Hello world!", ça risque de faire court. Je stocke donc mon texte en mémoire Flash à l'aide d'instructions "print(F())", car je dispose dans ce cas de ~32K théoriques de mémoire. Je dis théorique car une fois enlevée la mémoire occupée par le bootloader, celle occupée par les différentes librairies, et enfin celle prise par le programme utilisateur (à savoir mon œuvre d'art), on se sent déjà moins à l'aise.
Alors stocker la page dans un fichier externe? Pour une page statique, c'est sans nul doute la solution, restant à déterminer le meilleur endroit où la stocker: serveur (microSD du shield), client (disque dur de l'ordinateur client), box (périphérique USB) ou hébergement distant, cela dépend du cahier des charges et des possibilité offertes par l'infrastructure. Mais pour une page dynamique qui doit, entre autre, satisfaire à des requêtes ajax, ce n'est pas possible (du moins à ma connaissance). La page ne peut être stockée en dur puisqu'elle comporte des variables qui sont ré-actualisables en permanence. Donc, pour la partie html du sketch, il reste en mémoire flash et les variables qu'il utilise sont stockées, évidemment, en Sram, ce qui impose de revenir à l'instruction "print()" pour ce qui les concerne, la mémoire flash ne pouvant pas héberger de variables.
Je peux, par contre, parfaitement utiliser, en plus du code javascript/ajax inclus dans ma page html, du code javascript contenu dans des fichiers externes, et je n'ai d'ailleurs pas le choix en raison du manque de mémoire (flash + Sram).
Pour charger le fichier "code.js", s'il est dans le même dossier que le fichier html qui l'appelle, j'écrirai:
<script type="text/javascript" src="code.js"></script>
Dans tous les autres cas, pour un fichier "local" j'écrirai:
<script type="text/javascript" src="chemin/code.js"></script>
où chemin peut être un chemin relatif ou absolu, et pour un fichier distant, chez "hebergeur.fr", par exemple:
<script type="text/javascript" src="http://hebergeur.fr/chemin/code.js"></script>
Pour reprendre l'exemple évoqué en début de post, avec le fichier "toto.html", dont le seul but est de charger une image et de l'afficher, ce qui permet de visualiser directement le résultat, ces trois écritures fonctionnent parfaitement si j'exécute ce fichier directement depuis mon espace adressable local, y compris la Livebox. C'est à dire que, quelque soit le poste de mon réseau, y compris la Livebox, sur lequel j'ai copié mon fichier "toto.html", et quelque soit le poste, y compris la Livebox, sur lequel j'ai copié au préalable et où je vais chercher le fichier "image.png" (en adaptant bien sur les "src=..." en conséquence), la page s'affiche correctement. J'en conclus logiquement, du moins il me semble, que pour le navigateur, la Livebox, connue sur le réseau par son IP = 192.168.1.1, n'est pas considérée comme un site distant, pas plus que les autres postes, et que, par voie de conséquence, mon serveur 192.168.1.200 n'a aucune raison d'être considéré, lui non plus, comme un site distant.
Par contre, et c'est l'objet de ce post, si la page affichée fait suite à une requête client adressée au serveur, elle ne s'affiche correctement (c'est à dire que le fichier "image.png" n'est trouvé) que s'il se trouve hors de l'espace adressable local. Et je le répète, le code est strictement le même, ce qui est facile à vérifier en l'affichant depuis la page du navigateur.
Il faut souligner que mon raisonnement, s'il me parait logique, ne l'est pas forcément pour tout le monde et je me plante peut-être complètement, n'étant pas spécialiste réseau, n'étant spécialiste en rien, d'ailleurs
.
Je ne sais pas si j'ai été très clair ni si j'ai correctement répondu à tes interrogations, mais en tout cas, je te remercie pour ton intervention.
Cordialement, naute 
PS: J'ai aussi essayé
src="http://192.168.1.1/image/image.png"
et
src="ftp://192.168.1.1/image/image.png"
Partager