Partage
  • Partager sur Facebook
  • Partager sur Twitter

IP public ethernet shield arduino

Arduino

    11 février 2014 à 7:29:01

    Bonjour,

    Je viens de finir mon projet de domotique, enfin presque car il ne me reste plus qu'a le test sur le réseau 3G mais pour se faire il me faut l'ip public de mon ethernet shield. Comment faire pour connaitre l'ip public de la carte ?

    Thibaut.

    • Partager sur Facebook
    • Partager sur Twitter
      12 février 2014 à 7:48:52

      Merci, mais sa me donne l'IP local du shield et sa je l'ais déjà, moi je veut l'IP public.

      Thibaut

      • Partager sur Facebook
      • Partager sur Twitter
        12 février 2014 à 9:51:17

        Tu ne peux la connaitre qu'en allant sur un serveur en ligne qui te la donnera.

        Exemple : http://www.mon-ip.com/

        Si tu as un petit site WEB, tu peux te faire une page PHP qui contient :

        <?php
        $ip = $_SERVER['REMOTE_ADDR'];
        header('Content-type:text/plain');
        header('Content-Length: ' . strlen($ip));
        echo $ip;
        ?>

        Note : on trouve de petits hébergeur gratuit qui conviendront parfaitement.

        Pour que tu puisses faire tes tests au plus vite, je te mets ce script sur mon site pendant quelques jours : http://lorrio.fr/ip.php

        Si tu n'as pas de lib pour faire des requêtes HTTP, c'est très simple, il faut de connecter sur lorrio.fr (IP fixe: 91.121.136.171), port 80 et envoyer le texte suivant : GET /ip.php HTTP/1.1\r\nHost: lorrio.fr\r\n\r\n

        Note : les parties rouges sont à adapter à l'URL de ton site.

        Tu recevras ensuite :

        HTTP/1.1 200 OK
        Date: Wed, 12 Feb 2014 09:09:33 GMT
        Server: Apache
        X-Powered-By: PHP/5.4.4-14+deb7u5
        Content-Length: 14
        Vary: Accept-Encoding
        Content-Type: text/plain
        
        91.121.136.171

         Il te suffit d'analyser la réponse ligne par ligne et ne garder que la dernière ;)

        -
        Edité par lorrio 12 février 2014 à 10:15:23

        • Partager sur Facebook
        • Partager sur Twitter
          12 février 2014 à 10:04:44

          Et une fois que tu as ton IP public, il te faudra parametrer ta box pour rediriger un certain trafic (pour un certain port) pour que ca aille vers ton arduino

          • Partager sur Facebook
          • Partager sur Twitter

          Retrouvez moi sur mon blog et ma chaine Youtube !

            12 février 2014 à 10:33:34

            luxe38 a écrit:

            Je viens de finir mon projet de domotique, enfin presque car il ne me reste plus qu'a le test sur le réseau 3G mais pour se faire il me faut l'ip public de mon ethernet shield. Comment faire pour connaitre l'ip public de la carte ?

            Je tiens quand même à préciser qu'il est impossible de faire du port forwarding sur un réseau 3G car l'IP public n'appartient pas réellement au device qui l'utilise.

            -
            Edité par lorrio 12 février 2014 à 10:34:20

            • Partager sur Facebook
            • Partager sur Twitter
              12 février 2014 à 10:38:42

              Et BAM une fois de plus ca m'apprendra à relire les besoins de l'auteur avant de poster :D

              Mais du coup j'ai une question : Comment est fait le lien "réseau 3G" -> "Arduino" ?

              • Partager sur Facebook
              • Partager sur Twitter

              Retrouvez moi sur mon blog et ma chaine Youtube !

                12 février 2014 à 10:42:03

                Eskimon a écrit:

                Et BAM une fois de plus ca m'apprendra à relire les besoins de l'auteur avant de poster :D

                Mais du coup j'ai une question : Comment est fait le lien "réseau 3G" -> "Arduino" ?


                C'est bien la question que je me pose.

                @luxe38 : faut donner des détails parce qu'on ne peut pas deviner ton architecture réseau...

                Ton shield est relié à un module 3G ? Tu connecte ton shield à ta box/routeur et ensuite tu veux accéder au shield via ton téléphone portable ?

                Enfin bref faut détailler, parce que "Ca me donne l'IP locale que j'ai déjà, je veux l'ip publique" on va pas aller très loin.

                Expliquer correctement son problème c'est déjà gagner beaucoup de temps dans sa résolution.

                • Partager sur Facebook
                • Partager sur Twitter
                  12 février 2014 à 11:28:13

                  Eskimon a écrit:

                  Mais du coup j'ai une question : Comment est fait le lien "réseau 3G" -> "Arduino" ?

                  Dans le cas de la 3G, il n'y a surement pas d'autre alternative que de passer par un pont ;)

                  En quelque sorte, l'arduino ET l'autre module se connect sur le même serveur (cela peut être un serveur dédié ou tout simplement une BOX avec un port d'ouvert) et c'est ce serveur qui se charge de faire le lien entre les deux.

                  On peut comparer ça à un chat en ligne : l'arduino et l'autre module sont tous les deux des clients qui communiquent entre eux grâce à un serveur annexe.

                  =====

                  @luxe38 : si c'est ce genre de pont que tu veux faire, je peux en établir un sur mon serveur dédié pendant quelques jours afin de te dépanner le temps que tu te trouve ton propre petit serveur dédié (ou que tu décides de laisser un PC allumé 24H/24 à coté de ta BOX).

                  -
                  Edité par lorrio 12 février 2014 à 11:31:09

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 février 2014 à 8:44:14

                    Bonjour,

                    L’Ethernet shield est directement connecter à ma box internet, pour commander ma carte je saisi : http://iplocal:port/commande/parametre1/parametre2 et donc de cette manière je ne peux contrôler la carte que de chez moi vu que je n'ai que l’IP local. Moi je veux l’IP public de mon shield pour pouvoir le contrôler de n'importe où.

                    Thibaut.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      14 février 2014 à 8:53:59

                      Si ton shield est connecté à ta box, il n'a pas d'IP public.

                      Tous les PC connecté à ta BOX ont la même IP public : celle de la BOX.

                      Pour la connaitre, c'est très simple, il te suffit d'ouvrir http://www.mon-ip.com/ à l'aide d'un PC connecté sur ta BOX.

                      Une fois que tu connais l'IP de ta BOX, ce n'est pas tout à fait terminer car il faut maintenant la paramétrer pour le port forwarding.

                      En quelque sorte, il faut lui dire : "si tu reçois une connexion sur ton port 80, alors tu la redirige sur le port 80 de l'IP locale 169.192.1.12" (en supposant bien sure que tu utilises le port 80 et que ton arduino ai une IP locale 169.192.1.12).

                      Cette opération s'appelle "ouvrir les ports d'une BOX" et dépend de la BOX utilisée.

                      Je te laisse le soin de faire une petite recherche google de "ouvrir port freebox" ou "ouvrir port numéricable" ou "ouvrir port sfr box" ...

                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 février 2014 à 9:31:08

                        Merci, pour la réponse j'ai déjà ouvert les ports de ma neufbox : http://www.hostingpics.net/viewer.php?id=89335855145156.png

                        En port externe et port de destination j’ai mis la même chose et j’ai mis l’IP local de mon Ethernet shield, le tous en TCP et un autre en UDP.

                        Thibaut.

                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 février 2014 à 10:00:19

                          Eh bien il ne te manque plus qu'a te connecter sur l'IP externe de ta box, ou est le problème ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            14 février 2014 à 10:30:36

                            C'est ce que je fait mais chrome me dit qu'il ne peut pas accéder a la page.

                            Thibaut

                            • Partager sur Facebook
                            • Partager sur Twitter
                              14 février 2014 à 11:45:14

                              Quelle est l'url que tu rentres dans chrome ? Juste l'adresse IP ou tu spécifie bien le port (http://aaa.bbb.ccc.ddd:1234) ?

                              D'autre part, si tu passe par un navigateur cela veut dire que tu passe par le protocole HTTP, il te faut donc un serveur http en face pour afficher une page.

                              Un ping ne servira pas puisqu'il n'y a pas de notion de port au niveau de la couche ICMP. Il y a peut-être des outils simple qui travaille à plus haut niveau, mais je n'en ai pas connaissance.

                              • Partager sur Facebook
                              • Partager sur Twitter
                                14 février 2014 à 12:13:53

                                L’URL que je saisie est la suivante : http://ip:port/lacommande/parametre1/parametre2 .

                                Quand je mets l’IP local sa fonctionne mais quand je mets l’IP de ma box ça ne fonctionne pas.

                                Depuis le début je passe par chrome même avec l’IP local.

                                Thibaut.

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  14 février 2014 à 13:06:39

                                  Le voici : 

                                  #include <SPI.h>
                                  #include <Ethernet.h>
                                  #include <string.h>
                                  
                                  // MAC address can be anything that is unique within your network.
                                  // IP is the address the Arduino Ethernet Card would respond to.  It needs to be an unused address within your network.
                                  byte mac[] = {0x00, 0x1E, 0x2A, 0x77, 0x24, 0x02 };
                                  byte ip[] = {192,168,1,10 }; // This is typically 10.0.0.x
                                  
                                  EthernetServer server(1234); // Port 80 is http.EthernetClient client = server.available();
                                  
                                  //-- Commands and parameters (sent by browser) --
                                  char cmd[15];    // Nothing magical about 15, increase these if you need longer commands/parameters
                                  char param1[15];
                                  char param2[15];
                                  
                                  //-- Sample Ports ---
                                  void SetupSamplePorts()
                                  {
                                    // To illustrate how to use this, I have an LED and a Potentiometer.
                                    // The 10K potentiometer left lead is connected to GND, right lead to +5V, and middle lead to Analog 0.
                                    // The LED cathode is on digital pin 7 and anode is on pin 8.
                                    pinMode(7,OUTPUT); digitalWrite(7,LOW);  // I use this pin as GND for the LED.
                                    pinMode(8,OUTPUT); // Sample output, unable to use built-in LED at pin 13 because Ethernet Shield uses pins 10,11,12,13.
                                  }
                                  
                                  void setup()
                                  {
                                    Ethernet.begin(mac, ip);
                                    server.begin();
                                  
                                    Serial.begin(57600);
                                    SetupSamplePorts();
                                  }
                                  
                                  #define bufferMax 128
                                  int bufferSize;
                                  char buffer[bufferMax];
                                  
                                  void loop()
                                  {
                                    EthernetClient client = server.available();
                                    if (client)
                                    {
                                      WaitForRequest(client);
                                      ParseReceivedRequest();
                                      PerformRequestedCommands();
                                      
                                      client.stop();
                                    }
                                  }
                                  
                                  void WaitForRequest(EthernetClient client) // Sets buffer[] and bufferSize
                                  {
                                    bufferSize = 0;
                                   
                                    while (client.connected()) {
                                      if (client.available()) {
                                        char c = client.read();
                                        if (c == '\n')
                                          break;
                                        else
                                          if (bufferSize < bufferMax)
                                            buffer[bufferSize++] = c;
                                          else
                                            break;
                                      }
                                    }
                                    
                                    PrintNumber("bufferSize", bufferSize);
                                  }
                                  
                                  void ParseReceivedRequest()
                                  {
                                    Serial.println("in ParseReceivedRequest");
                                    Serial.println(buffer);
                                    
                                    //Received buffer contains "GET /cmd/param1/param2 HTTP/1.1".  Break it up.
                                    char* slash1;
                                    char* slash2;
                                    char* slash3;
                                    char* space2;
                                    
                                    slash1 = strstr(buffer, "/") + 1; // Look for first slash
                                    slash2 = strstr(slash1, "/") + 1; // second slash
                                    slash3 = strstr(slash2, "/") + 1; // third slash
                                    space2 = strstr(slash2, " ") + 1; // space after second slash (in case there is no third slash)
                                    if (slash3 > space2) slash3=slash2;
                                  
                                    PrintString("slash1",slash1);
                                    PrintString("slash2",slash2);
                                    PrintString("slash3",slash3);
                                    PrintString("space2",space2);
                                    
                                    // strncpy does not automatically add terminating zero, but strncat does! So start with blank string and concatenate.
                                    cmd[0] = 0;
                                    param1[0] = 0;
                                    param2[0] = 0;
                                    strncat(cmd, slash1, slash2-slash1-1);
                                    strncat(param1, slash2, slash3-slash2-1);
                                    strncat(param2, slash3, space2-slash3-1);
                                    
                                    PrintString("cmd",cmd);
                                    PrintString("param1",param1);
                                    PrintString("param2",param2);
                                  }
                                  
                                  void PerformRequestedCommands()
                                  {
                                    if ( strcmp(cmd,"digitalWrite") == 0 ) RemoteDigitalWrite();
                                    if ( strcmp(cmd,"analogRead") == 0 ) RemoteAnalogRead();
                                  }
                                  
                                  void RemoteDigitalWrite()
                                  {
                                    int ledPin = param1[0] - '0'; // Param1 should be one digit port
                                    int ledState = param2[0] - '0'; // Param2 should be either 1 or 0
                                    digitalWrite(ledPin, ledState);
                                   
                                    //-- Send response back to browser --
                                    server.print("D");
                                    server.print(ledPin, DEC);
                                    server.print(" is ");
                                    server.print( (ledState==1) ? "ON" : "off" );
                                  
                                    //-- Send debug message to serial port --
                                    Serial.println("RemoteDigitalWrite");
                                    PrintNumber("ledPin", ledPin);
                                    PrintNumber("ledState", ledState);
                                  }
                                  
                                  void RemoteAnalogRead()
                                  {
                                    // If desired, use more server.print() to send http header instead of just sending the analog value.
                                    int analogPin = param1[0] - '0'; // Param1 should be one digit analog port
                                    int analogValue = analogRead(analogPin);
                                    
                                    //-- Send response back to browser --
                                    server.print("A");
                                    server.print(analogPin, DEC);
                                    server.print(" is ");
                                    server.print(analogValue,DEC);
                                    
                                    //-- Send debug message to serial port --
                                    Serial.println("RemoteAnalogRead");
                                    PrintNumber("analogPin", analogPin);
                                    PrintNumber("analogValue", analogValue);
                                  }
                                  
                                  void PrintString(char* label, char* str)
                                  {
                                    Serial.print(label);
                                    Serial.print("=");
                                    Serial.println(str);
                                  }
                                  
                                  void PrintNumber(char* label, int number)
                                  {
                                    Serial.print(label);
                                    Serial.print("=");
                                    Serial.println(number, DEC);
                                  }



                                  -
                                  Edité par luxe38 14 février 2014 à 13:09:55

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    14 février 2014 à 13:22:01

                                    Et pour tester ca tu passes par un ordi sur un réseau exterieur au tiens ou tu test depuis chez toi ? Dans le cas où tu test depuis chez toi il faut pas feinter en éditant le fichier hosts ou un truc du genre ?

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Retrouvez moi sur mon blog et ma chaine Youtube !

                                      14 février 2014 à 13:34:04

                                      J'ai l'impression que tu n'as pas beaucoup de connaissances en réseau.

                                      Si tu tape ton adresse publique + port depuis un PC qui est branché sur ta box, si le routage du port est bidirectionnel vers ton Arduino, dans ce cas ton PC ne sera pas autorisé à envoyé des données depuis ton adresse publique à partir du port en question.

                                      Si tu veux tester ton adresse publique et le port routé, il faut passer par un ordinateur indépendant de ce morceau de réseau (celui du switch de ta box), ou alors utiliser l'adresse locale puisque dans ce cas il n'y a pas de problème de routage des ports.

                                      C'est le principe du NAT, on a 1 adresse "publique" qui sert pour plusieurs équipements, mais l'extérieur (le "public") lui ne voit qu'un seul équipement. Le routage des ports permet de spécifier des chemins pour des équipements en particulier, au détriment des autres. Depuis l'extérieur tu pourras accéder à un équipement en particulier grâce à port routé, mais dans le réseau local, tout les équipements pourront accéder aux autres.

                                      Tout ca pour dire que le comportement, d'après ce que tu dis, me paraît normal.

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        14 février 2014 à 13:52:49

                                        D'où l'edit du fichier host, qui permettera de reboucler l'adresse public manuellement entrée vers le réseau interne

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Retrouvez moi sur mon blog et ma chaine Youtube !

                                          14 février 2014 à 14:02:57

                                          Je viens de faire un peu plus de test et je suis en train de perdre la boule.

                                          Sur mon smartphone Android et en 3G, quand je saisie mon URL de commande avec l’IP public directement dans la barre d’adresse sa fonctionne, mais quand toujours avec l’IP public je tente d’accéder à la commande mais via une page html ça ne fonctionne pas. Et le pire c’est que le peut qui fonctionne c’est en 3G dès que je passe en wifi chez moi et toujours avec l’IP public plus rien ne fonctionne.

                                          Si sa vous intéresse voici le code HTML : 

                                          <!DOCTYPE html>
                                          <html>
                                              <head>
                                                  <meta charset="utf-8" />
                                                  <meta name="viewport" content="width=device-width, initial-scale=0.4, maximum-scale=0.4" />
                                                  <title>Test</title>
                                              </head>
                                           
                                              <body>
                                          
                                          	<a href="http://ippublic:port/digitalWrite/9/1" target="_blank">on</a>     
                                          	<a href="http://ippublic:port/digitalWrite/9/0" target="_blank">off</a>  	
                                          
                                          
                                          	</body>
                                          </html>

                                          Thibaut.

                                          -
                                          Edité par luxe38 14 février 2014 à 14:07:58

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            14 février 2014 à 14:15:50

                                            En 3G tu es sur le réseau de ton opérateur, donc du côté "public". Si tu passe en Wifi, tu passe sur ta box et en réseau local, CQFD.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              14 février 2014 à 14:15:55

                                              en wifi chez toi on vient de t'expliquer pourquoi ca ne marche pas... En 3G via un lien ca devrait fonctionner de la même facon que via la barre d'adresse, c'est curieux

                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Retrouvez moi sur mon blog et ma chaine Youtube !

                                                14 février 2014 à 14:30:42

                                                Donc si je récapitule en 3G j'utilise l’IP public et en wifi j'utilise l’IP local. J’ai réessayer mais via la page html ça ne fonctionne pas.

                                                Thibaut.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  14 février 2014 à 16:15:07

                                                  C’est bon mon system de domotique tourne à merveille, je remercie toutes les personne qui mon aidez a fini mon projet.

                                                  Thibaut.

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  IP public ethernet shield arduino

                                                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                  • Editeur
                                                  • Markdown