ESP8266 projet maudit

Bonjour je voulais faire une commande de mon esp8266 depuis l'extérieur cet à dire hors de porté de wifi(de n'importe ou avec le tel sans wifi) ,avec mon tel piloté l'esp8266 pour allumé une led , wifi tel désactivé ,données mobiles tel activées, c'est mon cahier des charges.
Et la commence la malédiction.
J'ai trouvé un code que j'arrive à compilé et téléversé mais qui ne fonctionne pas au bout de quelques ... jours je me rends compte que je n'ai pas la bonne version de librairie installée (pour mon cas la version 2.3.0) , la je me dis ça va fonctionner mais (entre temps le disque dur de mon ordi est HS ) suite à mon problème de disque dur qui lâche en pleins projet je le fait changer , et au bout de quelques ... jours je me dis la c'est bon ça va fonctionner , mais surprise (bon je m'y attendais quand même) ça ne fonctionne pas malgré la redirection de port fait dans la "freebox" ,ou bout de quelques... jours on me signale qu'il me faut demander à free une adresse IP publique fixe et non partagé pour que mon projet fonctionne ,donc je fais la demande d'une adresse IP publique fixe que l'on m'attribut en trente minute(bravo free) et au bout de... trente minutes je me dis "yes ça va fonctionner je suis le meilleur" et bien non ça fonctionne pas quand je tape mon adresse IP+:7689/1234/LED_OFF avec le wifi tel actif cela fonctionne ,mais quand je désactive le wifi et active les données mobile tel cela ne fonctionne pas, une histoire de fou ,c'est pour ça que je fais ce post pour q' une personne comme moi qui veut faire un projet similaire ne cherche pas pour rien, je laisse le code que l'on trouve sur le net mais qui ne fonctionne pas!

   #include <ESP8266WiFi.h>

  // Informations de connexion Wi-Fi
  const char* ssid     = "nom de reseau wifi" ;
  const char* password = "mot de passe" ;

  const int ledPin = D1 ;

  // Adresse IP fixe :
   IPAddress staticIP ( 192 , 168 , 0   , 50 ) ; // l'adresse de mon esp8266
   IPAddress gateway  ( 192 , 168 , 0   , 1  ) ; 
   IPAddress subnet   ( 255 , 255 , 255 , 0  ) ; 

  // Clé d'accès
  const String accessKey = "1234" ; // pour sécurisé un peut plus

  // Création du serveur HTTP
  WiFiServer server ( 7689 ) ; // j'ai défini ce port.

  // Prototypes des fonctions
  void sendControlPage ( WiFiClient & client , int ledState = LOW ) ;
  void sendForbiddenPage ( WiFiClient & client ) ;

  void setup ( )
  {
  // Définition de la broche de la LED
  pinMode ( ledPin , OUTPUT ) ;
  digitalWrite ( ledPin , LOW ) ;
  
  // Initialisation du port série pour le débogage
  Serial . begin ( 115200 ) ;
  Serial . println ( "Démarrage..." ) ;

  // Configuration de l'adresse IP fixe
  WiFi . config ( staticIP , gateway , subnet ) ; 
  
  // Connexion au Wi-Fi
  Serial . print ( "Connexion à " ) ;
  Serial . println ( ssid ) ;
  WiFi . begin ( ssid , password ) ;

  // Attente de la connexion Wi-Fi
  while ( WiFi . status ( ) != WL_CONNECTED )
  {
  delay ( 500 ) ;
  Serial . print ( "." ) ;
  }

  // Affichage des informations de connexion
  Serial . println ( "" ) ;
  Serial . println ( "Wi-Fi connecté !" ) ;
  Serial . print ( "Adresse IP : " ) ;
  Serial . println ( WiFi . localIP ( ) ) ;

  // Démarrage du serveur
  server . begin ( ) ;
  Serial . println ( "Serveur HTTP démarré !" ) ;
  }
  void loop ( )
  {
  // Vérification de l'arrivée d'un client
  WiFiClient client = server . available ( ) ;
  if ( ! client )
  {
  return ; // Aucun client connecté
  }
  // Attente des données du client
  while ( ! client.available ( ) )
  {
  delay ( 1 ) ;
  }
  // Lecture de la requête du client
  String request = client.readStringUntil('\r');
  client.flush();

  // Debug: Afficher la requête reçue
  Serial . println ( "Requête reçue :" ) ;
  Serial . println ( request ) ;

  // Vérifier si la requête contient la clé d'accès
  if ( ! request . startsWith ( "GET /"+accessKey+"/" ) )
  {
  sendForbiddenPage ( client ) ;
  return ;
  }
  // Supprimer la clé d'accès de la requête pour analyser les commandes
  request = request . substring ( accessKey . length ( ) + 6 ) ;

  if ( request . startsWith ( "LED_ON" ) )
  {
  digitalWrite ( ledPin , HIGH ) ; // Allumer la LED
  sendControlPage ( client , HIGH ) ;
  }
  else if ( request . startsWith ( "LED_OFF" ) )
  {
  digitalWrite ( ledPin , LOW ) ; // Éteindre la LED
  sendControlPage ( client , LOW ) ;
  }
  else
  {
  sendForbiddenPage ( client ) ;
  }
  }
  void sendControlPage ( WiFiClient & client , int ledState )
  {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();

  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<head>");
  client.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
  client.println("<style>");
  client.println("body { font-family: Arial; text-align: center; margin: 0; display: flex; flex-direction: column; "
                    "justify-content: flex-start; align-items: center; height: 100vh; padding: 20px; box-sizing: border-box; }");
  client.println("h1 { color: black; font-size: 36px; margin-bottom: 5px; }");  // "Contrôle LED" en noir
  client.println("p { font-size: 24px; color: black; margin-bottom: 20px; }");  // "État :" en noir
  client.println("div { margin-top: 30px; }"); // Espacement entre l'état et les boutons
  client.println("button { padding: 15px; margin: 10px; font-size: 18px; background-color: #6a0dad; color: white; border: none; "
                    "border-radius: 5px; cursor: pointer; }"); // Boutons en violet
  client.println("button:hover { background-color: #4b0082; }"); // Style hover pour les boutons violets
  client.println("footer { margin-top: 40px; font-size: 20px; color: green; }"); // Style général pour "Emma ma chérie"
  client.println("footer span { font-size: 40px; font-weight: bold; color: green; }"); // "Emma" en police plus grosse
  client.println("footer span + span { font-size: 20px; font-weight: normal; color: black; }"); // "ma chérie" en noir
  client.println("</style>");
  client.println("</head>");
  client.println("<body>");
  client.println("<h1>Contr&ocirc;le LED</h1>");  // "Contrôle" avec l'accent correctement encodé
  client.println("<p>&Eacute;tat : <strong>" + String((ledState == HIGH) ? "Allum&eacute;e" : "&Eacute;teinte") + "</strong></p>");  // Accents sur "État", "Allumée", "Éteinte"
    
  // Section des boutons avec espacement
  client.println("<div>");
  client.println("<a href=\"/"+accessKey+"/LED_ON\"><button>Allumer</button></a>");
  client.println("<a href=\"/"+accessKey+"/LED_OFF\"><button>&Eacute;teindre</button></a>");  // "Éteindre" avec l'accent
  client.println("</div>");
    
  // Ajout du texte "Emma ma chérie" avec un espace entre "Emma" et "ma chérie"
  client.println("<footer><span>Emma</span> <span>&nbsp;&nbsp;ma ch&eacute;rie</span></footer>");  // Espace entre "Emma" et "ma chérie"
    
  // Ajout d'un espace plus grand entre "Emma ma chérie" et "vive le ski"
  client.println("<footer style=\"color: blue; font-size: 24px; margin-top: 30px;\">vive le ski</footer>");  // "vive le ski" en bleu

  client.println("</body>");
  client.println("</html>");
  }
  void sendForbiddenPage ( WiFiClient & client )
  {
  client.println("HTTP/1.1 403 Forbidden");
  client.println("Content-Type: text/html");
  client.println("Connection: close");
  client.println();

  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<head>");
  client.println("<style>");
  client.println("body { font-family: Arial; text-align: center; background-color: #f8f9fa; "
                    "display: flex; justify-content: center; align-items: center; "
                    "height: 100vh; margin: 0; flex-direction: column; }"); // Flexbox avec orientation verticale
  client.println("h1 { color: #dc3545; font-size: 72px; margin: 0; }"); // Très grosse police pour "Accès refusé"
  client.println("p { font-size: 48px; color: #dc3545; margin: 0; }"); // Police plus grande pour "Clé d'accès incorrecte"
  client.println("</style>");
  client.println("</head>");
  client.println("<body>");
  client.println("<h1>Acc&egrave;s refus&eacute;</h1>");
  client.println("<p>Cl&eacute; d&apos;acc&egrave;s incorrecte.</p>");
  client.println("</body>");
  client.println("</html>");
  }

Tu as ouvert un port depuis l'extérieur vers ton ESP sur la freebox?
Paramètres de la Freebox ==> Gestion des ports ==> Ajouter une redirection

non ce n'est pas le problème

le wifi tel actif c'est le wifi local de la box ?

IP+ c'est l'adresse ip wan publique que free t'as donné ?

il existe des sites en ligne qui testent les ports ouverts

si déjà l'ip wan correspond

Non l’adresse IP donnée par free est bonne

Bonjour, j’ai quand même l’impression que tout n’est pas clair. Il y a deux IP qui interviennent dans le problème.

IP de ton ESP dans ton réseau wifi : probablement 192.168.xxx.xxx
IP dite publique de ta box : n’importe quoi mais pas 192.168.xxx.xxx. Le site whatismyip.com te la donnera. (À consulter depuis le réseau wifi de là box, bien sûr)

En wifi il faut utiliser la première. Avec les données mobiles c’est la deuxième mais il faut en plus une redirection de port dans la box pour que l’esp soit accessible.

Bonjour c'est exactement ce que je fais , et c'est inscrit dans le code mais ce n'est pas détaillé par apport au 2 adresses ,1er adresse c'est celle de mon esp8266 "192.168.0.50:7689/1234/LED_OFF" cela fonctionne avec le wifi du tel c'est normal ensuite ,quand je fais la 2em adresse et c'est celle la qui m'intéresse, mon adresse IP publique fixe(celle que m'a donné free) quand je l'utilise avec le wifi activé du tel cela fonctionne mais quand je désactive le wifi du tel et active les données mobile du tel cela ne fonctionne plus.la redirection de port dans la box est bonne car elle apparait dans les configurations de ports et elle est active et cela fonctionne quand je tape sur le tel wifi actif "IP(adresse publique box)+:7689/1234/LED_OFF" .

Non ce n'est pas une preuve que votre redirection est bonne car quand vous faites cela avec le WiFi activé, vous restez dans le réseau local au niveau du routeur (la box free) et votre requête ne sort pas sur internet pour revenir.

Si vous coupez le wifi de votre tel et tapez IP(adresse publique box)+:7689/1234/LED_OFF c'est seulement là que vous pouvez voir si le port 7689 est bien routé vers l'adresse (sur le réseau local LAN) de votre ESP avec aussi le bon port que vous écoutez (7689).

Si vous avez des logs, vous pourriez voir déjà si votre requête arrive sur votre routeur

Pourtant si je fais une erreur de chiffres dans la saisi de l’adresse IP box cela ne fonctionne pas même wifi tel actif donc c'est bien que mon adresse IP box est reconnue

oui bien sûr mais le routeur voit sans doute que l'adresse IP WAN que vous demandez c'est lui même, donc il ne va pas router votre requête sur internet pour que ça revienne à lui, et au final ça reste dans le LAN.

j'ai fais des projets avec "blynk" et "sonoff" qui sont accessibles sur internet via des applis et ça fonctionne du premier coup , et la avec mon esp8266 j'en suis pas capable, se projet et vraiment maudit grrrrrrrrrrrrrr

en dessin si j'ai bien compris:

ça fonctionne:

ça ne fonctionne pas:

Le comportement que vous décrivez pourrait être lié à une fonctionnalité appelée NAT Loopback.

Lorsqu'un routeur prend en charge le NAT Loopback, il permet aux appareils du réseau local (WLAN) d'accéder à des services hébergés sur le même réseau en utilisant l'adresse IP publique (WAN) du routeur. Si le routeur ne prend pas en charge cette fonctionnalité, les requêtes adressées à l'adresse IP WAN depuis l'intérieur du réseau local échoueront ou devront être redirigées différemment.

Dans votre situation, comme le test interne fonctionne mais que l'accès externe échoue, cela pourrait indiquer que le NAT Loopback est bien supporté et que le mappage de port est correctement configuré et le problème d'accès depuis l'extérieur pourrait être lié à autre chose :

➜ Vérifiez que les règles du pare-feu autorisent explicitement les connexions entrantes sur le port 7689 et ne bloquent les connexions entrantes provenant de l'extérieur.

➜ Certains FAI bloquent les connexions entrantes sur certains ports pour des raisons de sécurité ou pour éviter l'hébergement de services à domicile. Il est utile de vérifier si Free impose de telles restrictions. Je ne sais pas.

➜ Si vous avez un second routeur (je fais cela à la maison, je n'utilise pas le WiFi de ma box mais un réseau perso), il pourrait y avoir un double NAT qui complique les connexions entrantes. Dans ce cas, vous devez configurer la redirection de port sur les deux appareils ou placer un des routeurs en mode pont

faudrait en savoir un peu plus sur votre config.

vous employez des termes trop compliqué pour moi vous m'avez perdu à la 2em ligne ,je pense que m'a redirection de port est bonne mais bon comme vous le dite c'est pas sur je vais chercher encore un peut merci de vos infos , peut être voir avec free je sais pas ,encore merci à tous de votre patience.

J'avoue avoir à peine survolé le code sans chercher à le comprendre... mea culpa

OK c'est plus clair...

Pas de solution évidente comme ça mais :

  • est-ce que le port 7689 est indispensable et as-tu fait un essai avec le port 80 plus classique ?
  • est-ce que tu précises explicitement le protocole dans ton url ? http://IP_PUBLIQUE:7689/1234/LED_OFF au lieu de IP_PUBLIQUE:7689/1234/LED_OFF

Pour moi (sans garantie, s'il y a un spécialiste des réseaux il me corrigera) le fait que

montre que le routage dans ton réseau local est OK, pas nécessairement la redirection de port.

A condition que le NAT Loopback soit bien supporté. Sinon le fait de taper l'adresse WAN et pas WLAN de l'ESP fait que l'on ne resterait pas au niveau WLAN du routeur.

Je ne connais pas les freebox, je ne sais pas si c'est le cas :frowning:

De mémoire, je crois qu'il faut accéder à la démilitarisation de la box. Je ne sais pas si tous le opérateurs utilisent ce même nom. Le nom générique est DMZ. Free publie certainement un mode opératoire pour cela.

Dans la Freebox:

  • DMZ redirige tout le trafic entrant vers une seule machine. Plutôt utilisé pour faire un pare-feu, par exemple.

  • La redirection de ports permet de rediriger certain ports vers des machines particulières.
    Port XX sur l'IP public ==> port XX sur une IP locale

J'utilise la redirection de port sur ma freebox pour rediriger vers mon serveur certains ports et la DMZ n'est pas active. Et ça fonctionne parfaitement.

oui, c'est la bonne approche et en général, la redirection de port est préférable pour des raisons de sécurité.

Activer la DMZ sur une box pour un ESP permet de l'exposer directement à Internet sans restriction de pare-feu, ce qui peut faciliter l'accès à l'appareil mais cela présente un risque de sécurité accru car l'ESP sera ouvert à toutes les connexions extérieures sans filtrage.

En comparaison, la redirection de port permet de limiter l'accès en ne redirigeant que le/les ports spécifiques, ce qui offre un meilleur contrôle et une sécurité "renforcée".

j'ai trouvé , j'avais plus de chance de gagné au loto que de trouvé mon problème ,à force de compiler de modifier de mettre des commentaires de trafiquer mon code au bout d'un moment cela à fonctionner ,et la tel un prédateur devant ça proie mon regard se fixe sur l'ordi mais qu'est ce que j'ai fais pour que cela fonctionne et bien c'était tous simple il y avait cette ligne que j'avais mis en commentaire je ne sais pas pourquoi " WiFi . config ( staticIP , gateway , subnet ) ; " donc je me suis dit si cette ligne ne sert à rien ses 3 la non plus IPAddress staticIP ( 192 , 168 , 0 , 50 ) ;
IPAddress gateway ( 192 , 168 , 0 , 1 ) ;
IPAddress subnet ( 255 , 255 , 255 , 0 ) ;
du coup j'ai supprimé tous ça et mon code fonctionne parfaitement ,mon esp8266 et joignable sur internet wifi tel désactivé données mobile tel activées,c'est bien la première fois que je trouve une solution pour faire fonctionner un code en enlevant 4 lignes de codes (ses 4 lignes ne servent à rien pour mon code) champagne !
si quelqu'un à une explication pas trop technique quand même j'aimerais comprendre pourquoi cela fonctionne sachant que dans le code d'origine ses 4 lignes sont actives.