Saltar al contenido principal
octubre 13, 2020

IoT Hub: Enrutando mensajes hacia diferentes destinos

No hace mucho vine a hablaros de como utilizar IoT Edge para poder desplegar cargas de trabajo sobre infraestructura «on-prem», resolviendo así los problemas asociados a latencias de red o protección de datos (recordemos que con un modelo de procesado usando IoT Edge, lo datos se procesan dentro de la infraestructura del cliente).

No me cansaré de decir que cada cliente es un mundo y las necesidades de uno no suelen encajar con las de otro. Es algo que me encanta porque hace más entretenido el día a día, pero hace que nuestra solución de IoT basada en Azure (Smart Concepts) tenga que ser flexible y adaptarse.  Vamos a recordar el escenario básico que tenemos:

  1. Dispositivos mandan datos a IoT Hub.
  2. Una Azure Function recoge los datos desde Event Grid, los procesa y los persiste.
  3. Se explotan y monitorizan.

La imagen muestra el diagrama de flujo donde un mensaje llega a IoT Hub, una azure function lo recoje y lo manda a la persistencia. Desde ahí se usa para predicciones y monitoriación.

El problema

Aunque este modelo es eficaz y funcional, nuestro cliente se ha visto en la necesidad de mandar una serie de datos críticos para su negocio como parte de los datos. Un buen caso de esto podría ser por ejemplo mandar alarmas de los dispositivos, nadie quiere que una alarma pase desapercebida, ¿no? ¿Qué pasaría si nuestro procesado está caído o parado el tiempo de vida del mensaje en Event Grid? ¿Y si el procesado falla?

Enrutado de mensajes al rescate

Una buena solución a esto, por ejemplo, es enrutar los mensajes hacia un Azure Storage y que IoT Hub envíe directamente, o hacia un Service Bus, etc. Podríamos redefinir nuestro escenario anterior cambiando un poco el planteamiento para que todos los mensajes se reciban en una Azure Function, y esta los despache hacia las rutas que le correspondan:

La imagen muestra el diagrama de flujo donde un mensaje llega a IoT Hub, donde una azure function lo reenvia a eventhub/service bus/storage. Independientemente de a donde va, una azure function lo recoje y lo manda a la persistencia. Desde ahí se usa para predicciones y monitoriación.

 

Si nos fijamos, el escenario es exactamente igual que el anterior, pero hemos añadido una Azure Function que se encarga de despachar los mensajes hacia diferentes rutas, de donde los recogerá nuestro sistema de procesado para continuar. Esto nos aporta por un lado la posibilidad de utilizar una persistencia más duradera para los mensajes, y por otro lado nos obliga a añadir infraestructura extra que además debe ser capaz de procesar la cantidad de mensajes que llegan desde IoT Hub. Esto último no siempre es fácil ya que IoT Hub es un servicio pensado para poder recibir un gran volumen de mensajes, propio de los escenarios IoT.

Filtro y enrutado de mensajes desde IoT Hub

Por suerte, IoT Hub soporta de manera nativa ese escenario de filtrado de mensajes para enrutarlos hacia diferentes destinos. Concretamente, IoT Hub soporta al momento de escribir esto hasta 10 rutas diferentes. Por aclarar a que me refiero con ruta, una ruta de IoT Hub es la «tubería» y el filtro que se encargan de hacer que un mensaje llegue al destino. También es importante señalar que las rutas de IoT Hub no son excluyentes, es decir, un mensaje puede ser enviado a más de un destino si se cumplen los filtros de varias rutas.

Nuestro nuevo escenario sería algo como esto:

La imagen muestra el diagrama de flujo donde un mensaje llega a IoT Hub, si cumple la query 1 va a eventhub, si cumple la query2 va a service bus y si cumple la query 3 va a storage. Independientemente de a donde va, una azure function lo recoje y lo manda a la persistencia. Desde ahí se usa para predicciones y monitoriación.

 

Lo mejor de todo esto, es que esas «queries» con las que vamos a hacer el filtro, pueden utilizar cualquiera de las propiedades, pero también son capaces de utilizar el propio cuerpo del mensaje.

Para que se pueda usar el cuerpo del mensaje hay que cumplir una sería de requisitos como que este en «UTF-8» y el atributo «contentType» sea «application/json«.

Una vez teniendo esto claro, vamos a ver cómo llevarlo a cabo, en este caso, por ejemplo, para enrutar los mensajes hacia un storage.

Creando una ruta desde IoT Hub hacia un Azure Storage

Para este caso, vamos a asumir que ya tenemos creado nuestro IoT Hub y nuestra cuenta de Azure Storage. Lo primero que vamos a hacer es ir a nuestra instancia de IoT Hub y dentro de ella a la sección de enrutado de mensajes, donde crearemos un nuevo punto de conexión dándole al botón de agregar:

La imagen señala con flechas y números los pasos. El primer paso es pulsar sobre el botón de enrutado de mensajes del menu lateral izquierdo. El segundo botón es la pestaña de "Puntos de xonexión personalizados". El tercer botón es el de agregar.

Sobre el menú contextual que nos muestra el botón de agregar, pulsaremos sobre la opción de «Almacenamiento». Sobre esto, un nuevo formulario nos va a ir guiando para crear el punto de conexión, donde seleccionaremos cosas como el nombre del punto, la cuenta y contenedor de almacenamiento donde se van a guardar, así como el nombre del fichero y la frecuencia con la que se guarda.

Una vez que lo hayamos guardado, deberíamos encontrarnos con que ahora podemos encontrarnos el punto de conexión en dentro de la sección de almacenamiento:

La imagen muestra un endpoint llamado sample dentro de la sección de "Almacenamiento"

Una vez que tenemos el punto de conexión listo, solo nos falta crear el enrutado que haga la magia. Para esto, basta con volver a la pestaña de rutas y pulsar sobre el botón de agregar:

La imagen señala con flechas y números los pasos. El primer paso es la pestaña de "Rutas". El segundo botón es el de agregar.

Nuevamente, esto nos lleva a un formulario donde se nos piden datos como el nombre de la ruta, el punto de conexión donde queremos enviar los mensajes, el origen de los datos, y la consulta de enrutamiento:

La imagen muestra el formulario de creación de rutas, donde se señalan los campos de entrada del nombre, punto de conexión, consulta de aplicación, y el botón de guardar.

Si ahora enviamos un mensaje a IoT Hub desde un dispositivo, podremos encontrarnos con que dentro de nuestra cuenta de Azure Storage se ha creado un fichero con el mensaje recibido. Esto es así porque ahora mismo, la consulta de enrutado es siempre «true» por lo que siempre aplicará, va a ser al modificar esta consulta por una que cumpla con nuestras necesidades cuando vamos a poder aplicar la ruta correctamente.

Para esto simplemente vamos a cambiar el valor de «true» de la consulta por una expresión que devuelva un «true» o un «false». Esto vamos a poder hacerlo utilizando la sintaxis de consultas de IoT Hub. Además, la interfaz web nos permite probar las consultas in situ pudiendo simular el mensaje gracias a las opciones de prueba que nos da. Esto es tan simple como expandir la sección de pruebas, y añadir unos datos de muestra en la sección correspondiente (propiedades, cuerpo, dispositivo gemelo). Una vez añadidos los datos de muestra, simplemente vamos escribiendo nuestra consulta y pulsando sobre el botón «Probar la ruta» para validar si la consulta se activaría o no:

La imagen muestra el formulario de IoT Hub donde se pueden añadir los valores que debería tener el mensaje para poder probar la consulta. También señala el mensaje de resultado donde dice : "El mensaje coincide con la consulta"

jorge turrado
Autor
Jorge Turrado Ferrero
Software Development Engineer

Formulario de descarga

¡Gracias!