Introducción a la administración de dispositivos (.NET)
Las aplicaciones de back-end pueden usar primitivos de Azure IoT Hub, como dispositivos gemelos y métodos directos, para iniciar y supervisar de forma remota las acciones de administración de dispositivos en los dispositivos. Este artículo muestra cómo una aplicación back-end y una aplicación para dispositivo pueden funcionar a la vez para iniciar y supervisar el reinicio remoto de un dispositivo mediante IoT Hub.
Nota
Las características descritas en este artículo solo están disponibles en el nivel estándar de IoT Hub. Para obtener más información sobre los niveles Básico y Estándar o Gratis de IoT Hub, consulte Elección del nivel adecuado de IoT Hub para la solución.
Use un método directo para iniciar acciones de administración de dispositivos (por ejemplo, reinicio, restablecimiento de fábrica y actualización de firmware) desde una aplicación back-end en la nube. El dispositivo es responsable de:
Controlar la solicitud del método enviada desde IoT Hub.
Iniciar la acción específica del dispositivo correspondiente en el dispositivo.
Proporcionar actualizaciones de estado mediante las propiedades notificadas a IoT Hub.
Puede usar una aplicación de back-end en la nube para ejecutar consultas de dispositivos gemelos para informar sobre el progreso de las acciones de administración de los dispositivos.
Este artículo muestra cómo crear:
SimulateManagedDevice: una aplicación de dispositivo simulado con un método directo que reinicia el dispositivo e informa de la última hora de reinicio. Los métodos directos se invocan desde la nube.
TriggerReboot: una aplicación de consola de .NET que llame a un método directo en la aplicación de dispositivo simulado mediante el centro de IoT. Muestra la respuesta y las propiedades notificadas actualizadas.
Prerrequisitos
Visual Studio.
Una instancia de IoT Hub en la suscripción de Azure. Si aún no tiene un centro, puede seguir los pasos descritos en Creación de un centro de IoT.
Un dispositivo registrado en su centro de IoT. Si no tiene un dispositivo en el centro de IoT, siga los pasos descritos en Registrar un dispositivo.
Asegúrese de que el puerto 8883 está abierto en el firewall. En el ejemplo de dispositivo de este artículo se usa el protocolo MQTT, que se comunica mediante el puerto 8883. Este puerto puede estar bloqueado en algunos entornos de red corporativos y educativos. Para más información y para saber cómo solucionar este problema, consulte el artículo sobre la conexión a IoT Hub (MQTT).
Creación de una aplicación de dispositivo con un método directo
En esta sección:
Creará una aplicación de consola de .NET que responda a un método directo que se llama desde la nube.
Desencadenará un reinicio del dispositivo simulado.
Usará las propiedades notificadas para permitir consultas de dispositivo gemelo a fin de identificar los dispositivos y cuándo se reiniciaron por última vez.
Importante
En este artículo se incluyen los pasos para conectar un dispositivo mediante una firma de acceso compartido, también denominada autenticación de clave simétrica. Este método de autenticación es cómodo para probar y evaluar, pero autenticar un dispositivo mediante certificados X.509 es un enfoque más seguro. Para obtener más información, consulte Procedimientos recomendados de > Seguridad de la conexión.
Para crear la aplicación de dispositivo simulado, siga estos pasos:
Abra Visual Studio y seleccione Crear un proyecto nuevo, luego busque y seleccione la plantilla de proyecto Aplicación de consola (.NET Framework) y, después, seleccione Siguiente.
En Configure su nuevo proyecto, asigne al proyecto el nombre SimulateManagedDevice, luego seleccione Siguiente.
Mantenga la versión predeterminada de .NET Framework y seleccione Crear.
En el Explorador de soluciones, haga clic con el botón derecho en el nuevo proyecto SimulateManagedDevice y seleccione Administrar paquetes NuGet.
Seleccione Examinar y busque y seleccione Microsoft. Azure.Devices.Client. Seleccione Instalar.
Este paso permite descargar, instalar y agregar una referencia al paquete NuGet del SDK de dispositivo IoT de Azure y sus dependencias.
Agregue las siguientes instrucciones
using
al principio del archivo Program.cs :using Microsoft.Azure.Devices.Client; using Microsoft.Azure.Devices.Shared;
Agregue los campos siguientes a la clase Program . Reemplace el
{device connection string}
valor del marcador de posición por la cadena de conexión de dispositivo que vio cuando registró un dispositivo en IoT Hub:static string DeviceConnectionString = "{device connection string}"; static DeviceClient Client = null;
Agregue lo siguiente para implementar el método directo en el dispositivo:
static Task<MethodResponse> onReboot(MethodRequest methodRequest, object userContext) { // In a production device, you would trigger a reboot // scheduled to start after this method returns. // For this sample, we simulate the reboot by writing to the console // and updating the reported properties. try { Console.WriteLine("Rebooting!"); // Update device twin with reboot time. TwinCollection reportedProperties, reboot, lastReboot; lastReboot = new TwinCollection(); reboot = new TwinCollection(); reportedProperties = new TwinCollection(); lastReboot["lastReboot"] = DateTime.Now; reboot["reboot"] = lastReboot; reportedProperties["iothubDM"] = reboot; Client.UpdateReportedPropertiesAsync(reportedProperties).Wait(); } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); } string result = @"{""result"":""Reboot started.""}"; return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200)); }
Finalmente, agregue el código siguiente al método Main para abrir la conexión a su IoT Hub e inicializar la escucha del método directo:
try { Console.WriteLine("Connecting to hub"); Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, TransportType.Mqtt); // setup callback for "reboot" method Client.SetMethodHandlerAsync("reboot", onReboot, null).Wait(); Console.WriteLine("Waiting for reboot method\n Press enter to exit."); Console.ReadLine(); Console.WriteLine("Exiting..."); // as a good practice, remove the "reboot" handler Client.SetMethodHandlerAsync("reboot", null, null).Wait(); Client.CloseAsync().Wait(); } catch (Exception ex) { Console.WriteLine(); Console.WriteLine("Error in sample: {0}", ex.Message); }
En el Explorador de soluciones, haga clic con el botón derecho en su solución y seleccione Establecer proyectos de inicio.
En Propiedades comunes>Proyecto de inicio, seleccione Proyecto de inicio único y, después, seleccione el proyecto SimulateManagedDevice. Seleccione Aceptar para guardar los cambios.
Seleccione Compilar>Compilar solución.
Nota
Por simplificar, este artículo no implementa ninguna directiva de reintentos. En el código de producción, deberá implementar directivas de reintentos (por ejemplo, retroceso exponencial), tal y como se sugiere en Control de errores transitorios.
Obtención de la cadena de conexión de IoT Hub
En este artículo, creará un servicio back-end que invoca un método directo en un dispositivo. Para invocar un método directo en un dispositivo a través de IoT Hub, el servicio necesita el permiso Conexión del servicio. De forma predeterminada, todas las instancias de IoT Hub se crean con una directiva de acceso compartido denominada servicio que concede este permiso.
Para obtener la cadena de conexión de IoT Hub para la directiva service, siga estos pasos:
En Azure Portal, seleccione Grupos de recursos. Seleccione el grupo de recursos donde se encuentra el centro y, a continuación, seleccione el centro en la lista de recursos.
En el panel de la izquierda de IoT Hub, seleccione Directivas de acceso compartido.
En la lista de directivas, seleccione la directiva service.
Copie la Cadena de conexión principal y guarde el valor.
Para obtener más información sobre las directivas de acceso compartido y los permisos de IoT Hub, consulte Permisos y control del acceso.
Creación de una aplicación de servicio para desencadenar un reinicio
En esta sección, creará una aplicación de consola de .NET, mediante C#, que inicia una actualización remota en un dispositivo con un método directo. La aplicación usa las consultas gemelas de dispositivo para detectar la hora en que se reinició por última vez el dispositivo.
Importante
En este artículo se incluyen los pasos para conectarse a un servicio mediante una firma de acceso compartido. Este método de autenticación es cómodo para las pruebas y la evaluación, pero la autenticación en un servicio con el Microsoft Entra ID o las identidades administradas es un enfoque más seguro. Para obtener más información, consulte Procedimientos recomendados de seguridad> Seguridad en la nube.
Abra Visual Studio y seleccione Crear un proyecto.
En Crear un proyecto nuevo, busque y seleccione la plantilla de proyecto Aplicación de consola (.NET Framework) y, después, seleccione Siguiente.
En Configurar nuevo proyecto, asigne al proyecto el nombre TriggerReboot y seleccione Siguiente.
Acepte la versión predeterminada de .NET Framework y seleccione Crear para crear el proyecto.
En el Explorador de soluciones, haga clic con el botón derecho en el proyecto TriggerReboot y seleccione Administrar paquetes NuGet.
Seleccione Examinar y busque y seleccione Microsoft. Azure.Devices. Seleccione Instalar para instalar el paquete Microsoft.Azure.Devices.
Este paso permite descargar, instalar y agregar una referencia al paquete NuGet del SDK de servicio IoT de Azure y sus dependencias.
Agregue las siguientes instrucciones
using
al principio del archivo Program.cs :using Microsoft.Azure.Devices; using Microsoft.Azure.Devices.Shared;
Agregue los campos siguientes a la clase Program . Reemplace el valor del marcador de posición
{iot hub connection string}
por la cadena de conexión del centro de IoT que copió anteriormente en Obtención de la cadena de conexión de IoT Hub.static RegistryManager registryManager; static string connString = "{iot hub connection string}"; static ServiceClient client; static string targetDevice = "myDeviceId";
Agregue el método siguiente a la clase Program. Este código obtiene el dispositivo gemelo para el dispositivo de reinicio y genera las propiedades notificadas.
public static async Task QueryTwinRebootReported() { Twin twin = await registryManager.GetTwinAsync(targetDevice); Console.WriteLine(twin.Properties.Reported.ToJson()); }
Agregue el método siguiente a la clase Program. Este código inicia el reinicio en el dispositivo mediante un método directo.
public static async Task StartReboot() { client = ServiceClient.CreateFromConnectionString(connString); CloudToDeviceMethod method = new CloudToDeviceMethod("reboot"); method.ResponseTimeout = TimeSpan.FromSeconds(30); CloudToDeviceMethodResult result = await client.InvokeDeviceMethodAsync(targetDevice, method); Console.WriteLine("Invoked firmware update on device."); }
Por último, agregue las líneas siguientes al método Main :
registryManager = RegistryManager.CreateFromConnectionString(connString); StartReboot().Wait(); QueryTwinRebootReported().Wait(); Console.WriteLine("Press ENTER to exit."); Console.ReadLine();
Seleccione Compilar>Compilar solución.
Nota
Este artículo realiza solo una consulta individual de las propiedades notificadas del dispositivo. En el código de producción, se recomienda realizar un sondeo detectar cambios en las propiedades notificadas.
Ejecución de las aplicaciones
Ya está preparado para ejecutar las aplicaciones.
Para ejecutar la aplicación de dispositivo .NET SimulateManagedDevice, en el Explorador de soluciones, haga clic con el botón derecho enSimulateManagedDevice, seleccione Depurar y, después, seleccione Iniciar nueva instancia. La aplicación debería empezar a escuchar llamadas de método desde el centro de IoT.
Una vez que el dispositivo esté conectado y esperando invocaciones de método, haga clic con el botón derecho en TriggerReboot, seleccione Depurar y, después, Iniciar nueva instancia.
Debería ver el mensaje Rebooting (Reiniciando) escrito en la consola de SimulatedManagedDevice y las propiedades notificadas del dispositivo, que incluyen la hora en que se reinició por última vez, escritas en la consola de TriggerReboot.
Personalizar y ampliar el dispositivo las acciones de administración del dispositivo
Las soluciones de IoT pueden expandir el conjunto definido de patrones de administración de dispositivos o permitir modelos personalizados mediante el uso de los primitivos de método de nube a dispositivo y dispositivos gemelos. Otros ejemplos de acciones de administración de dispositivos son el restablecimiento de fábrica, la actualización de firmware, la actualización de software, la administración de energía, la administración de conectividad y red, y el cifrado de datos.
Ventanas de mantenimiento del dispositivo
Normalmente, puede dispositivos para llevar a cabo acciones a la vez que minimiza las interrupciones y el tiempo de inactividad. Las ventanas de mantenimiento dle dispositivo son un patrón que se utiliza habitualmente para definir la hora en la que un dispositivo debe actualizar su configuración. Las soluciones de back-end pueden utilizar las propiedades deseadas del dispositivo gemelo para definir y activar una directiva en el dispositivo que permita una ventana de mantenimiento. Cuando un dispositivo recibe la directiva de la ventana de mantenimiento, puede usar la propiedad notificada del dispositivo gemelo para informar del estado de la directiva. La aplicación de back-end puede usar luego consultas de dispositivos gemelos para dar testimonio de cumplimiento de dispositivos y cada directiva.
Pasos siguientes
En este artículo, ha usado un método directo para desencadenar un reinicio remoto en un dispositivo. Se usaron las propiedades notificadas para notificar la última hora de reinicio del dispositivo y se consultó el dispositivo gemelo para detectar la última hora de reinicio del dispositivo desde la nube.
Para continuar la introducción con IoT Hub y los patrones de administración de dispositivos, como la actualización basada en imágenes de un extremo a otro, consulte el Artículo de Actualización de dispositivos para Azure IoT Hub con la imagen de referencia para Raspberry Pi 3 B+.
Para obtener información sobre cómo ampliar la solución IoT y programar llamadas a métodos en varios dispositivos, vea Programación de trabajos en varios dispositivos.