martes, 24 de octubre de 2017

Conexión con Azure IoT Hub mediante .Net

Vamos a tomar un primer contacto con Azure IoT Hub, para lo que ‘trastearemos’ con el portal de Azure y, posteriormente, crearemos unas aplicaciones que publican información en el IoT Hub y que consumen esa misma información.

Primero un poco de información…

¿Qué es el Azure IoT Hub?

La definición oficial sería:

El Centro de IoT de Azure es un servicio totalmente administrado que permite la comunicación bidireccional confiable y segura entre millones de dispositivos de Internet de las cosas (IoT) y un back-end de soluciones. Uno de los mayores desafíos que plantean los proyectos de IoT es cómo conectar dispositivos al back-end de la solución de manera segura y confiable. Para abordar este desafío, el Centro de IoT:

  • Ofrece una mensajería confiable de gran escala de dispositivo a nube y de nube a dispositivo.
  • Habilita las comunicaciones seguras con las credenciales de seguridad de cada dispositivo y el control de acceso.
  • Incluye bibliotecas de dispositivos para las plataformas y los lenguajes más populares.

Ante esta definición, poco más se puede añadir, básicamente estamos hablando de un servicio diseñado para trabajar con datos y dispositivos del Internet de las Cosas, que al estar integrado en Azure proporciona de serie cuestiones básicas como el escalado, disponibilidad, almacenamiento… Previo pago, por supuesto.

Al turrón

Crear un centro de IoT

Lo primero que tenemos que hacer para trabajar con el IoT Hub es, como podéis imaginar, crear una instancia de IoT Hub en Azure. Para esto tendremos que seguir lo siguientes pasos:

  1. Iniciar sesión en el Portal de Azure
  2. En la barra de la derecha, seleccionamos “Nuevo”, “Internet de las cosas”, “IoT Hub”

    image
  3. En el panel de nuevo “Centro de IoT”, indicamos los datos del Hub, como el nombre (que tiene que ser único), el plan de precios, el grupo de recursos y la ubicación.
    En este punto es importante indicar que el nombre del Hub es público, por lo que lo suyo es NO utilizar ninguna información confidencial o importante para el nombre del Hub. De igual manera, al menos para pruebas, es conveniente utilizar el mismo Grupo de Recursos para todas las pruebas que hagamos con IoT, con el objetivo de poder eliminar todos los recursos de un plumazo a la que terminemos las pruebas. Al rellenar la información en este panel, nos quedaría algo como esto:

         image


    Al darle al botón “Crear”, comenzará la creación del Hub, le cuesta un poquillo, así que paciencia…
    ¡OJO! Sólo se puede tener un IoT Hub en el plan de precios gratuito por suscripción de Azure
  4. Una vez creado el Hub, si accedemos a él veremos información fundamental, como el “Nombre de host” así como el acceso al resto de propiedades del Hub, el vistazo general a toda la información disponible os lo dejo a vosotros, para poder implementar las aplicaciones de prueba tendremos que apuntarnos el “Nombre de host” y luego accederemos a “Directivas de acceso compartido”

         image

  5. En la página de “Directivas de acceso compartido” nos interesa especialmente la directiva “iothubowner”, si hacemos clic en su nombre podremos acceder a información importante, como por ejemplo la “Cadena de conexión” que utilizaremos para conectar con el Hub. Como utilizaremos luego ese valor, lo apuntamos por ahí

         image

Con esto ya hemos terminado la primera parte, no ha sido tan difícil…

Crear una identidad de dispositivo

A ver, el IoT Hub está diseñado para trabajar con dispositivos de IoT, pero una de las condiciones que tendremos que tener en cuenta es que NO podremos conectar un dispositivo a IoT Hub hasta que tenga una entrada en el registro de identidades. Lo que vamos a hacer en esta entrada es implementar un programita de consola que generará una clave y un identificador de dispositivo únicos con el que el dispositivo tendrá que identificarse al enviar mensajes a IoT Hub, el término que yo he visto más frecuentemente es “Mensajes de dispositivo a la nube

  1. En Visual Studio creamos una nueva aplicación de consola (versión mínima del Framework 4.5.1)

         image

  2. Añadimos al proyecto el paquete de NuGet “Microsoft.Azure.Devices”
  3. Creamos en la clase “Program” el método que se encargará de añadir un dispositivo al IoT Hub:

    image

    En este método utilizamos un campo de tipo “RegistryManager” definido en la clase para añadir el dispositivo o devolverlo desde el IoT Hub si ya existe.

    image

    Este objeto lo inicializamos en el método “Main”, en el que además realizamos la llamada al método “AddDeviceAsync”

    image

    Como podemos ver, estamos generando la instancia del gestor mediante una cadena de conexión (copiada desde el portal de Azure) definida en la clase.

         image

  4. Si ejecutamos la aplicación, estaremos dando de alta un dispositivo en el IoT Hub, y tendremos que apuntar la clave que se genera para el mismo:

         image

Si ahora accedemos al IoT Hub en el portal de Azure, haciendo clic en “Device Explorer” podemos observar que aparece una entrada para nuestro dispositivo, con la información necesaria para conectar con él, así como la posibilitad de deshabilitar el dispositivo:

image

Crear una aplicación de dispositivo

Para seguir entendiendo un poco cómo trabajar con el IoT Hub vamos a implementar una aplicación de consola que simulará un dispositivo enviando mensajes al IoT Hub.

  1. En Visual Studio creamos una nueva aplicación de consola (versión mínima del Framework 4.5.1)

         image

  2. Añadimos al proyecto el paquete de NuGet “Microsoft.Azure.Devices.Client”
  3. Creamos en la clase “Program” el método que se encargará de enviar mensajes al IoT Hub:

    image

    En este método utilizamos un campo “_deviceClient” definido en la clase, junto con el resto de información necesaria para la comunicación.

         image
        
    La inicialización del cliente y la llamada al método “SendDeviceToCloudMessagesAsync” las incluiremos en el método “Main”

    image

Si ahora ejecutamos este nuevo programa, veremos que se están enviando una serie de mensajes al IoT Hub, pero así “a bote pronto” no seremos capaces de ver esos mensajes, salvo que vayamos al IoT Hub en el portal de Azure y seleccionemos la operación “Metrica”

image

Crear una aplicación de recepción de mensajes

Para terminar con los ejemplos de esta entrada, vamos a implementar una aplicación de consola (sí, otra más) que estará escuchando los mensajes que se reciben en el IoT Hub. Como buen ejemplo no va a tener en cuenta minucias como seguridad, rendimiento y demás,  pero servirá de aproximación.

Los mensajes del IoT Hub se van a poder leer porque este servicio expone de manera nativa un endpoint compatible con el Event Hub de Azure, aquí podemos ver cómo servicios de Azure interactúan entre sí.

  1. En Visual Studio creamos una nueva aplicación de consola (versión mínima del Framework 4.5.1)

    image

  2. Añadimos al proyecto el paquete de NuGet “WindowsAzure.ServiceBus”
  3. Creamos en la clase “Program” el método que se encargará de recibir los mensajes del IoT Hub:

    image

    En este método utilizamos un EventHubClient con el que conectaremos al Event Hub de Azure. Este campo se define en la clase:

    image

    Y se instancia en el método “Main” haciendo uso de la cadena de conexión y el endpoint especificados:

    image

Si ahora configuramos Visual Studio para que al lanzar la ejecución se ejecuten realmente los dos proyectos de consola que hemos implementado (envío de mensajes y recepción de mensajes), veremos como conforme se van enviando mensajes al IoT Hub estos son detectados o recibidos en el otro programa:

image

Conclusiones

Como habréis visto, se trata de una primera aproximación al mundo del IoT Hub, con ejemplos en .Net de cómo trabajar con él, las posibilidades son realmente infinitas. Para finalizar me gustaría destacar la integración nativa entre el IoT Hub y el Event Hub, que sirve como “pista” de cómo funcionan los servicios de Azure interactuando entre ellos, entiendo que será raro el proyecto de Azure en el que sólo utilicemos un servicio, lo más frecuente va a ser elegir las piezas del ‘puzle’ que necesitamos y configurar las conexiones entre ellas, si no las proporcionan de manera nativa.

Esta entrada está basada en este artículo de Microsoft [acceso] y el código y demás está cogido de ahí, sin permiso de M$…

No hay comentarios: