IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Problème de transaction entre un shield Ethernet 2 et une Livebox


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Par défaut Problème de transaction entre un shield Ethernet 2 et une Livebox
    Bonjour,

    il m'arrive un problème curieux.
    J'ai créé un mini serveur sur un couple UNO V3 / Shield Ethernet 2 qui a besoin d'aller chercher des fichiers à "l'extérieur", pour des raisons évidentes de manque de mémoire, afin de les utiliser lors d'une requête adressée par un navigateur quelconque (sur mon réseau, bien sûr).

    Pour que ces fichiers soient dispos depuis n'importe quel poste, il doivent être à des adresses accessibles quels que soient les postes ouverts ou éteints. Donc, soit chaque poste a un exemplaire des fichiers nécessaires, pas très élégant ni très évident avec les tablettes, soit ces fichiers doivent se trouver à une adresse toujours valide. Les deux solutions sont, à priori, soit l’hébergement sur un site externe, soit le stockage sur la box.

    Quand j'héberge sur un site externe, ça fonctionne parfaitement, et donc, mon problème semble résolu. Mais j'aimerai que cela fonctionne également sur un réseau ethernet indépendant de la liaison internet. Je préfèrerais donc privilégier le stockage sur la box.

    Je stocke donc mes fichiers sur une clé USB connectée à ma box et j'essaye de les récupérer. Et c'est là que le problème curieux se pose. Quand j'entre l'adresse IP que j'ai assignée à mon "serveur", la page se charge mais ne trouve pas les fichiers qui sont sur la box.

    Maintenant, je fais un clic droit sur la page dans le navigateur et je clique sur "Code source de la page", je sélectionne ce code et le sauvegarde sous "toto.html". Et là, quand je clique sur "toto.html", la page s'ouvre dans le navigateur et les fichiers sont chargés. Il faut bien comprendre que c'est exactement le même code.

    Je vous poste ici le code Arduino qui génère la page (une version simplifiée à l’extrême mais totalement opérationnelle. Pour l'exemple, les fichiers en question sont réduits à un simple fichier image. Habituellement, c'est plutôt du javascript, mais ça revient au même):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #include <SPI.h>
    #include <Ethernet2.h>
     
    byte mac[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    IPAddress ipLocal(192, 168, 1, 200);
    EthernetServer serveurHTTP(80);
     
    void setup()
    {
      Ethernet.begin(mac, ipLocal);
      delay(1000);
      serveurHTTP.begin();
    }
     
    void loop()
    {
      EthernetClient client = serveurHTTP.available();
      if (client)
      {
        String reception = "";
        if (client.connected())
        {
          while (client.available())
          {
            reception = reception + client.read();  //Vide le buffer pour ne charger la page qu'une fois
          }
          //Envoi de l'en-tête respectant le protocole HTTP
          client.println(F("HTTP/1.1 200 OK"));
          client.println(F("Content-Type: text/html"));
          client.println(F("Connnection: close"));
          client.println();
          //Envoi de la page html  
          client.println(F("<!DOCTYPE html>\n"));
          client.println(F("<html>\n"));
          client.println(F("  <head>"));
          client.println(F("    <meta charset=\"utf-8\" />"));
          client.println(F("    <title>Récupération d'une image sur clé USB dans la Livebox</title>"));
          client.println(F("  </head>\n"));
          client.println(F("  <body>"));
          client.println(F("    <p>La page est transmise correctement et est valide</p>"));
          client.println(F("    <img src=\"file://///Livebox/image/image.png\" alt=\"Mais l'image n'est pas téléchargée depuis la Livebox\" />"));
          client.println(F("  </body>\n"));
          client.println(F("</html>"));
          delay(1);
          client.stop();
        }
      }
    }
    Je précise que dans l'adresse du fichier "image.png", "Livebox" est le nom natif de la box et "image" est le nom de la clé USB.

    Je téléverse ce code dans l' Arduino puis j'entre "192.168.1.200" dans la barre d'adresse du navigateur.

    Voici la page qui s'affiche:

    Nom : Capture_1.PNG
Affichages : 818
Taille : 12,6 Ko

    Je clique à droite sur la page:

    Nom : Capture_2.PNG
Affichages : 858
Taille : 20,6 Ko

    pour afficher le code html de la page en cours:

    Nom : Capture_3.PNG
Affichages : 850
Taille : 37,9 Ko

    puis je sélectionne ce code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    <!DOCTYPE html>
     
    <html>
     
      <head>
        <meta charset="utf-8" />
        <title>Récupération d'une image sur clé USB dans la Livebox</title>
      </head>
     
      <body>
        <p>La page est transmise correctement et est valide</p>
        <img src="file://///Livebox/image/image.png" alt="Mais l'image n'est pas téléchargée depuis la Livebox" />
      </body>
     
    </html>
    que je sauvegarde sous "toto.html".

    Quand je lance "toto.html", j'obtiens la page suivante:

    Nom : Capture_4.PNG
Affichages : 826
Taille : 18,8 Ko

    Je ne comprend pas pourquoi le navigateur réagit différemment au même code en fonction de la façon dont il le reçoit.

    Quelqu'un aurait-il une idée? Moi, je nage!

    Désolé d'avoir été un peu long mais j'ai voulu essayer d'être clair.

    Cordialement, naute .

  2. #2
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    bonjour,


    Normal tu as enregistré la page sur ton disque dur et lorsque tu lances la page tu te connectes sur la box pas sur l'Arduino.
    Or avec l'arduino, ton navigateur ne se connecte pas sur la box mais vers ton Arduino (ton arduino est le serveur).

    Sinon en remplaçant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file://///Livebox/image/image.png
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://192.168.1.1/image/image.png
    ? Avec 192.168.1.1 l'adresse IP de la box.

  3. #3
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Par défaut
    Bonjour Auteur.

    Merci de partager mon angoisse .

    Alors, l'adresse de ma box est bien 192.168.1.1 mais j'ai déjà fais la manip. Je crois que j'ai essayé à peu près toutes les combinaisons possibles. J'ai même essayé en plaçant mon fichier "image.png" à la racine de C: et en écrivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client.println(F("<img src=\"c:/image.png\" />"));
    dans mon code Arduino, le fichier n'est pas trouvé. Par contre, en écrivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    client.println(F("<img src=\"http://monsite.fr/image.png\" />"));
    l'image s'affiche. On dirait que le protocole m'interdit l'accès à un fichier local.

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 197
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Citation Envoyé par naute Voir le message
    J'ai créé un mini serveur sur un couple UNO V3 / Shield Ethernet 2 qui a besoin d'aller chercher des fichiers à "l'extérieur", pour des raisons évidentes de manque de mémoire [...]
    Il y a un lecteur de carte micro-SD sur ce shield, pourquoi ne pas stocker les pages html et les images sur la carte SD ?

    There is an onboard micro-SD card slot, which can be used to store files for serving over the network.

  5. #5
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Par défaut
    Bonjour f-leb,

    j'étais en train de répondre à Auteur quand ton message est arrivé.

    Citation Envoyé par f-leb Voir le message
    Bonjour,
    Il y a un lecteur de carte micro-SD sur ce shield, pourquoi ne pas stocker les pages html et les images sur la carte SD ?
    Oui, ça ne m'avais pas échappé, mais ça fait une librairie et du code en plus, et je vais être limite. Ce sera malgré tout, peut-être, la seule solution. J'aimerais quand même bien résoudre le problème que j'ai posté, ne serait-ce que pour le sport .

    Merci de ton intérêt.

  6. #6
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 660
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 660
    Par défaut
    Je suis d'accord avec f-leb, tu devrais mettre ton image et tes pages web sur la carte SD de l'Arduino, c'est fait pour ça. Si pour une raison ou une autre tu dois déplacer ton Arduino (le brancher sur une autre box) ton système actuel ne fonctionnera plus car tu devras aussi déplacer ta clef usb. Si, au contraire, tu mets l'essentiel des fichiers (images, html) sur une carte SD, ton serveur Arduino ne sera plus dépendant de ta box. Et en plus, tu n'auras pas à générer le code de ton fichier html dans le code C++ Arduino.

  7. #7
    Rédacteur

    Avatar de naute
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2009
    Messages
    708
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2009
    Messages : 708
    Par défaut


    Et moi je suis d'accord avec vous deux, du moins dans le cas de pages statiques, mais mes pages sont essentiellement dynamiques, générées en javascript/ajax et donc n'existent pas réellement en tant que fichiers. Et c'est peut-être d'ailleurs de là que vient le problème. Il n'y aura aucune image réelle sur la clé USB (ou autre), mais du code javascript dessinant dans un "canvas" les éléments se mon interface, et je butte justement sur le chargement de ces fichiers dans mes pages html (sauf s'ils se trouvent sur un serveur externe ).

    Mon exemple n'était effectivement pas explicite à ce sujet, mais il n'était là que pour mettre en évidence ce qui se passe. Je réalise en réalité (enfin, je n'en suis pour l'instant qu'au prototypage, mais ça avance) un petit système de contrôle d'un certain nombre de "paramètres domestiques" gérant des actionneurs et des capteurs, dont l'interface de commande sera affichable par le navigateur de n'importe quel ordi ou tablette connectée à mon réseau (famille ou copains). C'est pourquoi je parle de réseau indépendant, la connexion internet ne devenant obligatoire que si je stocke les fichiers sur un serveur externe, ce qui me rend, justement, dépendant de cette connexion et de l'hebergement. Mon système est, par essence, lié à mon domicile et donc à ma box, et n'a à être ni déplaçable en soi, ni accessible de l'extérieur. Mon but n'est pas de "surveiller" ma maison de l'extérieur, mais de la rendre plus "conviviale" de l'intérieur, si c'est jouable.

    En tout cas, ces considérations mises à part, je suis sûr que c'est possible de rapatrier ces fichiers depuis la box, mais je ne sais pas comment.

    Amicalement, naute

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    A mon avis, la vraie question a se poser est "comment est résolu l'adresse vers l'image ?".

    Je n'ai pas exactement compris ce qui marche est ce qui marche pas, mais visiblement
    • Ça fonctionne sur l'Arduino quand tu mets l'IP de la box ou quand tu mets l'adresse d'un site web externe.
    • Ça ne fonctionne pas sur l'Arduino quand tu mets un chemin vers un fichier.
    • Ça fonctionne toujours sur ton PC.

    Est-ce correct ? J'ai un doute pour l'IP de la box.

    Quand on est sur ton PC, le serveur et le client sont le même ordinateur et on peut imaginer que les accès sont plus simples. Par exemple, cette discussion de stackoverflow (http://stackoverflow.com/questions/4...-localfile-jpg) semble dire qu'un site ne peut pas accéder au file system du client et donc qu'on ne peut pas avoir une page avec comme adresse de l'image C:/dossier/image.png. Quand l'Arduino est serveur et que ton PC est client, tu tombes donc dans le cas décrit dans la discussion. Sauf que file://///Livebox/image/image.png, c'est aussi un accès au système de fichiers du client et je pense que c'est pour ça que ça ne fonctionne pas.

    En lisant quelques autres trucs sur Internet, tu semble bien tomber sur une sécurité des navigateurs qui empêchent un site distant d'accéder à tes fichiers
    Exemple ici : http://blog.chromium.org/2008/12/sec...web-pages.html
    For example, if you click a hyperlink to a local file, Safari won't render the local web page.
    La seule solution simple est de passer par l'adresse IP du serveur sur le réseau local. ll faut juste que cette adresse soit facilement configurable par l'utilisateur.

    PS : utilises-tu Firefox ? Essaye avec Chrome pour voir, il semble qu'il laisse passer ce genre de choses.

Discussions similaires

  1. probléme accés a distance a un appareil branché sur une Livebox v3
    Par osramini dans le forum Dépannage et Assistance
    Réponses: 6
    Dernier message: 04/10/2015, 18h21
  2. Encore un petit problème de transaction
    Par devdev dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 24/03/2005, 16h13
  3. Réponses: 2
    Dernier message: 21/10/2004, 15h08
  4. Problèmes de compatibilité entre sdk 9.0c et geforce 2/4
    Par Francky033 dans le forum DirectX
    Réponses: 2
    Dernier message: 01/10/2004, 14h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo