Módulo MQTT
El módulo MQTT es una biblioteca esencial en JARU que brinda un conjunto robusto de herramientas para facilitar la comunicación y el intercambio de mensajes basados en el protocolo MQTT (Message Queuing Telemetry Transport). Este protocolo es ampliamente reconocido y utilizado en el mundo del Internet de las Cosas (IoT), donde dispositivos de distintas naturalezas necesitan comunicarse de manera eficiente y ligera.

Este módulo es particularmente valioso para desarrolladores que trabajan en el ámbito de dispositivos conectados, desde pequeños sensores hasta complejos sistemas embebidos. Ya sea que estés buscando enviar datos desde un sensor a un servidor centralizado o recibir instrucciones y comandos desde un broker MQTT hacia tu dispositivo, el módulo MQTT de JARU te proporciona las herramientas necesarias para hacerlo de manera sencilla y efectiva.
Uso
use MQTT
Con el módulo MQTT, puedes fácilmente suscribirte a temas específicos, publicar mensajes y establecer funciones de callback que se activan al recibir ciertos mensajes. Todo ello mientras mantienes un bajo consumo de recursos, aspecto esencial en dispositivos IoT.
Funciones
publish
La función publish del módulo MQTT permite enviar mensajes a través del protocolo MQTT. Esta función te permite publicar información, datos o comandos a un tema específico, facilitando la comunicación entre dispositivos en una red MQTT.
MQTT.publish(topic, payload)
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
topic | string | Cadena de caracteres que define el tema (o "canal") al que se enviará el mensaje |
payload | string | Contenido del mensaje que deseas enviar |
Retorno
Devuelve true si el mensaje se publica con éxito. En caso contrario, devuelve un valor de error.
Ejemplo
use MQTT
var temperatura = 25.5
MQTT.publish("sensores/temperatura", temperatura)
// Publicar datos JSON
MQTT.publish("dispositivo/estado", '{"activo": true, "bateria": 85}')
Es importante tener en cuenta las convenciones y estructuras de los temas en MQTT para garantizar una comunicación efectiva. La elección adecuada de los temas y la estructura jerárquica pueden mejorar significativamente la eficiencia y claridad de tu sistema.
subscribe
La función subscribe del módulo MQTT te permite suscribirte a un tema específico en MQTT, lo que significa que tu dispositivo estará atento y recibirá todos los mensajes publicados en ese tema.
MQTT.subscribe(topic)
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
topic | string | Cadena de caracteres que define el tema al que deseas suscribirte |
Retorno
Devuelve true si la suscripción al tema es exitosa. En caso de algún problema, devuelve un valor de error.
Ejemplo
use MQTT
MQTT.subscribe("hogar/salon/iluminacion")
MQTT.subscribe("comandos/#") // Suscripción con wildcard
La elección del tema al que te suscribes es fundamental. Es recomendable tener una estructura y nomenclatura bien definida para los temas en tu red MQTT, asegurando que cada dispositivo se suscriba solo a la información que realmente necesita.
unsubscribe
La función unsubscribe permite cancelar la suscripción a un tema MQTT previamente suscrito. Esto es útil cuando ya no necesitas recibir mensajes de un tema específico.
MQTT.unsubscribe(topic)
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
topic | string | Cadena de caracteres que define el tema del que deseas desuscribirte |
Retorno
Devuelve true si la desuscripción es exitosa.
Ejemplo
use MQTT
// Suscribirse a un tema
MQTT.subscribe("sensores/temperatura")
// Más tarde, desuscribirse
MQTT.unsubscribe("sensores/temperatura")
callback
La función callback establece una función de JARU que será invocada automáticamente cada vez que se reciba un mensaje en alguno de los temas suscritos. Esta es la forma principal de procesar mensajes MQTT entrantes.
MQTT.callback(funcion)
Parámetros
| Parámetro | Tipo | Descripción |
|---|---|---|
funcion | closure | Función que recibirá dos parámetros: topic (tema) y payload (contenido del mensaje) |
Retorno
Devuelve true si el callback se establece correctamente.
Ejemplo
use MQTT
// Definir la función que procesará los mensajes
func procesarMensaje(topic, payload)
println("Topic: ", topic)
println("Mensaje: ", payload)
if (topic == "comandos/led") then
if (payload == "on") then
GPIO.write(2, GPIO.HIGH)
else
GPIO.write(2, GPIO.LOW)
end
end
end
// Establecer el callback
MQTT.callback(procesarMensaje)
// Suscribirse a los temas
MQTT.subscribe("comandos/led")
MQTT.subscribe("comandos/motor")
El callback se ejecuta automáticamente cuando llega un mensaje MQTT. La función recibe siempre dos parámetros: el tema (topic) donde se publicó el mensaje y el contenido (payload) del mismo.
isConnect
La función isConnect permite verificar el estado de la conexión con el broker MQTT. Es útil para comprobar si el dispositivo está conectado antes de intentar publicar mensajes o para implementar lógica de reconexión.
MQTT.isConnect()
Parámetros
Esta función no recibe parámetros.
Retorno
| Valor | Descripción |
|---|---|
true | El dispositivo está conectado al broker MQTT |
false | El dispositivo no está conectado |
Ejemplo
use MQTT
// Verificar conexión antes de publicar
if (MQTT.isConnect()) then
MQTT.publish("sensores/estado", "activo")
println("Mensaje enviado")
else
println("Error: No hay conexión MQTT")
end
// Bucle con verificación de conexión
while (true)
if (MQTT.isConnect()) then
var temp = leerTemperatura()
MQTT.publish("sensores/temperatura", temp)
else
println("Esperando conexión...")
end
pause(5000)
end
pubinfo
La función pubinfo publica información del hardware del dispositivo. Esta función es útil para diagnósticos y para identificar dispositivos en una red IoT.
MQTT.pubinfo()
Parámetros
Esta función no recibe parámetros.
Retorno
Devuelve true tras publicar la información.
Ejemplo
use MQTT
// Publicar información del hardware
MQTT.pubinfo()
// Imprime: {"HWVersion":"0.9.8"}
Ejemplo completo: Sistema IoT
use MQTT
use GPIO
// Configurar LED
GPIO.pinmode(2, GPIO.OUT)
// Variable para almacenar último estado
var ultimoEstado = "desconocido"
// Función callback para procesar mensajes
func onMensaje(topic, payload)
println("[MQTT] ", topic, " -> ", payload)
if (topic == "dispositivo/led") then
if (payload == "on") then
GPIO.write(2, GPIO.HIGH)
ultimoEstado = "encendido"
elsif (payload == "off") then
GPIO.write(2, GPIO.LOW)
ultimoEstado = "apagado"
end
// Confirmar el cambio de estado
MQTT.publish("dispositivo/led/estado", ultimoEstado)
end
end
// Configurar callback
MQTT.callback(onMensaje)
// Suscribirse a temas
MQTT.subscribe("dispositivo/led")
MQTT.subscribe("dispositivo/config")
// Bucle principal
while (true)
if (MQTT.isConnect()) then
// Publicar heartbeat cada 10 segundos
MQTT.publish("dispositivo/heartbeat", "alive")
end
pause(10000)
end
Ejemplo: Sensor de temperatura
use MQTT
use GPIO
var pinSensor = 34
func leerTemperatura()
var valor = GPIO.aread(pinSensor)
// Convertir a temperatura (ejemplo simplificado)
return (valor / 4095.0) * 100.0
end
// Callback para comandos
func onComando(topic, payload)
if (payload == "leer") then
var temp = leerTemperatura()
MQTT.publish("sensor/temperatura/valor", temp)
end
end
MQTT.callback(onComando)
MQTT.subscribe("sensor/temperatura/comando")
// Publicar temperatura periódicamente
while (true)
if (MQTT.isConnect()) then
var temp = leerTemperatura()
MQTT.publish("sensor/temperatura", temp)
end
pause(30000) // Cada 30 segundos
end
Configuración de conexión
La configuración de conexión al broker MQTT (servidor, puerto, credenciales) se realiza a través de JARU Tools o el archivo de configuración boot.cfg del dispositivo ESP32. El módulo MQTT utiliza esta configuración automáticamente al iniciar.
Plataformas soportadas
| Plataforma | Soporte | Notas |
|---|---|---|
| Windows (SDL2) | ✅ | Requiere broker MQTT accesible |
| ESP32 | ✅ | Soporte completo con WiFi |
| Emscripten (Web) | ❌ | No disponible |
| SiFive | 🚧 | En desarrollo |