Shield Arduino Ethernet « new IDE » : Connexion impossible avec IP Publique

Shield Arduino Ethernet « new IDE » : Connexion impossible avec IP Publique
Bonjour,
Peut-être pourrez-vous me conseiller : Après plusieurs jours de recherche je n’arrive pas à trouver la solution pour me connecter de l’extérieur, avec mon adresse publique fixe Free, malgré la redirection de port, alors que tout se passe normalement en local.

OS : Windows XP SP3
IDE Arduino 1.7.8
Arduino UNO R3 (Officiel)
Shield Arduino Ethernet “newIDE” ->Implique les bibliothèques :
#include <Ethernet2.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp2.h>
Code compilé joint : Tutorial « WebServer » du site Arduino (Avec quelques ajouts de variables)
Box : FreeBox Révolution (Firmware à jour).
Je possède plusieurs caméras de surveillance un NAS Synology et 3 serveurs Web IPX-800 de GCE, pour lesquels j’ai fait les redirections de ports. Tout fonctionne parfaitement en local et de l’extérieur avec mon IP Fixe Free.
Redirection effectuée pour le Shield Ethernet Arduino New IDE :
IPAddress ip(192, 168, 0, 100);
EthernetServer server(700);
« Port redirigé sur la FreeBox » :
700 - 192.168.0.100 – 700
80 - 192.168.0.100 - 80

UNO + nouveau Shield Ethernet Arduino “ NewIDE” (officiels) + Code « WebServer » :
En local : J’accède parfaitement au serveur Arduino avec mon IPAD AIR ou mon iPhone :
Sur navigateur Google : 192.168.0.100:700 j’obtiens sans problème une page HTML avec les valeurs des 6 entrées analogiques de la UNO. Le shield reconnaît donc le port 700… J’obtiens le même résultat avec 192.168.0.100:80

Par contre si je souhaite me connecter de l’extérieur avec mon adresse publique comme je le fais avec mes webServeurs IPX800-V3, impossible alors que le port 700 est bien redirigé !

Dans le navigateur : « XX.XXX.XXX.XX :700 » //Adresse publique fixe
Réponse : Page Web inaccessible
ERR_CONNECTION_REFUSED

J’ai réalisé plusieurs codes Arduino avec des capteurs DHT22, BMP180, Tiny I2C RTC, Servo SG90 LCD 4x20, relais pompes et SEN0114 avec lecture « Serial »et LCD en local, mais jamais à distance.

J’ai certainement oublié quelque chose dans le code, car c’est la première fois que j’utilise un Shield Ethernet… Peut-être pouvez-vous m’aider ?
Cordialement.

[#include <SPI.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet2.h> //Carte shield Ethernet "new IDE" + Arduino UNO R3 (Arduino officiel))
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp2.h>
#include <util.h>

/*
  Web Server

 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield.

 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)

 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 modified 02 Sept 2015
 by Arturo Guadalupi

 */

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
};
IPAddress ip(192, 168, 0, 100);

// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(700);
int valueMap;
void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            valueMap=map(sensorReading,0,1023,0,5);         
            client.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.println(sensorReading);
            client.print("Tension : ");
            client.println(valueMap);
            client.print(" Volts");
            
            client.println("
");
            
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}/code]

bonjour,
tu essaye de ton pc pour arriver sur l'ip publique ou via un autre pc extérieur ou via un téléphone?

Maxkcirtap:
Peut-être pourrez-vous me conseiller : Après plusieurs jours de recherche je n’arrive pas à trouver la solution pour me connecter de l’extérieur, avec mon adresse publique fixe Free, malgré la redirection de port, alors que tout se passe normalement en local.

bonjour
tu test avec ton adresse IP FREE de ton acces FREE ?
si oui c'est peut etre un probleme de loopback (c'est le cas avec ORANGE)
tu a fais un test d'accés a partir d'un autre acces internet ?

Artouste:
tu test avec ton adresse IP FREE de ton acces FREE ?
si oui c'est peut etre un probleme de loopback (c'est le cas avec ORANGE)

avec FREE ça fonctionne : on peux atteindre en local un hote avec son adresse publique

@Artoust && @infobarquee : Merci à tous pour vos réponses.

Comme le dit justement @rjnc38, le forwarding sur les FreeBox permet d'utiliser l'adresse publique en local et ça fonctionne très bien avec mes caméras et mes serveurs iIPX-800.

Je n'ai donc pas fait le test à partir d'un PC à l'extérieur, mais je vais essayer à tout hasard...

Pour résoudre ce problème, étant débutant Arduino, je pensais plutôt à une erreur de code de ma part
ou à un problème lié à la nouvelle bibliothèque <ethernet2.h>, qui remplace <ethernet.h> pour le nouveau shield newIDE. Bien que le site Arduino précise que les codes utilisés avec la librairie ethernet.h restent compatibles...

Quelqu'un a-t-il utilisé ce nouveau shield ?

Merci pour vos conseils, car je voudrais fusionner tous les programme avec les différentss capteurs et pouvoir les visualiser de l'extérieur.

Suite à mon poste précédent, je confirmer que mon Shield Arduino n'est pas accessible de l'extérieur à partir d'un autre PC.

Ooups ! Quelqu'un a-t-il une solution à mon problème ?
Cdlt.

Salut,

je laisserais le port 80 (par defaut) sur le shield Eternet, par contre pour accéder depuis l'extérieur je ferais un essai avec cette config :

IP_Public_FB:700 ->Free_Boox avec une redirection du port 700 vers 80 de l'IP 192.168.1.100.

@+

Merci @hameau,
Je viens de réessayer la redirection du port 700 vers le port 80 sur la FreeBox, mais en me connectant à : mon_ip-publique:700, j'obtiens toujours le même message d'erreur :
Page Web inaccessible - ERR_CONNECTION_REFUSED

Dans ce message, la question est de savoir par qui est refusée la connexion : la box ou le Shield Ethernet ? Car le message n'est pas ERR_CONNECTION_TIME_OUT, mais bien REFUSED...

Photo : Redirection des ports sur la FreeBox

tu n'as pas dit si ça fonctionne par l'IP locale ? ça prouverait un pb de box
je crois que le port 700 est réservé essayes par ex le port 7070

@rjnc38: Oui cela fonctionne en local, je l'avais précisé dans mon premier post.
Je viens de changer le port en 7070, même message d'erreur.

Résumé des divers tests en IP locale :
Code Arduino : EthernetServer(700)
Connexion Navigateur : 192.168.0.100:700 Page html ok

Code Arduino : EthernetServer(7070)
Connexion navigateur : 192.168.0.100:7070 Page html ok

Code Arduino : Ethernet(80)
Connexion navigateur : 192.168.0.100:80 Page html ok

j'ai également essayé d'attribuer des ports qui fonctionnent de l'extérieur avec mon adresse publique pour mes caméras. Même message d'erreur.

La FreeBox ne semble pas être en cause, car je peux appeler mes serveurs IPX-800, mon Syno et mes CAMs avec mon adresse publique et cela fonctionne normalement.

Je pense plutôt à une ligne de code Arduino ajouter ou un problème particulier lié à la nouvelle librairie ethernet2, et là ce n'est plus de mon niveau...

Photos : page html en local et message d'erreur avec adresse publique.

essaye de faire une config IP complète avec : Ethernet.begin(mac, IPlocal, gateway, gateway , subnet);
tu peux aussi essayer l'exemple ethernet webclient pour voir s'il peut sortir ...

Maxkcirtap:
@rjnc38: Oui cela fonctionne en local, je l'avais précisé dans mon premier post.
Je viens de changer le port en 7070, même message d'erreur.
Code Arduino : EthernetServer(7070)
Connexion navigateur : 192.168.0.100:7070 Page html ok

en fait c'est le port externe qu'il faut changer, tu peux laisser l'arduino sur le port 80
car je pense que c'est la box qui te retourne le message

  • Ethernet.begin complète ne change rien,
  • Port 80 ou 7070 sur Arduino ne change rien (Sauf avec l'IP locale ou ça fonctionne pour les 2 ports),
  • L'exemple WebClient fonctionne. Le terminal série confirme la connexion à Google.

J'ai essayé tous les exemples WebServer Arduino en modifiant les IP, DNS, gateway et port, rien n'y fait j'ai toujours la même erreur.

C'est insoluble !

Le problème n'est pas résolu, mais vient d'ailleurs...
Abandonnant provisoirement le problème Ethernet newIDE, j'ai chargé mon programme qui gère 5 capteurs sur une Mega 2560, afin de modifier une variable d'humidité. Mais impossible de compiler le programme.
Les erreurs provenaient de la librairie LiquidCrystal_I2C, alors que tout fonctionnait avant.

J'ai donc réinstallé la librairie, ce qui a généré une dizaine de librairies LiquidCrystal avec des noms divers ! C'est là que j'ai compris que la version de l'IDE 1.7.8 que j'avais installée, seule compatible avec le nouveau Shield "newIDE" et acheté sur le NET dans un magasin très connu, était en cause.

J'ai désinstallé la 1.7.8 et réinstallé la 1.6.7 que j'avais précédemment et tout est rentré dans l'ordre pour le programme de la MEGA'

J'ai alors testé le programme WebServer et il m'est désormais impossible de me connecter, en local, avec les librairie Ethernet.h, EthernetClient.h et EthernetServer.h., ce que n'arrivait à faire avant.

C'est donc bien un problème lié à l'IDE 1.7.8, certainement encore non stable, et je n'ai plus qu'à mettre le Shield Ethernet newIDE dans un placard !

Je vais acheter l'ancien Shield pour voir si enfin je peux enfin me connecter avec mon adresse publique...

En tout cas, merci à tous de votre aide !
Maxkcirtap

Maxkcirtap:
J'ai désinstallé la 1.7.8 et réinstallé la 1.6.7 que j'avais précédemment et tout est rentré dans l'ordre pour le programme de la MEGA'
J'ai alors testé le programme WebServer et il m'est désormais impossible de me connecter, en local, avec les librairie Ethernet.h, EthernetClient.h et EthernetServer.h., ce que n'arrivait à faire avant.
C'est donc bien un problème lié à l'IDE 1.7.8, certainement encore non stable, et je n'ai plus qu'à mettre le Shield Ethernet newIDE dans un placard !

pour moi la version de lib n'est pas liée a la version de l'IDE mais à la version du schield donc

// If you want to use the w5100
#include <Ethernet.h>
// If you want to use the w5200/w5500
#include <EthernetV2_0.h>

donc suivant le CI (5200 ou 5500) de ton schield même en IDE 1.6 il faut utiliser la lib Ethernet V2

J'ai suivi ton conseil et inclus la bibliothèque Ethernet2.h sous ide 1.6.7.
Grâce à toi, je ne mettrai pas le Shield newIDE au placard car ça fonctionne en local, quelque soit la méthode : IP_locale:80 ou ip_locale:port redirigé dans la FreeBox. Un grand merci !

...Mais cela ne change rien à la connexion de l'extérieur avec l'ip publique, j'ai toujours la même erreur "page web inaccessible ERR_CONNECTION_REFUSED.

J'ai beaucoup recherçher sur le NET et il semble que ce type d'erreur ne provienne pas de l'Arduino mais d'un blocage du serveur. Ce qui est étonnant, c'est que j'ai bien accès en forwarding à mon Syno et à mes caméras dont les redirections sur de ports sont faites exactement de la même manière. Afin de vérifier si une plage de ports n'était pas bloquée par Free j'ai essayé avec des adresses proches de celles du Syno et des caméras, mais rien à faire...

Je n'ai plus de solution. Demain je vais appeler Free pour leur poser la question. Il peuvent tester les ports à distance, même si finalement le port redirigé est reconnu car si je mets adresse_ip locale:port redirigé la page html s'affiche normalement...

Salut,

Pour savoir si le soucis vient de la FB (peut probable) , test depuis le Net si le port 700 ou autre est bien ouvert et redirigé vers la carte Arduino, pour tester le port :

ou

https://www.grc.com/x/ne.dll?rh1dkyd2

puis All service Ports

@+

Bonjour à tous,
Réponses :

  • Oui le port est bien déclaré en TCP et UDP
  • Avec you get signal : port fermé
  • Ping avec adresse locale Ok
  • Dans le code Arduino j'ai utilisé la fonction ethernet begin complète :Ethernet.begin(mac, ip, dns, gateway, subnet, en précisant la passerelle de Free 192.168.0.254.

Avant d'appeler Free, j'ai essayé de mettre l'adresse IP de l'Arduino en dmz (j'aurais dû le faire avant...) et là, ça fonctionne, j'ai bien la page html !!! Ce qui ne résoud pas le problème, car pour des raisons de sécurité je ne peux pas laisser une adresse en dmz...

Sauf erreur de ma part, il s'agit donc bien d'un problème de port sur la FreeBox ? J'ai donc appelé Free en expliquant en détail le problème (je vous passe le niveau de l'interlocuteur...) et j'ai eu la réponse laconique suivante : Les problèmes d'ouverture de ports ne nous regardent pas. Adressez-vous à un informaticien ou voyez sur les forums.... Après un second appel chez Free j'ai eu un interlocuteur plus aimable qui a testé le port, qui selon lui est ouvert... Mais qui ne peut rien faire d'autre... Merci Free !

En résumé : J'ai donc désormais accès au WebServer Arduino Shield Ethernet2 - IDE 1.6.7 - avec l'IP locale en dmz, avec au niveau du code : l'IP Locale dans IP ADDRESS IP(), avec un Ethernet.begin() complet, avec EthernetServer(à l'écoute du port redirigé dans les NATs).

Dans cette configuration la page html et le résultat des entrées analogiques sont affichées et rafraîchies normalement lorsque je me connecte avec mon adresse "publique:mon port", que je ce soit de l'extérieur ou de chez moi en forwarding.

C'est déjà ça... Cela me permet de continuer mon apprentissage du langage Arduino. Merci à tous de vos conseils et de m'avoir consacré du temps :slight_smile: .

pour lever quelques doutes je ferais :

  • mettre l'arduino sur le port 80
  • faire une redirection de port box externe 80 vers l'arduino
    puis
  • test http.. adresse locale
  • test http ... adresse publique box
    si message "ERR_CONNECTION_REFUSED" débancher l'arduino du reseau et refaire
  • test http ... adresse publique box
    le message devrait changer

Tests effectués :

  • Désactivation du dmz sur l'adresse locale
  • Arduino en port 80
  • Redirection sur la Box du port externe 80 vers Arduino
  • Test http adresse locale : Affichage page html OK
  • Test http adresse publique : ERR_CONNECTION_REFUSED
  • RJ45 Shield Arduino débranchée
  • Test http adresse publique : ERR_CONNECTION_REFUSED
  • Test http adresse locale : ERR_ADDRESS_UNREACHABLE

  • Port externe 80 toujours redirigé vers Arduino sur la Box
  • Connexion réseau rebranchée sur le Shield
  • Réactivation du dmz pour l'adresse locale
  • Arduino en port Public xxxx
  • test http adresse locale : ERR_CONNECTION_REFUSED
  • Test http adresse publique : Affichage page html OK !

Redirection actuelle des ports sur la FreeBox :

xxxx port public --------192.168.0.100---------xxxx port public
80------------------------192.169.0.100---------80
80------------------------192.168.0.100---------xxxx port public

Pour moi c'est un vrai mystère...