Diciembre de 2018
Volumen 33, número 12
Internet de las cosas: Desarrollo de IoT rápido con Azure IoT Central
Por Dawid Borycki
Como desarrollador de IoT, se enfrenta a muchos desafíos. Por suerte, cuenta con el respaldo de las tecnologías de IoT de Microsoft. Puede usar Windows 10 IoT Core para desarrollar aplicaciones para la Plataforma universal de Windows (UWP) para dispositivos inteligentes (bit.ly/2yJf6RJ). Puede crear algoritmos de aprendizaje automático (ML) con Azure Machine Learning Studio (bit.ly/2yF2yes). Y puede elegir entre diversos enfoques para crear aplicaciones web con muchos servicios de Azure IoT o aplicaciones de MVC de ASP.NET desarrolladas independiente (.NET Framework o .NET Core).
Aunque estas tecnologías ofrecen una forma completa de desarrollar soluciones personalizadas de IoT, combinarlas puede resultar difícil, especialmente si no tiene experiencia previa en programación para la Web o la nube. Para solucionar este problema, Microsoft ha creado Azure IoT Suite (consulte mi artículo anterior en bit.ly/2yFaIU6), que, más tarde, pasó a conocerse como aceleradores de soluciones IoT de Azure (bit.ly/2pYaraX). Los aceleradores de soluciones ofrecen una serie de aplicaciones preconfiguradas orientadas a problemas comunes de IoT, como paneles, modelos de ML, transmisión de lógica de datos y componentes de programación que lo agrupan todo. Sin embargo, los aceleradores de soluciones siguen siendo complejos. Así pues, para simplificar aún más el desarrollo de IoT, Microsoft presentó Azure IoT Central, un servicio administrado basado en la nube que puede usar para crear rápidamente un back-end de IoT. Este es el portal moderno, que contiene paneles y servicios subyacentes de telemetría, procesamiento de datos, etc. Use este back-end para conectar, supervisar y administrar los dispositivos IoT.
En este artículo, le mostraré cómo usar Azure IoT Central para crear la solución que se muestra en la Figura 1. Esta solución usa una aplicación de IoT Central que representa datos de telemetría, la ubicación del dispositivo y su configuración, y dos indicadores clave de rendimiento. Un operador puede usar este panel para visualizar la telemetría y controlar de forma remota el dispositivo a través de la configuración. Los datos de telemetría se transmiten desde la aplicación de consola de .NET Core (que se muestra en la esquina superior derecha). El código fuente completo de esta aplicación está disponible en bit.ly/2D34XnV.
Figura 1 Solución de IoT que voy a crear
Soluciones y servicios de Azure IoT
Antes de explicar cómo creé la solución de IoT, revisaré brevemente otros posibles enfoques para desarrollar aplicaciones de IoT con IoT de Azure. En primer lugar, puede crear una solución completamente personalizada creando instancias de servicios dedicados de IoT de Azure y configurándolos manualmente, como se muestra en la Figura 2. En este caso, se suele empezar con IoT Hub, que actúa como puerta de enlace en la nube y se usa para la comunicación bidireccional y la administración de dispositivos (por ejemplo, el registro de dispositivos). A continuación, los datos transmitidos desde los dispositivos remotos mediante IoT Hub se pueden preprocesar o transformar con Azure Stream Analytics. Este servicio se usa para filtrar datos no telemétricos o para obtener el promedio de pequeñas cantidades de datos telemétricos para reducir las fluctuaciones rápidas en las mediciones. A continuación, los datos procesados previamente se pueden enviar al panel de Power BI para su visualización, conservar en el almacenamiento en la nube dedicado o transmitir al centro de eventos para realizar un análisis más complejo. El centro de eventos puede enviar datos preprocesados a un modelo de ML para detectar anomalías o predecir tendencias en el proceso supervisado. Sin embargo, este enfoque puede llevar mucho tiempo, principalmente porque no tiene un portal web preconfigurado para proporcionar una interfaz adecuada para usuarios y operadores.
Figura 2 Solución de IoT típica: los rectángulos denotan los servicios y las flechas muestran el flujo de datos entre los componentes de la solución
En segundo lugar, puede comenzar con los aceleradores de soluciones de IoT, que son plantillas que puede ajustar según sus necesidades. Los aceleradores de soluciones de IoT se basan en los mismos servicios de IoT de Azure que una solución completamente personalizada. Sin embargo, los aceleradores incluyen servicios preconfigurados y código de ejemplo que muestran cómo aprovechar esos servicios. En este caso, aún le queda trabajo por hacer, pero ahora empezará con plantillas ajustables.
En tercer lugar, puede crear rápidamente un back-end con Azure IoT Central, en el que se le asignará una aplicación de IoT totalmente preparada. Se minimiza la cantidad de trabajo y las aptitudes necesarias. No se necesitan conocimientos de la nube para crear una solución de IoT totalmente funcional, escalable y moderna. Todo se crea automáticamente para usted en función de los mismos servicios de IoT de Azure que en una solución completamente personalizada o al usar aceleradores de soluciones. Por lo tanto, puede centrarse en desarrollar sus propias cosas sin tener que preocuparse de otras partes de la solución de IoT. A continuación, usaré Azure IoT Central para crear rápidamente el punto de conexión en la nube.
Crear una aplicación de IoT Central
Para crear la aplicación de IoT Central, he usado el portal de IoT Central disponible en apps.azureiotcentral.com, que mostraba el Administrador de aplicaciones cuando inicié sesión con mi cuenta Microsoft. Este administrador muestra todas las aplicaciones, aunque, en principio, por supuesto, no habrá ninguna aplicación. Hice clic en el botón Nueva aplicación y se abrió el creador de aplicaciones de IoT, que le permite elegir entre una evaluación gratuita de 7 días o una suscripción de pago (bit.ly/2QLvk4t), así como la plantilla de aplicación, el nombre de la aplicación y la dirección URL. Elegí el plan gratuito y la plantilla de aplicación personalizada. A continuación, definí el nombre como MSDN IoT Central app, lo que creó automáticamente la siguiente dirección URL: msdn-iot-central-app.azureiotcentral.com. Por último, hice clic en el botón Crear y, después de unos segundos, la aplicación estaba lista.
La aplicación de IoT Central consta de dos elementos importantes: la vista real y el panel de navegación (barra lateral izquierda). Use la barra lateral para cambiar entre las distintas vistas: Página principal, Device Explorer, Conjuntos de dispositivos, Análisis, Trabajos, Generador de aplicaciones y Administración. En este artículo trabajaré, principalmente, con las vistas Device Explorer y Generador de aplicaciones.
La aplicación recién creada muestra el formulario predeterminado de la página principal. Para personalizar esta vista, haga clic en el botón Editar azul para activar la vista de edición, desde la que puede agregar varios componentes, como vínculos, etiquetas, imágenes, configuración del dispositivo, mapas, etc. Sin embargo, antes de crear un panel, necesita datos de telemetría. Inicialmente, producirá la telemetría el dispositivo simulado. Para agregar un dispositivo simulado, haga clic en el panel Crear plantilla de dispositivo en la página principal predeterminada. Finalmente, es posible que prefiera usar el Generador de aplicaciones, que permite elegir la opción Dispositivo personalizado. La plantilla de dispositivo define el dispositivo, incluidos los datos de telemetría, la configuración, los eventos y los comandos remotos (bit.ly/2CjsoYH).
Plantilla de dispositivo
Independientemente de cómo decida crear la plantilla de dispositivo, especifique primero el nombre de plantilla (en este caso, estoy usando MSDN-DeviceTemplate). A continuación, haga clic en el botón Crear y se aprovisionará el dispositivo. Se abre la vista que se muestra en la Figura 3. Use esta vista para configurar varios aspectos del dispositivo:
- Medidas: le permite especificar qué tipo de datos proporcionará el dispositivo a la nube. También puede definir estados de dispositivo y eventos.
- Configuración: le permite crear configuraciones específicas del dispositivo que se pueden usar para parametrizar cada dispositivo.
- Propiedades: le permite configurar las propiedades del dispositivo; por ejemplo, su ubicación física.
- Comandos: le permite definir comandos que se pueden enviar desde la nube al dispositivo con el fin de actualizar su estado.
- Reglas: le permite definir reglas para el dispositivo. Estas reglas pueden supervisar los datos y desencadenar las acciones correspondientes.
- Panel: le permite crear el panel del dispositivo. Use este tipo de panel para crear el resumen del dispositivo, que puede incluir trazados de telemetría, imágenes, indicadores clave de rendimiento, un mapa que indica la ubicación del dispositivo, el estado y el historial de eventos.
Figura 3 Plantilla de dispositivo
Telemetría, configuración y propiedades
A continuación, he definido la plantilla del dispositivo. He creado dos medidas: temperatura y humedad. A continuación, he definido una opción (IsTelemetryActive) que permite al operador habilitar o deshabilitar la telemetría de forma remota (el estado de inactividad de la Figura 1). Si la opción IsTelemetryActive es false, el dispositivo remoto no transmitirá ningún dato. Por último, el dispositivo tendrá una propiedad (Location), que contiene la dirección geoespacial del dispositivo.
Para crear medidas de telemetría, antes debe hacer clic en el botón Editar plantilla. Como muestra la Figura 4, el botón Nueva medida aparece justo encima de la Telemetría. Después de hacer clic en el botón, tendrá la opción de elegir entre Telemetría, Estado y Evento. Haré clic en Telemetría, lo que activa otra vista, que podrá usar para configurar la medida de temperatura como se indica a continuación (consulte la columna del medio de la Figura 4):
- Nombre para mostrar: Temperatura
- Nombre de campo: Temperature
- Unidades: ºC
- Valor mínimo: -20
- Posiciones máximas: 2
- Color: elija el que quiera
Figura 4 Configuración de la telemetría
La mayor parte de la configuración de la telemetría no necesita explicación, pero tenga en cuenta que el Nombre del campo es el nombre que se usa al transmitir datos entre el dispositivo y la nube. El nombre de campo se usa para serializar y deserializar correctamente los objetos, que representan datos de telemetría.
Definir una medida de humedad es prácticamente lo mismo que definir la temperatura, pero debe usar la configuración siguiente:
- Nombre para mostrar: Humedad
- Nombre de campo: Humidity
- Unidades: %
- Valor mínimo: 0
- Valor máximo: 100
- Posiciones decimales: 2
Después de preparar las medidas, puede agregar la configuración del dispositivo. Para ello, haga clic en la pestaña Configuración y asegúrese de que está en modo de edición. A continuación, verá los tipos de configuración disponibles a la derecha. Elija el tipo de botón de alternancia y configúrelo como sigue:
- Nombre para mostrar: Está activa la telemetría
- Nombre de campo: IsTelemetryActive
- Texto para mostrar ACTIVADO: True
- Texto para mostrar DESACTIVADO: Falso
Por último, agregue la propiedad del dispositivo: Location. Para hacerlo, abra la pestaña Propiedades. Aparecerá la lista de tipos de propiedades disponibles a la izquierda. Se hace referencia esta lista como biblioteca. Haga clic en el objeto Location. A continuación, configure la propiedad de la manera siguiente:
- Nombre para mostrar: Ubicación del dispositivo
- Nombre de campo: Ubicación
- Valor inicial: Microsoft, 1 Microsoft Way, Redmond, WA 98052
Tenga en cuenta que el campo Valor inicial incluye una lista de sugerencias automáticas, que se rellena cuando empieza a escribir.
Después de configurar la telemetría, la configuración y las propiedades, puedo preparar el panel del dispositivo, que combinará toda la información en una interfaz gráfica moderna.
Creación de un panel
Crear el panel es similar a crear la configuración y las propiedades: primero se habilita el modo de edición de plantilla, que abrirá una biblioteca que contiene la lista de componentes de IU disponibles. Los componentes se encuentran en el lado izquierdo del panel de Azure IoT Central. Cuando elige un elemento, se muestra en el panel. El lado izquierdo del editor de plantillas, a continuación, mostrará los valores configurables para el componente de IU, como se muestra en la Figura 5. Continúe y haga clic en Gráfico de líneas. A continuación, defina el título como Telemetría, habilite los tres conmutadores, defina el intervalo de tiempo como Los últimos 30 minutos y, a continuación, haga clic en el icono situado más a la derecha, junto a Humedad y Temperatura, para que se representen ambas medidas.
Figura5 Configurar el gráfico
A continuación, agregué un mapa al panel, que muestra la ubicación del dispositivo. Para crear un mapa de este tipo, seleccione el componente de la UI de mapa en la biblioteca y, a continuación, configure sus propiedades. Defina el título como Ubicación y, desde la lista Propiedad de ubicación, elija Ubicación del dispositivo.
A continuación, creé dos iconos que muestran indicadores clave de rendimiento (KPI). Estos KPI son el promedio de temperatura y humedad máxima (consulte la parte derecha de la Figura 1), calculada a partir de lecturas de sensor obtenidas en los últimos 30 minutos. Para crear estos iconos, use componentes KPI de la biblioteca y configúrelos como se indica a continuación:
KPI de promedio de temperatura:
- Título: Promedio de temperatura
- Intervalo de tiempo: Los últimos 30 minutos
- Tipo de medida: Telemetría
- Medida: Temperatura
KPI de humedad máxima:
- Título: Humedad máxima
- Intervalo de tiempo: Los últimos 30 minutos
- Tipo de medida: Telemetría
- Medida: Humedad
Por último, creé un icono que muestra el valor real de la opción IsTelemetryActive. Para ello, he usado el componente de UI Configuración y propiedades, que tiene dos opciones configurables: Título (un cuadro de texto), y Configuración y propiedades (un control de dos paneles que muestra las columnas disponibles y seleccionadas). Use el cuadro de texto para establecer el título como Ubicación del dispositivo y, a continuación, use el segundo control para arrastrar la Ubicación del dispositivo de las columnas disponibles a las seleccionadas. Una vez que todos los componentes de UI están en su lugar, puedo colocarlos dentro del panel como se mostró anteriormente en la Figura 1.
Aprovisionamiento de un dispositivo real
La discusión anterior confirma que, con IoT Central, puede crear rápidamente un panel de aspecto moderno para la solución de IoT. Sin embargo, hasta ahora hemos confiado únicamente en el dispositivo simulado. A continuación, veremos cómo conectar el dispositivo real a la aplicación IoT Central. Para hacerlo, use Device Explorer y siga los pasos descritos en la documentación de IoT Central (bit.ly/2Ch4gWA). En resumen, primero haga clic en el botón Nuevo (ubicado en el panel superior), elija Real en la lista desplegable y, luego, proporcione el nombre y el identificador único del dispositivo. En este caso, he definido estas dos opciones como MSDN-DeviceTemplate: msdn-device-id1 y msdn-device-id-1, respectivamente (consulte la Figura 6).
Figura 6 Device Explorer muestra los dispositivos simulados y reales
Si hace clic ahora en el dispositivo real en el explorador, verá que su telemetría, configuración, propiedades y panel coinciden con los del dispositivo simulado. Sin embargo, aún no tiene ninguna medida porque el dispositivo no está conectado. Además, en la esquina superior derecha de la plantilla del dispositivo real, verá hipervínculos adicionales: Bloquear y Conectar. Bloquear permite bloquear el dispositivo para que la aplicación de IoT Central no acepte solicitudes del dispositivo remoto. Conectar muestra el identificador de ámbito y las credenciales necesarias para conectar el dispositivo a la nube, como se muestra en la Figura 7.
Figura 7 Conexión del dispositivo
IoT Central admite dos formas de autorizar el dispositivo. Puede usar la firma de acceso compartido (SAS) o certificados X.509. Ambos enfoques se describen en detalle en bit.ly/2ClDv3z. En la aplicación cliente que voy a desarrollar, usaré el enfoque SAS. Por lo tanto, para continuar, necesitará tener en cuenta el identificador de ámbito, el identificador del dispositivo, y la clave principal o secundaria que se muestra en la pantalla de conexión del dispositivo de la Figura 7. Para generar la cadena de conexión, usaré la herramienta de línea de comandos dps_cstr. (Puede descargar la versión de Windows de esta herramienta desde bit.ly/2Cj3Ejv). A continuación, para obtener la cadena de conexión real, abra la línea de comandos y escriba el siguiente comando:
dps_cstr <scope_id> <device_id> <SAS Key>
Para los parámetros que se muestran en la Figura 7, la herramienta dps_cstr generó la cadena de conexión siguiente:
HostName=saas-iothub-28681fd2-94c7-4938-bf7e-7ae3e94a407c.azure-devices.net;DeviceId=msdn-device-id1;SharedAccessKey=nQqFzf6TvnQA+zFI4MVaSSBeZgsYSY0P7KXrl6z6oDE=
Implementación de la aplicación cliente
Para crear la aplicación cliente, he desarrollado una aplicación C# de .NET Core basada en la plantilla de aplicación de la consola. La mayor parte del código se podría usar sin ningún cambio en una aplicación de Windows 10 IoT Core para UWP. Sin embargo, decidí usar .NET Core con el fin de minimizar las cargas de trabajo necesarias para implementar la aplicación cliente para IoT Central.
He usado Visual Studio 2017 Community Edition, empezando por el cuadro de diálogo Nuevo proyecto. He elegido la plantilla de proyecto Aplicación de consola (.NET Core 2.1) y, a continuación, he definido el nombre de aplicación como IoTCentralClient e instalado el paquete NuGet Microsoft.Azure.Devices.Client para conectar rápidamente con IoT Hub.
A continuación, he continuado con la implementación real. He empezado por la clase DeviceClientHelper que se muestra en la Figura 8.
Figura 8 Clase DeviceClientHelper
public static class DeviceClientHelper
{
private static readonly string connectionString
= "<your_connection_string>";
private static DeviceClient deviceClient;
public static DeviceClient Init()
{
if (deviceClient == null)
{
deviceClient = DeviceClient.
CreateFromConnectionString(connectionString);
}
return deviceClient;
}
}
La clase DeviceClientHelper usa Microsoft.Azure.Devices.Client.DeviceClient para asociar la conexión con IoT Hub. Con este fin, DeviceClient utiliza la cadena de conexión que genera la herramienta dps_cstr. La cadena de conexión se pasa como argumento al método estático CreateFromConnectionString de la clase DeviceClient.
Telemetría
Después de preparar la conexión, creé la clase Data que se muestra en Figura 9, que es una representación abstracta de la telemetría que se enviará a la nube.
Figura 9 Clase Data
public class Data
{
public double Temperature { get; set; }
public double Humidity { get; set; }
public Message ToMessage()
{
var dataJson = JsonConvert.SerializeObject(this);
return new Message(Encoding.ASCII.GetBytes(dataJson));
}
public override string ToString()
{
return $"Temperature: {Temperature,6:F2}, Humidity: {Humidity,6:F2}";
}
}
Recuerde que las propiedades públicas de la clase Data se usan en el punto de conexión en la nube para deserializar correctamente los objetos que se envían desde el dispositivo. Por lo tanto, los nombres de propiedad tienen que coincidir con los nombres de campo que se usan en la plantilla del dispositivo. En caso contrario, la nube no analizará correctamente los datos de telemetría.
A continuación, se deserializa el objeto de telemetría que escribí en el método ToMessage que se muestra en la Figura 9. En el primer paso, ToMessage obtiene la cadena con formato JSON, que representa el objeto Data. Esto se hace con JsonConvert.SerializeObject. En el segundo paso, la cadena JSON se convierte en una matriz de bytes con Encoding.ASCII.GetBytes. El resultado de esta operación se usa para crear una instancia de la clase Microsoft.Azure.Devices.Client.Message. Las instancias de esta clase, a continuación, se pueden enviar a IoT Hub mediante el método SendEventAsync de la clase DeviceClient.
A continuación, escribí la clase Generator para generar y enviar datos de telemetría. Esta clase emula una lectura de sensor real al generar pseudoaleatoriamente los valores de temperatura y humedad (consulte Data/Generator.cs en el código fuente complementario). Con este fin, Generator utiliza la clase System.Random para sintetizar la lectura del intervalo indicado del sensor:
private Random randomNumberGenerator = new Random();
private double GetRandomValue(MeasurementRange measurementRange)
{
var randomValueRescaled = randomNumberGenerator.NextDouble()
* measurementRange.ValueRange();
return measurementRange.Min + randomValueRescaled;
}
El intervalo de medida se representa mediante instancias de la clase MeasurementRange:
public class MeasurementRange
{
public double Min { get; set; }
public double Max { get; set; }
public double ValueRange()
{
return Max - Min;
}
}
La clase Generator tiene dos campos del tipo anterior (MeasurementRange). Corresponden a las medidas de temperatura y humedad:
private readonly MeasurementRange temperatureRange
= new MeasurementRange() { Min = -20, Max = 60 };
private readonly MeasurementRange humidityRange
= new MeasurementRange() { Min = 0, Max = 100 };
Tenga en cuenta que estos intervalos son iguales a los especificados anteriormente en la plantilla de dispositivo.
La clase Generator utiliza una instancia de DeviceClient y CancellationToken. La primera se usa para enviar la telemetría, mientras que la segunda interrumpirá el bucle infinito de telemetría. Las instancias reales de DeviceClient y CancellationToken se pasan mediante el constructor de la clase Generator:
private DeviceClient deviceClient;
private CancellationToken cancellationToken;
public Generator(DeviceClient deviceClient,
CancellationToken cancellationToken)
{
Check.IsNull(deviceClient);
Check.IsNull(cancellationToken);
this.deviceClient = deviceClient;
this.cancellationToken = cancellationToken;
}
La clase Check es una clase auxiliar estática que se utiliza para comprobar si los argumentos son null o no (consulte el código complementario en Helpers/Check.cs).
Los datos de telemetría se generan y envían a la nube dentro del bucle while implementado en el método de instancia TelemetryAction de la clase Generator que se muestra en la Figura 10.
Figura 10 Método TelemetryAction
public bool IsTelemetryActive { get; set; } = true;
private void TelemetryAction()
{
while (!cancellationToken.IsCancellationRequested)
{
var telemetryData = new Data()
{
Temperature = GetRandomValue(temperatureRange),
Humidity = GetRandomValue(humidityRange)
};
if (IsTelemetryActive)
{
deviceClient.SendEventAsync(telemetryData.ToMessage());
Console.WriteLine($"Sending telemetry: {telemetryData}");
}
else
{
Console.WriteLine("Idle");
}
Task.Delay(delayTime).Wait();
}
}
Tenga en cuenta que los datos de telemetría se envían a la nube solo cuando la propiedad IsTelemetryActive es true. Esta propiedad se puede cambiar en el punto de conexión en la nube desde la pestaña Configuración de la aplicación de IoT Central (Figura 4).
TelemetryAction se ejecuta en segundo plano mediante el modelo asincrónico basado en tareas:
public Task Start()
{
telemetryTask = new Task(TelemetryAction);
telemetryTask.Start();
return telemetryTask;
}
Juntarlo todo
Una vez listas las clases DeviceClientHelper y Generator, las he combinado en la clase Program (consulte Program.cs en el código complementario). Para empezar, implementé el método Program.Main estático, como se muestra en la Figura 11.
Figura 11 Método Program.Main
private static CancellationTokenSource cancellationTokenSource
= new CancellationTokenSource();
static void Main(string[] args)
{
// Configure cancel key press handler (to stop the app)
Console.CancelKeyPress += new ConsoleCancelEventHandler(
CancelKeyPressHandler);
// Connect to the cloud
var deviceClient = DeviceClientHelper.Init();
// Telemetry generator produces random temperature
// and humidity, and then sends them both to the cloud
var telemetryGenerator = new Generator(
deviceClient, cancellationTokenSource.Token);
// Associate handler to update device properties according to cloud requests
deviceClient.SetDesiredPropertyUpdateCallbackAsync(
PropertyUpdateCallback, telemetryGenerator).Wait();
// Start telemetry
telemetryGenerator.Start().Wait();
}
En primer lugar, Program.Main conecta un controlador de eventos al evento Console.CancelKeyPress con el fin de detener el bucle de telemetría (mediante el token de cancelación) y cerrar la aplicación:
private static void CancelKeyPressHandler(object sender,
ConsoleCancelEventArgs e)
{
if (e.SpecialKey == ConsoleSpecialKey.ControlC)
{
cancellationTokenSource.Cancel();
Environment.Exit(0);
}
}
A continuación, el método Main se conecta a IoT Hub mediante el método estático Init de DeviceClientHelper. Init devuelve una instancia de la clase DeviceClient, que, a continuación, se pasa al constructor de la clase Generator.
El método SetDesiredPropertyUpdateCallbackAsync de la instancia de la clase DeviceClient ahora se usa para configurar la devolución de llamada que se invoca cuando el operador cambia la configuración de dispositivo en el punto de conexión en la nube. Esta devolución de llamada, PropertyUpdateCallback (consulte la Figura 12), se proporciona con una instancia de la clase Microsoft.Azure.Devices.Shared.TwinCollection. Este objeto representa la colección de opciones de configuración del dispositivo. En concreto, el indizador de la clase puede usarse para leer valores de las opciones de configuración seleccionadas. Ciertas opciones de configuración se identifican mediante sus Nombres de campo, configurados en el punto de conexión en la nube. En la Figura 12, muestro cómo leer el valor de la opción IsTelemetryActive y usarlo para actualizar la propiedad correspondiente de la instancia de la clase Generator.
Figura 12 PropertyUpdateCallback
private static readonly string telemetryActivePropertyName =
"IsTelemetryActive";
private static readonly string propertyValue = "value";
private static Task PropertyUpdateCallback(
TwinCollection desiredProperties, object userContext)
{
if (desiredProperties.Contains(telemetryActivePropertyName))
{
var telemetryGenerator = userContext as Generator;
telemetryGenerator.IsTelemetryActive =
desiredProperties[telemetryActivePropertyName][propertyValue];
}
return Task.CompletedTask;
}
Por último, el método Main inicia la telemetría al invocar el método Start de la instancia de la clase Generator.
Para probar la aplicación cliente, es necesario ejecutarla. Si la cadena de conexión es válida, la aplicación se conectará al centro de IoT y empezará a transmitir datos de telemetría. Cada medida sintetizada se imprimirá en la consola y, a continuación, verá estas medidas en el panel en la nube (vuelva a consultar la Figura 1). También puede cambiar de forma remota IsTelemetryActive para deshabilitar temporalmente la telemetría. Para ello, abra la pestaña Configuración de la aplicación de Azure IoT Central, cambie el botón de alternancia y haga clic en el botón Actualizar. En ese caso, la aplicación cliente imprime la cadena inactiva, en lugar de los datos de telemetría reales.
Resumen
En este artículo, he mostrado cómo crear rápidamente una aplicación web totalmente funcional, personalizada y de aspecto moderno para una solución de IoT mediante Azure IoT Central. También he mostrado cómo crear una plantilla de dispositivo y usarla para presentar los datos de telemetría, la ubicación del dispositivo y KPI. Luego, he desarrollado una aplicación cliente con C# y la he conectado para que transmitiera datos de telemetría a la nube. Por último, he mostrado cómo responder a los cambios de configuración del dispositivo solicitados a través de la aplicación de IoT Central. Puede usar todo esto para desarrollar rápidamente paneles web modernos para las soluciones de IoT sin conocimientos previos de programación para la Web o para la nube.
Dawid Borycki es ingeniero de software e investigador biomédico, autor y conferenciante. Le encanta aprender nuevas tecnologías para hacer experimentos y prototipos de software. Borycki es el autor de dos libros de Microsoft Press: "Programming for Mixed Reality" (2018) y "Programming for the Internet of Things" (2017).
Gracias al siguiente experto técnico de Microsoft por la revisión de este artículo: Bruno Sonnino.
Bruno Sonnino es un MVP de Microsoft de desarrollo de Windows. Ha sido desarrollador, consultor, escritor e instructor durante más de 20 años y es un apasionado del desarrollo de software.