Documentos de Académico
Documentos de Profesional
Documentos de Cultura
30 DICIEMBRE, 2021
Nueva entrada sobre comunicación con el ESP8266 y ESP32. Esta vez nos toca
ver cómo comunicar una página web servida desde el ESP32 a través de MQTT.
Anuncio:
Aquí es donde nos encontramos el primer problema, cómo podemos
comunicar una página web, que vive en su "mundo web" de llamadas HTTP, con
una comunicación por MQTT.
#
=================================================================
# Extra listeners
#
=================================================================
...
listener 9001
protocol websockets
...
Así hemos añadido un listener extra para Mosquitto, a través de websockets
actuando en el puerto 9001.
VAMOS AL CÓDIGO
Ahora que hemos configurado nuestro broker para aceptar comunicación por
websockets, y con nuestra librería Paho JS Client, toca juntarlo todo para ver un
ejemplo.
#include <WiFi.h>
#include <SPIFFS.h>
#include <ESPAsyncWebServer.h>
#include <AsyncMqttClient.h>
#include <ArduinoJson.h>
#include "Server.hpp"
#include "MQTT.hpp"
#include "ESP32_Utils.hpp"
#include "ESP32_Utils_MQTT_Async.hpp"
void setup(void)
Serial.begin(115200);
SPIFFS.begin();
delay(500);
WiFi.onEvent(WiFiEvent);
InitMqtt();
ConnectWiFi_STA();
InitServer();
void loop()
PublishMqtt();
delay(1000);
}
Donde la diferencia es que hemos añadido una llamada a 'InitServer()' para
poder servir la página web desde el ESP32. Además, hemos añadido los includes
pertinentes.
AsyncWebServer server(80);
void InitServer()
server.onNotFound([](AsyncWebServerRequest *request) {
server.begin();
}
Simplemente estamos sirviendo una página web desde SPIFFS, algo que ya
hemos visto en el resto de entradas de la serie.
<!doctype html>
<html lang="">
<head>
<title>ESP32 MQTT</title>
<meta charset="utf-8">
<title></title>
</head>
<body>
<div id="app">
</div>
</html>
En el fichero 'API.js' tenemos encapsuladas las funciones asociadas al flujo de
trabajo de nuestra aplicación.
function onConnect() {
var options = {
qos: 0,
onSuccess: onSubSuccess,
onFailure: onSubFailure
};
client.subscribe('hello/world', options);
function onFailure(message) {
console.log(message)
function onConnectionLost(responseObject) {
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:" + responseObject.errorMessage);
function onMessageArrived(message) {
console.log(message)
newElement.appendChild(document.createTextNode(json.data));
element.appendChild(newElement);
function onSubFailure(message) {
console.log(message)
function onSubSuccess(message) {
console.log(message)
}
A destacar, en el método 'onConnect()' nos suscribimos al topic 'hello/world'.
Por su parte, el método 'onMessageArrived' recibe un texto formateado como
JSON, lo parsea, y usa un poquito de Vanilla JavaScript para añadir el contenido del
mensaje a la página web. El resto de funciones de este ejemplo únicamente
muestran por consola los datos para debug.
function createGuid() {
var r = Math.random() * 16 | 0,
return v.toString(16);
});
var options = {
onSuccess: onConnect,
onFailure: onFailure
};
client.onConnectionLost = onConnectionLost;
client.onMessageArrived = onMessageArrived;
client.connect(options);
Como vemos, hemos definido un cliente de MQTT con la librería Paho, donde
especificamos la dirección de nuestro broker, el puerto de escucha para
websokets, y un identificador único para el cliente.
Para el identificador hemos usado una función que genera GUID de forma
aleatoria, aunque podríamos haber usado cualquier otra, siempre que no
repitamos identificador de cliente.
Por último, hemos asociado cada los eventos del cliente de MQTT a nuestras
funciones del fichero 'API.js'
Con esto, subimos tanto el programa como la web al ESP32, ejecutamos todo,
y accedemos a la página web servida desde el ESP32. Si todo ha salido
bien veremos aparecer los mensajes recibidos que se irán añadiendoa la página
web servida.
DESCARGA EL CÓDIGO
Todo el código de esta entrada está disponible para su descarga en Github.
Versión para el ESP8266: https://github.com/luisllamasbinaburo/ESP8266-
Examples
Si te ha gustado esta entrada y quieres leer más sobre ESP8266 o el ESP32 puedes
consultar la sección tutoriales de ESP8266/32
Anuncio: