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 ?
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.
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
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.
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).
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ù.
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" ...
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.
#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);
}
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 ?
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.
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.
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
C’est bon mon system de domotique tourne à merveille, je remercie toutes les personne qui mon aidez a fini mon projet.
Thibaut.
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.
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !
Retrouvez moi sur mon blog et ma chaine Youtube !