El Internet de las cosas (IoT) se podría definir de manera resumida diciendo que es una gran cantidad de objetos cotidianos que están conectados entre sí.
Entonces esta claro que la comunicación entre estos dispositivos es el pilar central del IoT y debido a que en una red IoT podemos llegar a tener una gran cantidad de dispositivos. Algunos de ellos requieren pocos recursos, como sensores o actuadores y otros serán más grandes como un servidor que recoge información, almacena datos, etc, el protocolo de comunicación debe cumplir con algunos requisitos que no son necesarios en otros tipos de comunicaciones.Tiene que ser escalable, los dispositivos se puedan añadir o retirarse dinámicamente sin que el comportamiento global del sistema se modifique.
Mantener débil el acoplamiento entre dispositivos, es decir que que la dependencia entre los dispositivos sea la menor posible o nula y requiera poca capacidad de procesado.
También vamos a buscar una solución que funcione en la mayor variedad de dispositivos, sistemas operativos, y lenguajes de programación.
Los mensajes transmitidos deben ser pequeños y no requieran un gran procesamiento.
Y claro tener presente el condicionante de la seguridad, ya que estos dispositivos están expuestos a Internet (que es un lugar nada seguro) y transmiten información privada e incluso controlan sistemas físicos.
Una solución inteligente consiste tener un servidor central que se encarga de recibir los mensajes de todos los dispositivos emisores y distribuirlos a los receptores, este servidor es conocido como Broker y es quien en definitiva organiza todo el tráfico de la red IoT.
Este servidor, tiene una dirección IP fija de forma que es accesible por todos los dispositivos, el servidor mantiene un registro de los dispositivos conectados, recibe los mensajes, y los distribuye al resto dispositivos, filtrando los destinatarios según algún criterio.
Los dispositivos en ningún momento 'ven' o dependen del resto de dispositivos. Por tanto, esta infraestructura proporciona escalabilidad.
El método Publicar/Suscribir es un esquema de mensajería donde un nodo el 'Subscriber', informa al Broker que quiere recibir un tipo de mensajes y otro nodo el 'Publisher' puede publicar mensajes.
Estos mensajes se discriminan en forma de tópicos, entonces el Broker distribuye los mensajes a todos los nodos que se han suscrito a un tópico determinado.

Que es MQTT?

Es un protocolo de comunicación M2M (machine-to-machine), se basa en la pila TCP/IP como base para la comunicación,en MQTT cada conexión se mantiene abierta y se "reutiliza" en cada comunicación.
Es una diferencia, por ejemplo, a una petición HTTP 1.0 donde cada transmisión se realiza a través de conexión.
Originalmente fue creado por IBM y en 2014 paso a ser un estándar para IoT. Es un servicio publicador/suscriptor (pub-sub) donde los nodos o clientes se conectan con un servidor central o broker. Los mensajes que son enviados a cada cliente en topics organizados de manera jerárquica y un cliente puede publicar un mensaje en un determinado topic. Otros clientes pueden suscribirse a este topic, y el broker le hará llegar los mensajes suscritos.
Por defecto, MQTT emplea el puerto 1883 y el 8883 cuando funciona sobre TLS. (Mas info para MQTT puede consultar en este link).
Ok, entonces si quiero hacer algo con MQTT necesito un Broker. Hay muchas opciones pero en este ejemplo usamos Mosquitto, es de uso libre, escrito en C y es compatible con Windows, Linux y Mac.
Este Broker es muy simple de usar, casi no consume recursos y es muy usado en el mundo IoT. Lo hemos instalado en una placa Raspberry PI y vamos a publicar "topicos" con datos de temperatura, presión y humedad desde un ESP32 conectado a un sensor BME280.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# ================================================================
# - Descripción  : Programa ejemplo con ESP32 + BME280 + MQTT.
# - Target       : ESP32 (Tensilica Xtensa LX6 Dual Core 240 Mhz)
# - ToolChain    : Micropython + Thonny IDE
# - 
# - www.firtec.com.ar
# =================================================================
import machine
from time import sleep
import utime as time
import sys
import BME280
from umqtt.robust import MQTTClient
import network
import utime
 
import gc
gc.collect()    # Limpiar posible basura en memoria
 
sda = machine.Pin(21)  
scl = machine.Pin(22)  
 
i2c = machine.I2C(0, sda=sda, scl=scl, freq=100000)
led = machine.Pin(5,machine.Pin.OUT)
led.off()
 
client = MQTTClient("esp32-01", "192.168.0.80") # IP del Broker (Raspberry en este caso)
sta = network.WLAN(network.STA_IF)
if not sta.isconnected():
  print('Conectando con la red WiFi...')
  sta.active(True)
  sta.connect('Firtec_lab1', 'aba735')
  
  while not sta.isconnected():
    pass
print("Ip asignada:",sta.ifconfig()[0])
 
 
def publish():
    while True:
        bme = BME280.BME280(i2c=i2c)
        temp = bme.temperature
        hum = bme.humidity
        pres = bme.pressure
        msg = b'{"Temperatura":%s,"Humedad":%s,"Presion":%s}' % (temp, hum, pres)
        client.publish(b"firtec/bme280", msg)
        time.sleep(20)
 
client.reconnect()
 
publish()

MicroPython tiene una biblioteca específica para MQTT que funciona muy bien, solo debemos informar cual es la dirección IP donde se encuentra el Broker. 
Para verificar su funcionamiento podemos abrir una consola en Raspberry y escribimos <mosquitto_sub -v -t 'firtec/bme280'> Con esto estamos creando un cliente que suscribe al tópico firtec/bme280.

Como se puede ver el cliente recibe los datos del tópico enviado por ESP32, también podríamos hacer lo mismo usando Node-Red y crear una interfaz mas simpática que reciba los datos del tópico como se aprecia en la siguiente imagen.

Si necesitamos tener los datos en el móvil desde el Play Store descargamos alguna de las tantas aplicaciones para MQTT y podremos acceder a los datos desde cualquier lugar.

 Como se puede ver con MQTT tenemos acceso a cualquier sensor conectado a la red, también podríamos publicar, es decir enviar órdenes o comandos para encender luces, activar puertas, alarmas o cualquier cosa que requiera control a distancia.

(Material extraído de uno de nuestros libros para MicroPython).

Consultas: Esta dirección de correo electrónico está siendo protegida contra los robots de spam. Necesita tener JavaScript habilitado para poder verlo.