elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Caida de servidor ESP8266 (Programación Arduino)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Caida de servidor ESP8266 (Programación Arduino)  (Leído 2,693 veces)
Fox_Neo

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Caida de servidor ESP8266 (Programación Arduino)
« en: 13 Febrero 2018, 21:20 pm »

Hola gracias por leer mi problema. Espero que sea correcta la sección  estaba dudando entre ponerlo aquí o en la sección de Redes.  
Estoy programando un Módulo ESP8266 mediante Arduino y tengo un problema. El objetivo que busco es programar el módulo para que pueda encender un LED a través de un dispositivo que no esté en la red  interna(por ejemplo desde un móvil) o desde la red interna.

Para ello he abierto el puerto 80 de mi router y que todas las peticiones externas que vayan al puerto 80 las desvíe  a la IP del Módulo ESP 8266.

Para el control del led se ha programado una pequeña página WEB mediante html que tiene unos botones para encender o apagar el led, aparte de la propia programación de Arduino.


Vale, cuando accedo con un dispositivo  que está en la red interna (móvil o PC)  a la IP del módulo ESP funciona correctamente.

Cuando accedo con un dispositivo externo a la red (con un móvil), poniendo la IP pública de mi red, enciendo el led  y  después doy a apagar el led y el módulo se queda bloqueado y el navegador se queda en blanco, no llega enviar la petición al servidor.

Os dejo el código, aunque no hayáis programado en Arduino echad un ojo al código es bastante intuitivo, quizás veáis algo.


Código
  1. #include <ESP8266WiFi.h>                    //Incluye la librería ESP8266WiFi
  2. const char* ssid = "Nombre de Wifi";                  //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos.
  3. const char* password = "contraseña";      //Indicamos la contraseña de de red WiFi
  4. WiFiServer server(80);                     //Definimos el puerto de comunicaciones
  5. int PinLED = 2; // GPIO2                   //Definimos el pin de salida - GPIO2 / D4
  6. int estado = LOW;                          //Definimos la variable que va a recoger el estado del LED
  7. int t1=0;
  8. int t2=0;
  9. void setup() {
  10.  
  11.  Serial.begin(115200);                     // configuracion del monitor serial del Arduino(para visualizar por la consola de Arduino)
  12.  pinMode(PinLED, OUTPUT);                 //Inicializamos el GPIO2 como salida
  13.  digitalWrite(PinLED, LOW);               //Dejamos inicialmente el GPIO2 apagado
  14.  
  15.  WiFi.begin(ssid, password);              //Inicializamos  la conexión del ESP8266 con la red WiFi
  16.  Serial.printf("Conectando a la red: %s", WiFi.SSID().c_str());
  17.  
  18.  while (WiFi.status() != WL_CONNECTED) {  // Verifica el estado de la conexión del ESP8266 cada 0,5s hasta que conecta
  19.    delay(500);
  20.    Serial.print(".");                    
  21.  }
  22.  Serial.println("");
  23.  Serial.println("WiFi conectada");        // Indica que el ESP8266 conectado con la red WiFi
  24.  
  25.  server.begin();                          // Inicia el ESP8266 en modo Station
  26.  Serial.println("Servidor inicializado");
  27.  
  28.  Serial.printf("Utiliza esta URL para conectar: http://%s/n", WiFi.localIP().toString().c_str());//IP del ESP8266
  29. }
  30.  
  31. void loop(){
  32. if (WiFi.status() == WL_CONNECTED)                           //Esta parte no es necesaria se ha puesto para ver si
  33.   {                                                          // el servidor se bloquea, si va bien cada 10seg muestra
  34.      t1=millis();                                            // el mensaje
  35.      if((t1-t2)>=10000)
  36.        {
  37.      Serial.printf("Conectado a la red: %s\n", WiFi.SSID().c_str());
  38.       t2=millis();
  39.       }
  40.   }
  41.  WiFiClient client = server.available();  // Comprueba si el cliente ha conectado con el ESP8266
  42.  if (!client) {
  43.    return;
  44.  }
  45.  
  46.  Serial.println("nuevo cliente");         // Espera hasta que el cliente envía alguna petición
  47.  while(!client.available()){
  48.    delay(1);
  49.  }
  50.  
  51.  String peticion = client.readStringUntil('\r');  // Lee la petición enviada al ESP8266 y se almacena en un string.
  52.  Serial.println(peticion);
  53.  client.flush();
  54.  
  55.  // Comprueba la petición
  56.  if (peticion.indexOf('/LED=ON') != -1) {        //Si se dió al boton de la  pagina WEB encender LED=ON estará en el string de petición
  57.    estado = HIGH;
  58.  }
  59.  if (peticion.indexOf('/LED=OFF') != -1){
  60.    estado = LOW;
  61.  }
  62.  
  63.  digitalWrite(PinLED, estado);           //Enciende o apaga el LED en función de la petición
  64.  
  65.  client.println("HTTP/1.1 200 OK");      //Envía la página HTML de respuesta al cliente
  66.  client.println("");                     //No olvidar esta línea de separación
  67.  client.println("<!DOCTYPE HTML>");
  68.  client.println("<meta charset='UTF-8'>");               //para que en el servidor aparezcan tildes
  69.  client.println("<html>");
  70.  
  71.      //Imprime el estado del led
  72.  client.print("<h1>El LED está ahora: ");                
  73.  if(estado == HIGH) {
  74.    client.print("ENCENDIDO</h1>");  
  75.  } else {
  76.    client.print("APAGADO</h1>");
  77.  }
  78.  
  79.      //Se crean enlaces para modificar el estado del LED      
  80.  client.println("Presiona <a href='/LED=ON'>AQUÍ</a> para encender el LED<br>");
  81.  client.println("Presiona <a href='/LED=OFF'>AQUÍ</a> para apagar el LED<br><br>");
  82.  
  83.      //Se crean cajas de comprobación (checkbox) para modificar el estado del LED
  84.  client.println("<input type='checkbox' onClick=location.href='/LED=ON'> ENCENDER </input><br>");
  85.  client.println("<input type='checkbox' onClick=location.href='/LED=OFF'> APAGAR </input><br><br>");
  86.  
  87.      //Se crean botones para modificar el estado del LED
  88.  client.println("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button>");
  89.  client.println("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>");
  90.  
  91.      //Se crean botones con estilos para modificar el estado del LED
  92.  client.println("<button type='button' onClick=location.href='/LED=ON' style='margin:auto; background-color:green; color:#A9F5A9; padding:5px; border:2px solid black; width:200;'><h2> ENCENDER</h2> </button>");
  93.  client.println("<button type='button' onClick=location.href='/LED=OFF' style='margin:auto; background-color:red; color:#F6D8CE; padding:5px; border:2px solid black; width:200;'><h2> APAGAR</h2> </button><br><br>");
  94.  
  95.      //Se crea un único botón para modificar el estado del LED
  96.  if(estado == HIGH) {
  97.    client.print("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>");  
  98.  } else {
  99.    client.print("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button><br><br>");
  100.  }
  101.  client.println("</html>");
  102.  delay(1);
  103.  Serial.println("Petición finalizada");          // Se finaliza la petición al cliente. Se inicaliza la espera de una nueva petición.
  104.  
  105. }

Muchas gracias por la ayuda.

Salu2.



« Última modificación: 3 Febrero 2019, 17:06 pm por Fox_Neo » En línea

PalitroqueZ


Desconectado Desconectado

Mensajes: 948



Ver Perfil
Re: Caida de servidor ESP8266 (Programación Arduino)
« Respuesta #1 en: 13 Febrero 2018, 21:38 pm »

como tienes configurado el ESP8266 en el arduino respecto al router?

ip fija, dinamica? nombre del equipo, macaddress?

es decir cuando enciendes el servidor ¿cómo se engancha éste a la red?



En línea

"La Economía planificada lleva de un modo gradual pero seguro a la economía dirigida, a la economía autoritaria y al totalitarismo" Ludwig Erhard
srWhiteSkull


Desconectado Desconectado

Mensajes: 443



Ver Perfil WWW
Re: Caida de servidor ESP8266 (Programación Arduino)
« Respuesta #2 en: 14 Febrero 2018, 00:06 am »

Prescinde del while en el loop, no lo necesitas. La funcion loop siempre debe estar corriendo. Simplemente pon una condicion if está disponible el cliente y le envias la pagina, etc



El client.available() te indica cuando hay un mensaje del cliente disponible, debe ser por eso que la pagina se mostrará una vez y luego se quedara en blanco al entrar en el bucle while... la secuencia deberia ser:

Loop
   Existen cliente (!cliente) entonces mostramos la pagina, con la situacion actual del circuito
      cliente.flush()
      Existe mensaje (client.available()>0) entonces leemos e interpretamos el mensaje apagando encendiendo
      Fin Existe mensaje
   Fin existe cliente

[MOD] No hacer doble post, usar el botón "modificar" para añadir comentarios.
« Última modificación: 14 Febrero 2018, 01:56 am por simorg » En línea

Fox_Neo

Desconectado Desconectado

Mensajes: 234



Ver Perfil
Re: Caida de servidor ESP8266 (Programación Arduino)
« Respuesta #3 en: 15 Febrero 2018, 18:31 pm »

Prescinde del while en el loop, no lo necesitas. La funcion loop siempre debe estar corriendo. Simplemente pon una condicion if está disponible el cliente y le envias la pagina, etc



El client.available() te indica cuando hay un mensaje del cliente disponible, debe ser por eso que la pagina se mostrará una vez y luego se quedara en blanco al entrar en el bucle while... la secuencia deberia ser:

Loop
   Existen cliente (!cliente) entonces mostramos la pagina, con la situacion actual del circuito
      cliente.flush()
      Existe mensaje (client.available()>0) entonces leemos e interpretamos el mensaje apagando encendiendo
      Fin Existe mensaje
   Fin existe cliente

[MOD] No hacer doble post, usar el botón "modificar" para añadir comentarios.

Vale muchas gracias tenías razón  ahora funciona correctamente también con un dispositivo externo a la red  todas las veces que le doy a apagar o encender.

Lo que no entiendo es por qué desde un dispositivo conectado a la red interna  funcionaba correctamente :huh:



como tienes configurado el ESP8266 en el arduino respecto al router?

ip fija, dinamica? nombre del equipo, macaddress?

es decir cuando enciendes el servidor ¿cómo se engancha éste a la red?




El ESP8266 lo tengo configurado para que la comunicación sea por el puerto 80, y el puerto 80 del router esta configurado para enviar las peticiones a la IP del ESP8266 que es fija.

Mi IP pública es dinámica aunque lleva un mes sin cambiar así que la considero IP estática


El servidor  es el propio ESP8266 y se conecta  mediante esta instrucción
Código
  1. WiFi.begin(ssid, password);
Después de compilar, cargar el programa y dar corriente al ESP8266 se conecta automáticamente.

El código que por tanto de la siguiente manera:
Código
  1. #include <ESP8266WiFi.h>                    //Incluye la librería ESP8266WiFi
  2. const char* ssid = "Nombre de Wifi";                  //Indicamos el nombre de la red WiFi (SSID) a la que queremos conectarnos.
  3. const char* password = "contraseña";      //Indicamos la contraseña de de red WiFiWiFi
  4. WiFiServer server(80);                     //Definimos el puerto de comunicaciones
  5. int PinLED = 2; // GPIO2                   //Definimos el pin de salida - GPIO2 / D4
  6. int estado = LOW;                          //Definimos la variable que va a recoger el estado del LED
  7. int t1=0;
  8. int t2=0;
  9. void setup() {
  10.  
  11.  Serial.begin(115200);                     // configuracion del monitor serial del Arduino(para visualizar por la consola de Arduino)
  12.  pinMode(PinLED, OUTPUT);                 //Inicializamos el GPIO2 como salida
  13.  digitalWrite(PinLED, LOW);               //Dejamos inicialmente el GPIO2 apagado
  14.  
  15.  WiFi.begin(ssid, password);              //Inicializamos  la conexión del ESP8266 con la red WiFi
  16.  Serial.printf("Conectando a la red: %s", WiFi.SSID().c_str());
  17.  
  18.  while (WiFi.status() != WL_CONNECTED) {  // Verifica el estado de la conexión del ESP8266 cada 0,5s hasta que conecta
  19.    delay(500);
  20.    Serial.print(".");                    
  21.  }
  22.  Serial.println("");
  23.  Serial.println("WiFi conectada");        // Indica que el ESP8266 conectado con la red WiFi
  24.  
  25.  server.begin();                          // Inicia el ESP8266 en modo Station
  26.  Serial.println("Servidor inicializado");
  27.  
  28.  Serial.printf("Utiliza esta URL para conectar: http://%s/n", WiFi.localIP().toString().c_str());//IP del ESP8266
  29. }
  30.  
  31. void loop(){
  32. if (WiFi.status() == WL_CONNECTED)                           //Esta parte no es necesaria se ha puesto para ver si
  33.   {                                                          // el servidor se bloquea, si va bien cada 10seg muestra
  34.      t1=millis();                                            // el mensaje
  35.      if((t1-t2)>=10000)
  36.        {
  37.      Serial.printf("Conectado a la red: %s\n", WiFi.SSID().c_str());
  38.       t2=millis();
  39.       }
  40.   }
  41.  WiFiClient client = server.available();  // Comprueba si el cliente ha conectado con el ESP8266
  42.  if (!client) {
  43.    return;
  44.  }
  45.  
  46.  Serial.println("nuevo cliente");         // Espera hasta que el cliente envía alguna petición
  47.  //while(!client.available()){
  48.  //  delay(1);
  49.  //}
  50.  
  51.  String peticion = client.readStringUntil('\r');  // Lee la petición enviada al ESP8266 y se almacena en un string.
  52.  Serial.println(peticion);
  53.  client.flush();
  54.  
  55.  // Comprueba la petición
  56.  if (peticion.indexOf('/LED=ON') != -1) {        //Si se dió al boton de la  pagina WEB encender LED=ON estará en el string de petición
  57.    estado = HIGH;
  58.  }
  59.  if (peticion.indexOf('/LED=OFF') != -1){
  60.    estado = LOW;
  61.  }
  62.  
  63.  digitalWrite(PinLED, estado);           //Enciende o apaga el LED en función de la petición
  64.  
  65.  client.println("HTTP/1.1 200 OK");      //Envía la página HTML de respuesta al cliente
  66.  client.println("");                     //No olvidar esta línea de separación
  67.  client.println("<!DOCTYPE HTML>");
  68.  client.println("<meta charset='UTF-8'>");               //para que en el servidor aparezcan tildes
  69.  client.println("<html>");
  70.  
  71.      //Imprime el estado del led
  72.  client.print("<h1>El LED está ahora: ");                
  73.  if(estado == HIGH) {
  74.    client.print("ENCENDIDO</h1>");  
  75.  } else {
  76.    client.print("APAGADO</h1>");
  77.  }
  78.  
  79.      //Se crean enlaces para modificar el estado del LED      
  80.  client.println("Presiona <a href='/LED=ON'>AQUÍ</a> para encender el LED<br>");
  81.  client.println("Presiona <a href='/LED=OFF'>AQUÍ</a> para apagar el LED<br><br>");
  82.  
  83.      //Se crean cajas de comprobación (checkbox) para modificar el estado del LED
  84.  client.println("<input type='checkbox' onClick=location.href='/LED=ON'> ENCENDER </input><br>");
  85.  client.println("<input type='checkbox' onClick=location.href='/LED=OFF'> APAGAR </input><br><br>");
  86.  
  87.      //Se crean botones para modificar el estado del LED
  88.  client.println("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button>");
  89.  client.println("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>");
  90.  
  91.      //Se crean botones con estilos para modificar el estado del LED
  92.  client.println("<button type='button' onClick=location.href='/LED=ON' style='margin:auto; background-color:green; color:#A9F5A9; padding:5px; border:2px solid black; width:200;'><h2> ENCENDER</h2> </button>");
  93.  client.println("<button type='button' onClick=location.href='/LED=OFF' style='margin:auto; background-color:red; color:#F6D8CE; padding:5px; border:2px solid black; width:200;'><h2> APAGAR</h2> </button><br><br>");
  94.  
  95.      //Se crea un único botón para modificar el estado del LED
  96.  if(estado == HIGH) {
  97.    client.print("<button type='button' onClick=location.href='/LED=OFF'> APAGAR </button><br><br>");  
  98.  } else {
  99.    client.print("<button type='button' onClick=location.href='/LED=ON'> ENCENDER </button><br><br>");
  100.  }
  101.  client.println("</html>");
  102.  delay(1);
  103.  Serial.println("Petición finalizada");          // Se finaliza la petición al cliente. Se inicaliza la espera de una nueva petición.
  104.  
  105. }
Muchas gracias por la ayuda.

Un saludo.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[problema] programacion para Arduino
Electrónica
juliol34 5 4,880 Último mensaje 29 Julio 2010, 20:16 pm
por Banti
ARDUINO PROGRAMACIÓN « 1 2 »
Programación General
Inter-ard 11 4,283 Último mensaje 12 Febrero 2014, 19:04 pm
por Darioo
Comunicacion Arduino-Servidor
Electrónica
arcross88 1 1,678 Último mensaje 26 Junio 2016, 02:35 am
por peter_lyon
Arduino Regalado y Nuevo en el mundo de la programación
Programación C/C++
Mr.CUAKO 1 863 Último mensaje 28 Abril 2017, 10:19 am
por MAFUS
clonar programación de arduino nano
Ingeniería Inversa
electrorock 1 3,749 Último mensaje 25 Enero 2018, 02:59 am
por rub'n
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines