Saltar al contenido principal

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.

JARU MQTT Module

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ámetroTipoDescripción
topicstringCadena de caracteres que define el tema (o "canal") al que se enviará el mensaje
payloadstringContenido 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}')
Buenas prácticas

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ámetroTipoDescripción
topicstringCadena 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
Organización de temas

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ámetroTipoDescripción
topicstringCadena 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ámetroTipoDescripción
funcionclosureFunció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")
Procesamiento de mensajes

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

ValorDescripción
trueEl dispositivo está conectado al broker MQTT
falseEl 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

Configuración del broker

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

PlataformaSoporteNotas
Windows (SDL2)Requiere broker MQTT accesible
ESP32Soporte completo con WiFi
Emscripten (Web)No disponible
SiFive🚧En desarrollo