NodeMCU en español
NodeMCU - Juan Antonio Villalpando
-- Tutorial de NodeMCU en español --
Volver al índice del tutorial NodeMCU
____________________________
75.- NodeMcu como Punto de Acceso. SoftAP.
- Puedes consultar esta información en inglés:
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/readme.html
_____________________________________________________
1.- El NodeMcu como cliente de red.
- En los tutoriales anterior hemos visto que NodeMcu se conecta a nuestro Router como Cliente.
- Es decir, los dispositivos: ordenador, móvil, NodeMcu están conectado al Router (Acces Point). Si nuestro móvil quiere comunicarse con el NodeMcu, la información llega al Router y de éste al NodeMcu. El Router es como un intermediario.
- El Router establece una red local: 192.168.1.X, los dispositivos de su red están conectados a: 192.168.1.1 (que es la dirección del Router).
- En el caso de la figura el Router está conectado a Internet mediante la IP pública 83.59.132.122. Pero si solo queremos actuar en red local no es necesario que esté conectado a Internet, es decir podemos tener un Router sin estar conectado a Internet, pero que crea una red local. El ordenador, el móvil y el NodeMcu se pueden conectar y enviar información entre ellos. No tienen acceso a Internet, pero entre ellos sí hay comunicación.
- Así que puedo comprar un Router sin conectarlo a Internet, e interconectar con él muchos dispositivos, móviles, ordenadores, NodeMcus,...
_____________________________________________________
2.- El NodeMcu como Punto de Acceso (SoftAP).
- Aquí tenemos otra forma de trabajo.
- Tenemos a nuestro Router (que puede o no estar conectado a Internet, según queramos) y resulta que el móvil está muy lejos del Router y no le llega señal.
- Ponemos al NodeMcu de intermediario, como Punto de Acceso, de esta manera el móvil enviará la señal al NodeMcu y éste al Mi_Router.
- Ahora conectamos al NodeMcu a nuestra red 192.168.1.1 actuando como Punto de Acceso.
-
- A veces nos puede ocurrir los siguiente. Tenemos Internet en nuestro móvil y funciona perfectamente. Nuestro amigo no tiene Internet y no dispone de conexión WiFi cercana. - Habilitamos nuestro móvil como Punto de Acceso, Hotpot. Nuestro amigo se conecta a nuestro móvil y ya se puede conectar a Internet a través de nuestro móvil.
- Nuestro móvil consumirá nuestros "megas" y los que vaya gastando nuestro amigo mientras esté conectado.
- Consulta este tutorial:
105D.- Android hotspot. El teléfono móvil como si fuera un router. |
_____________________________________________________
3.- El NodeMcu como Punto de Acceso (SoftAP) sin otro Router.
- Fíjate en el dibujo, ahora el NodeMcu está actuando como Router, en realidad se denomina Punto de Acceso, en este caso SoftAP.
- El NodeMcu crea la red 192.168.4.9 y los demás dispositivos están conectados a esa red. Debemos ir a la configuración de red de cada dispositivo y conectarlo a esa red, se suele denominar ESPsoftAP_01
- Aquí no tenemos Internet, esto se suele denominar Intranet o red local.
_____________________________________________________
4.- Vamos a crear un Punto de Acceso, SotfAP con el NodeMcu.
- Simplemente cargamos este código en el NodeMcu.
https://arduino-esp8266.readthedocs.io/en/latest/esp8266wifi/soft-access-point-class.html
- La red se denomina ESPsoftAP_01
- Vamos a nuestro móvil, entramos en la configuración de red WiFi y observaremos esta red.
- También entramos en el Monitor Serie de Arduino para ver la información mostrada. Lo configuramos a 115200.
- Cada 3 segundos irá mostrando el número de estaciones conectadas.
NodeMcu_AP.ino |
// Juan A. Villalpando
// Agosto 2018
// NodeMcu como Punto de Acceso.
#include <ESP8266WiFi.h>
IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.print("Setting soft-AP configuration ... ");
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
Serial.print("Setting soft-AP ... ");
Serial.println(WiFi.softAP("ESPsoftAP_01") ? "Ready" : "Failed!");
Serial.print("Soft-AP IP address = ");
Serial.println(WiFi.softAPIP());
}
void loop() {
Serial.printf("Stations connected = %d\n", WiFi.softAPgetStationNum());
delay(3000);
}
|
- Si quisiéramos poner contraseña:
WiFi.softAP(ssid, password);
_____________________________________________________
5.- NodeMcu como punto de acceso y como servidor web.
Muy importante. Normalmente cuando trabajas para emular las aplicaciones de App Inventor, utilizas el Companión y éste se conecta a tu red, normalmente 192.168.1.X. Tu ordenador también está conectado a esa red.
Pero ahora si estableces el NodeMcu como Punto de Acceso, éste creará otra red: 192.168.4.X, de tal manera que una red no es compatible con la otra.
Cuando vayas a realizar las pruebas con el NodeMCU, debes entrar en la configuración de red del móvil y cambiar la red a ESPsoftAP_01 .
Lo mejor sería Crear la aplicación e instalarla en el móvil y luego cambiar configuración de red del móvil, porque si dejas la del móvil en 192.168.1.X y la del NodeMcu en 192.168.4.X no funcionará. |
- En el tutorial:
62B.- NodeMCU web server. Servidor web simple muestra página web HTM. IP estática.
- Vimos como configurar al NodeMcu como Servidor web, servía una página web simple con botones (aunque los botones no realizaban ninguna opción.)
- Ahora vamos a insertar el código correspondiente al Servidor web, dentro del NodeMcu como Punto de Acceso.
NodeMcu_AP_ServidorWeb.ino |
// Juan A. Villalpando
// Agosto 2018
// NodeMcu como Punto de Acceso y Servidor Web.
#include <ESP8266WiFi.h>
IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);
WiFiServer server(80);
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.print("Setting soft-AP configuration ... ");
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
Serial.print("Setting soft-AP ... ");
Serial.println(WiFi.softAP("ESPsoftAP_01") ? "Ready" : "Failed!");
Serial.print("Soft-AP IP address = ");
Serial.println(WiFi.softAPIP());
server.begin();
}
void loop() {
WiFiClient client = server.available();
if (!client) {
return;
}
// Espera hasta que el cliente envíe datos.
Serial.println("Nuevo cliente.");
while(!client.available()){
delay(1);
}
// Página WEB. ///////////////////////////////
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // Comillas importantes.
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><meta charset=utf-8></head>");
client.println("<body><font face='Arial'><center><h1>Servidor web con NodeMCU.</h1>");
client.println("<h2><font color='#009900'>KIO4.COM - Juan A. Villalpando</font></h2>");
client.println("<h3>Página web.</h3>");
client.println("<br><br>");
client.println("<button>Juan Antonio </button>");
client.println("<button>KIO4.COM </button>");
client.println("<button>Buen tiempo. </button>");
client.println("<a href=\"/mensaje=4\"\"><button>Puerto Real </button></a>");
client.println("</font></center></body></html>");
Serial.println("Cliente desconectado.");
}
|
- He quitado la parte de la imagen, que estaba en el código del tutorial 62B:
client.println("<img src='http://kio4.esy.es/kio42.png'><br>");
ya que ahora no puede conectar con Internet, pues estamos en una red local Intranet.
- Vamos a nuestro móvil, entramos en la Configuracion de red. Establecemos la red ESPsoftAP_01
- En nuestro móvil, ejecutamos un navegador web y escribimos la dirección: 192.168.4.22
- Veremos la página web que nos ha suministrado este punto de acceso funcionado como servidor web. Los botones no realizan ninguna acción.
_____________________________________________________
6.- NodeMcu como punto de acceso y como servidor web. Pulsamos Botones en App Inventor y enviamos un mensaje al NodeMcu SoftAP-ServidorWeb que lo mostrará en pantalla LCD.
- Esto ya lo vimos en este tutorial:
74.- Desde App Inventor enviamos un mensaje al NodeMCU mediante WiFi.
- En este caso los mensajes de los Botones y el CampoDeTexto están en una aplicación de App Inventor.
- Cuando pulsemos un botón se enviará el mensaje indicado sobre él. Si escribimos un mensaje en el casillero y pulsamos "Enviar mensaje" se enviará el que hemos escrito.
- Además cuando enviemos información nos retornará el mensaje.
- Enviaremos algo así: http://192.168.4.22/mensaje=1?x=Hola+amigo
- Observa que ahora debemos poner la dirección del Punto de Acceso que es NodeMcu: 192.168.4.22
p74_nodemcu_mensaje_AP.aia
___________________________________________________
6A.- Diseño.
___________________________________________________
6B.- Bloques.
- Es el mismo código que vimos en: 74.- Desde App Inventor enviamos un mensaje al NodeMCU mediante WiFi.
- Solo he cambiado la última parte de la IP: 4.22
___________________________________________________
6C.- Conexión con la pantalla LCD.
- Es conveniente tener una pantalla LCD, pero si no la tienes puedes comprobar el funcionamiento en el Monitor Serie.
- Realizamos la siguiente conexión:
___________________________________________________
6D.- Código para enviar uno de los cuatro mensajes de los botones o un mensaje escrito en el casillero.
NodeMcu_AP_ServidorWeb.ino |
// Juan A. Villalpando
// Agosto 2018
// NodeMcu como Punto de Acceso y Servidor Web.
#include <ESP8266WiFi.h>
// SoftAP
IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);
// Web Server
WiFiServer server(80);
// LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <Wire.h>
String value = "-";
void setup()
{
Serial.begin(115200);
lcd.begin(16,2);// Columnas y filas de LCD
delay(10);
Serial.println();
Serial.print("Setting soft-AP configuration ... ");
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
Serial.print("Setting soft-AP ... ");
Serial.println(WiFi.softAP("ESPsoftAP_01") ? "Ready" : "Failed!");
Serial.print("Soft-AP IP address = ");
Serial.println(WiFi.softAPIP());
server.begin();
}
void loop() {
// Consulta si se ha conectado algún cliente.
WiFiClient client = server.available();
if (!client) {
return;
}
// Espera hasta que el cliente envíe datos.
Serial.println("Nuevo cliente.");
while(!client.available()){
delay(1);
}
// Lee la primera línea de la petición.
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Consulta la petición
if (request.startsWith("mensaje=1", 5)) { value = "Juan Antonio";}
if (request.startsWith("mensaje=2", 5)) { value = "KIO4.COM.";}
if (request.startsWith("mensaje=3", 5)) { value = "Buen tiempo.";}
if (request.startsWith("mensaje=4", 5)) { value = "Puerto Real";}
if (request.startsWith("x", 15)) { // Si en la posición 15 viene una x...
value = request.substring(17); // ... un mensaje comienza en la 17.
value.replace("+", " "); // Para que los espacios no salgan con +
value.replace(" HTTP/1.1", " "); // Para quitar HTTP/1.1
}
Serial.println(value);
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print(value);
// Devuelve el mensaje.
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // Comillas importantes.
client.print(value);
Serial.println("Cliente desconectado.");
}
|
___________________________________________________
6E.- Comentarios.
- Según llegue mensaje=1...mensaje=1, se escribirá un texto.
- Si en la posición 15 llega una x significa que es un mensaje del casillero, toma de la posición 17 al final.
- El mensaje viene así: Hola+amigo, replace + por espacio.
- Es una línea de texto muy larga, por eso la termino en comillas y comienzo otra con comillas para unirla. Cuidado con eso.
- ¿Qué pasaría si en el NodeMcu pusiera?
// SoftAP
IPAddress local_IP(192,168,1,22);
IPAddress gateway(192,168,1,9);
IPAddress subnet(255,255,255,0);
¿Sería la misma red que la de mi ordenador?, ya que las dos son 192.168.1.X
- Pues no, son dos redes distintas, desde la red del NodeMcu no puedes entrar en la red del ordenador aunque las dos sean 192.168.1.X
___________________________________________________
6F.- Serial Monitor.
___________________________________________________
___________________________________________________
___________________________________________________
___________________________________________________
7.- El NodeMcu como Punto de Acceso, Servidor Web y conectado a la red de Mi_Router.
- Fíjate ahora es NodeMcu es un Punto de Acceso que crea la red 192.148.4.9 y además es un Servidor Web con IP: 192.168.4.22
- El móvil se conecta a la red NodeMcu que es la ESPsoftAP_01 y puede obtener la página web.
- Además el NodeMcu está conectado a la red de Mi_Router que es la 192.168.1.1 y éste le asigna una IP: 192.168.1.9
- Así que el NodeMcu es un Servidor Web y además un intermediario entre las dos redes.
NodeMcu_AP_ServidorWeb.ino |
// Juan A. Villalpando
// Agosto 2018
// NodeMcu como Punto de Acceso y Servidor Web.
#include <ESP8266WiFi.h>
// SoftAP
IPAddress local_IP(192,168,4,22);
IPAddress gateway(192,168,4,9);
IPAddress subnet(255,255,255,0);
// Web Server
WiFiServer server(80);
const char* ssid = "red";
const char* password = "clave_red";
// LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
// LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#include <Wire.h>
String value = "-";
void setup()
{
Serial.begin(115200);
lcd.begin(16,2);// Columnas y filas de LCD
delay(10);
Serial.println();
Serial.print("Setting soft-AP configuration ... ");
Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!");
Serial.print("Setting soft-AP ... ");
Serial.println(WiFi.softAP("ESPsoftAP_01") ? "Ready" : "Failed!");
Serial.print("Soft-AP IP address = ");
Serial.println(WiFi.softAPIP());
// Servidor Web
server.begin();
// Conexion con Mi_Router
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Conectado con WiFi.");
// Inicio del Servidor web.
server.begin();
Serial.println("Servidor web iniciado.");
// Esta es la IP
Serial.print("Esta es la IP para conectar: ");
Serial.print("http://");
Serial.print(WiFi.localIP());
Serial.println("/");
}
void loop() {
// Consulta si se ha conectado algún cliente.
WiFiClient client = server.available();
if (!client) {
return;
}
// Espera hasta que el cliente envíe datos.
Serial.println("Nuevo cliente.");
while(!client.available()){
delay(1);
}
// Lee la primera línea de la petición.
String request = client.readStringUntil('\r');
Serial.println(request);
client.flush();
// Consulta la petición
if (request.startsWith("mensaje=1", 5)) { value = "Juan Antonio";}
if (request.startsWith("mensaje=2", 5)) { value = "KIO4.COM.";}
if (request.startsWith("mensaje=3", 5)) { value = "Buen tiempo.";}
if (request.startsWith("mensaje=4", 5)) { value = "Puerto Real";}
if (request.startsWith("x", 15)) { // Si en la posición 15 viene una x...
value = request.substring(17); // ... un mensaje comienza en la 17.
value.replace("+", " "); // Para que los espacios no salgan con +
value.replace(" HTTP/1.1", " "); // Para quitar HTTP/1.1
}
Serial.println(value);
lcd.clear(); // Borra pantalla
lcd.setCursor(0,0); // Inicio del cursor
lcd.print(value);
// Devuelve el mensaje.
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // Comillas importantes.
client.print(value);
Serial.println("Cliente desconectado.");
}
|
No llega a funcionar .ino |
// Juan A. Villalpando.
// KIO4.COM
// Creación de un Punto de Acceso.
#include <WiFi.h>
#include <WiFiClient.h>
#include <WiFiAP.h>
const char* ssid = "Juan";
const char* password = "123456789";
const char* ssid2 = "Nombre_red_Router";
const char* password2 = "Clave_router";
WiFiServer server(80);
#define LED2 2 // LED en terminal 2
String estado = "";
void setup() {
Serial.begin(115200);
pinMode(LED2, OUTPUT);
// Conecta a la red wifi.
Serial.println();
Serial.print("Configurando Punto de Acceso: ");
Serial.println(ssid);
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
// Esta es la IP
Serial.print("Esta es la IP para conectar: ");
Serial.print("http://");
Serial.println(myIP);
// Inicio del Servidor web.
server.begin();
Serial.println("Servidor web iniciado.");
// Conecta con mi Router
WiFi.begin(ssid2, password2);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Conectado con WiFi.");
// Esta es la IP
Serial.print("Esta es la IP para conectar: ");
Serial.print("http://");
Serial.println(WiFi.localIP());
//////////////////////////////////////////
}
void loop() {
// Consulta si se ha conectado algún cliente.
WiFiClient client = server.available();
if (!client) {
return;
}
Serial.print("Nuevo cliente: ");
Serial.println(client.remoteIP());
// Espera hasta que el cliente envíe datos.
while(!client.available()){ delay(1); }
/////////////////////////////////////////////////////
// Lee la información enviada por el cliente.
String req = client.readStringUntil('\r');
Serial.println(req);
// Realiza la petición del cliente.
if (req.indexOf("on2") != -1) {digitalWrite(LED2, HIGH); estado = "Encendido";}
if (req.indexOf("off2") != -1){digitalWrite(LED2, LOW); estado = "Apagado";}
//////////////////////////////////////////////
// Página WEB. ////////////////////////////
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println(""); // Comillas importantes.
client.println("<!DOCTYPE HTML>");
client.println("<html>");
client.println("<head><meta charset=utf-8></head>");
client.println("<body><font face='Arial'><center><h1>Servidor web con Wemos ESP32.</h1>");
client.println("<h2><font color='#009900'>KIO4.COM - Juan A. Villalpando</font></h2>");
client.println("<h3>Página web.</h3>");
client.println("<br><br>");
client.println("<img src='http://juanant91.byethost3.com/kio42.png'><br>");
client.println("<a href='on2'><button>Enciende LED2</button></a>");
client.println("<a href='off2'><button>Apaga LED2</button></a>");
client.println("<br><br>");
client.println(estado);
client.println("</font></center></body></html>");
Serial.print("Cliente desconectado: ");
Serial.println(client.remoteIP());
// client.flush();
// client.stop();
}
|
- El móvil lo conectamos a la red del NodeMcu.
- Podemos ver la página web desde el móvil y desde un navegador.
______________________________________________________
- Otro código:
https://learn.sparkfun.com/tutorials/esp8266-thing-hookup-guide/example-sketch-ap-web-server
________________________________
|