- Dos servidores MQTT gratuitos para tus proyectos IoT. Parte 1
- Dos servidores MQTT gratuitos para tus proyectos IoT. Parte 2
A la hora de poner en marcha tus proyectos de IoT utilizando el protocolo MQTT necesitarás un broker que administre el flujo de información. Existen muchos en la red, algunos gratuitos y otros de pago. En este artículo te enseño a configurar y utilizar las dos opciones gratuitas que nos ofrece la empresa Hive MQ empleando el lenguaje Micropython.
Introducción
Hive MQ es una empresa que brinda distintos servicios de IoT, entre ellos los de Broker para el protocolo MQTT. Además de los planes pagos, ofrece dos opciones de servidores MQTT o broker sin costo que puedes utilizar para hacer pruebas y aprender el funcionamiento del protocolo y hasta poner en marcha pequeños proyectos de bajo tráfico.
La primera opción es un servidor público o abierto que se puede utilizar con una configuración mínima y permite empezar a probar el sistema en unos minutos. El otro es un servidor privado que cuenta con distintos planes de pago, pero que incluye también una opción totalmente gratuita.
Voy a dividir esta publicación en dos artículos. En el primero te voy a mostrar como utilizar el servidor público y en la segunda el privado con su plan gratuito.
Todos los programas utilizados en esta publicación han sido probados con una placa ESP32 VROOM y una Raspberry Pico W y funcionan correctamente en cualquiera de ellas sin ninguna modificación.
Servidor público
El servidor público de Hive MQ es sumamente simple de utilizar, lo cual es una gran ventaja. Puedes publicar información y suscribirte a distintos tópicos para recibirla de una manera rápida y sencilla ya que no requiere utilizar ningún tipo de nombre de usuario o contraseña. De allí la denominación de servidor público.
Sin embargo, esto tiene como contraparte que cualquiera que se conecte al servidor puede leer la información que subas o incluso publicar en tus mismos tópicos.
Por lo tanto, este servidor sirve para hacer las primeras pruebas pero de ninguna manera se lo debería utilizar en un proyecto en que necesites mantener a salvo tu información.
Se puede acceder a un dashboard en tiempo real de este servidor que muestra el tráfico que está administrando.
Datos de acceso
Todo lo que necesitas para conectarte al servidor público son su dirección y número de puerto:
Dirección: broker.hivemq.com
Port: 1883
Programa de ejemplo
El siguiente es un ejemplo en Micropython que envía valores de temperatura y humedad al servidor público. A los fines de enfocarnos en la comunicación con el servidor, estos valores son constantes y no provienen de un sensor real, pero el programa se puede modificar fácilmente para incluir uno.
Si tienes planeado utilizar una Raspberry Pico W, deberías instalar previamente el módulo mqtt.simple, ya que no viene incluido en su versión del firmware de Micropython. Para ello te invito a que veas las instrucciones en el Anexo
Si vas a utilizar una placa con ESP32, el firmware de Micropython ya tiene incluida la librería mqtt.simple y no necesitas realizar ninguna instalación (yo he utilizado la versión 1.19)
#Envia temperatura y humedad a Hive MQ usando MQTT #Usa el broker publico from umqtt.simple import MQTTClient import network, time,gc def conectaWifi (red, password): global miRed miRed = network.WLAN(network.STA_IF) if not miRed.isconnected(): #Si no está conectado… miRed.active(True) #activa la interface miRed.connect(red, password) #Intenta conectar con la red print('Conectando a la red', red +"…") timeout = time.time () while not miRed.isconnected(): #Mientras no se conecte.. if (time.ticks_diff (time.time (), timeout) > 10): return False return True # Parametros. Cambiar los que comienzan con "Tu_" wifiSSID = "Tu_red" wifiPass = "Tu_contraseña" mqttServer = b"broker.hivemq.com" mqttPort = 1883 mqttClientID = b"ESP32" mqttUser = b"" mqttPass = b"" mqttTopicTemp = b"test/Temperatura" mqttTopicHum = b"test/Humedad" if conectaWifi (wifiSSID, wifiPass): print ("Conexión exitosa!") print('Datos de la red (IP/netmask/gw/DNS):', miRed.ifconfig()) cliente = MQTTClient(client_id=mqttClientID, server=mqttServer, port=mqttPort, user=mqttUser, password=mqttPass, keepalive=7200, ssl=False) cliente.connect () while (True): time.sleep (20) #Datos constantes de prueba Temperatura = 27 Humedad = 60 #Publicar los datos cliente.publish(topic=mqttTopicTemp, msg=str(Temperatura)) time.sleep (2) cliente.publish(topic=mqttTopicHum, msg=str(Humedad)) print ("Datos enviados!") gc.collect () else: print ("Imposible conectar") miRed.active (False)
Analicemos el código anterior:
En la línea 4 se importa la clase MQTTSimple desde el módulo mqtt.simple.
En la línea 6 se importan otros módulos que se usarán mas adelante.
Desde la línea 8 a la 19 está la función conectaWifi que sirve para conectar a la red wifi.
def conectaWifi (red, password): global miRed miRed = network.WLAN(network.STA_IF) if not miRed.isconnected(): #Si no está conectado… miRed.active(True) #activa la interface miRed.connect(red, password) #Intenta conectar con la red print('Conectando a la red', red +"…") timeout = time.time () while not miRed.isconnected(): #Mientras no se conecte.. if (time.ticks_diff (time.time (), timeout) > 10): return False return True
Entre las líneas 22 a la 30 se definen los distintos parámetros que se necesitan para la conexión Wifi y la del broker MQTT:
wifiSSID = Nombre de la red wifi
wifiPass = Contraseña de la red wifi
mqttServer = b”broker.hivemq.com”
mqttPort = 1883
mqttClientID = b”ESP32″ (Esto lo puedes cambiar a gusto)
mqttUser = b”” (Vacío, no es necesario)
mqttPass = b”” (Vacío, no es necesario)
mqttTopicTemp = b”test/Temperatura” (Topic para publicar valores de temperatura)
mqttTopicHum = b”test/Humedad” (Topic para publicar valores de humedad)
Los textos tienen delante la letra “b” para que Micropython los trate como objetos de tipo “bytes”, en lugar de objetos de tipo cadenas de texto (strings).
La diferencia entre estos dos tipos de objetos es que los bytes son una secuencia de números enteros, mientras que las cadenas de texto (strings) son una secuencia de caracteres Unicode.
Este es un requisito del módulo mqtt.simple (y es una práctica común en la comunicación de dispositivos IoT para reducir la cantidad de datos a transmitir).
En la línea 32 la placa se conecta a la red Wifi y en la 38 se crea el objeto “Cliente” mediante un constructor que emplea los parámetros que se definieron mas arriba (línea 22).
La placa se conecta al broker en la linea 41 y en la 44 se inicia un bucle sin final.
El contenido de este bucle se repite cada 20 segundos.
En las líneas 49 y 50 se cargan con valores constantes las variables Temperatura y Humedad y a partir de la línea 54 se publican estos valores en dos tópicos, haciendo un retardo de 2 segundos entre ellos.
No es necesario crear un tópico en el servidor para publicar en él. Si no existe, se crea al realizar la primera publicación.
Luego se hace limpieza de la memoria y se cierra el bucle.
Monitoreando los datos enviados
Seguramente querrás comprobar que los datos enviados por el programa anterior lleguen correctamente al servidor.
Para ello puedes utilizar otra herramienta que pone a disposición de manera libre Hive MQ: el cliente Web (aunque puedes usar cualquier otro, como MQTT X).
Este cliente está accesible en esta dirección: http://www.hivemq.com/demos/websocket-client/
El valor de host es el que corresponde al servidor público, broker.hivemq.com. Port debe valer 8000 porque estás accediendo al servidor a través de la Web y ClientID es un valor generado al azar que puedes cambiar si quieres e identifica a este cliente (Pero no debe coincidir con el valor que cargaste en mqttClientID en el programa en Micropython para que no se generen confusiones).
Para poder ver los valores que publica la placa debes hacer dos suscripciones, a los topic:
test/Temperatura
test/Humedad
Para el primero debes hacer click en Subscriptions, luego en Add New Topic Subscription y completar el nombre del topic:
Con el mismo procedimiento debes suscribirte al topic test/Humedad.
Una vez completado el proceso, se debe ver de esta forma:
Y en la ventana Messages ya podrás ver los datos enviados desde la placa:
Desde el mismo cliente puedes publicar en estos canales (o cualquier otro)
… y ver el resultado
Como dije al principio, cualquiera que ingrese al servidor podría leer estos tópicos o publicar en ellos, por eso el uso de este broker está limitado a pruebas de funcionamiento, ya que no brinda ningún tipo de seguridad. Si necesitas seguridad, debes emplear el servidor privado.
Conclusiones
En esta primera parte te mostré los pasos necesarios para acceder al broker público de Hive MQ con un ejemplo en Micropython. Puedes adaptar este programa según tus necesidades para practicar los fundamentos de MQTT con este broker.
Sin embargo, la posibilidad de que cualquiera acceda a los datos que son públicos limita bastante su utilidad, por lo que en la segunda entrega te explicaré como hacer lo mismo con un servidor privado.
Nos vemos en la próxima! Como siempre, cualquier duda o sugerencia, puedes dejarla mas abajo en la sección de comentarios.
Anexo: Raspberry Pico W
El firmware de Micropython para Raspberry Pico W no tiene incluido el módulo umqtt.simple, así que antes de probar el código de ejemplo deberás instalarlo en tu placa.
Para ello, conecta la placa, actualiza el firmware a la última versión de Micropython (a la fecha es la 1.19) y realiza una conexión con la red Wifi introduciendo los siguientes comandos en la consola (o REPL). En este caso yo he utilizado Thonny:
En las partes borroneadas debes introducir el nombre de tu red Wifi y su contraseña.
Con la placa conectada, hay que importar el modulo mip, un instalador que puede descargar módulos de distintas ubicaciones y copiarlos al sistema de archivos de la placa y utilizarlo para instalar umqtt.simple:
Si no hay ningún error, el módulo umqtt.simple se copia a la carpeta lib y la Pico ya está lista para correr el programa de ejemplo.
Quería comentar mi mqtt público, aunque segmentado para que nadie interfiera con otros usuarios.
La documentación del servidor está en https://www.foroelectro.net/arduino/es/mqtt-doc
Y lo mejor, se puede usar en cualquier navegador: https://www.foroelectro.net/arduino/es/mqtt
Disfrutadlo! Me encanta haber montado este proyecto.