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. Cree uno con la CLI o el Azure Portal.

  • Dispositivo registrado. Registre uno en el Azure Portal.

  • Asegúrese de que está abierto el puerto 8883 del 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.

Para crear la aplicación de dispositivo simulado, siga estos pasos:

  1. 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.

  2. En Configure su nuevo proyecto, asigne al proyecto el nombre SimulateManagedDevice, luego seleccione Siguiente.

    Captura de pantalla que muestra cómo nombrar un nuevo proyecto en Visual Studio.

  3. Mantenga la versión predeterminada de .NET Framework y seleccione Crear.

  4. En el Explorador de soluciones, haga clic con el botón derecho en el nuevo proyecto SimulateManagedDevice y seleccione Administrar paquetes NuGet.

  5. Seleccione Examinar y busque y seleccione Microsoft. Azure.Devices.Client. Seleccione Instalar.

    Captura de pantalla que muestra cómo instalar el paquete  Microsoft.Azure.Devices.Client.

    Este paso permite descargar, instalar y agregar una referencia al paquete NuGet del SDK de dispositivo IoT de Azure y sus dependencias.

  6. Agregue las siguientes instrucciones using al principio del archivo Program.cs :

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    
  7. 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;
    
  8. 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));
    }
    
  9. 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);
    }
    
  10. En el Explorador de soluciones, haga clic con el botón derecho en su solución y seleccione Establecer proyectos de inicio.

  11. En Propiedades comunes>Proyecto de inicio, seleccione Proyecto de inicio único y, después, seleccione el proyecto SimulateManagedDevice. Seleccione Aceptar para guardar los cambios.

  12. 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:

  1. 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.

  2. En el panel de la izquierda de IoT Hub, seleccione Directivas de acceso compartido.

  3. En la lista de directivas, seleccione la directiva service.

  4. Copie la Cadena de conexión principal y guarde el valor.

Captura de pantalla que muestra cómo recuperar la cadena de conexión de su IoT Hub en el Azure Portal.

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.

  1. Abra Visual Studio y seleccione Crear un proyecto.

  2. En Crear un proyecto nuevo, busque y seleccione la plantilla de proyecto Aplicación de consola (.NET Framework) y, después, seleccione Siguiente.

  3. En Configurar nuevo proyecto, asigne al proyecto el nombre TriggerReboot y seleccione Siguiente.

    Captura de pantalla que muestra cómo configurar el nuevo proyecto en Visual Studio.

  4. Acepte la versión predeterminada de .NET Framework y seleccione Crear para crear el proyecto.

  5. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto TriggerReboot y seleccione Administrar paquetes NuGet.

  6. Seleccione Examinar y busque y seleccione Microsoft. Azure.Devices. Seleccione Instalar para instalar el paquete Microsoft.Azure.Devices.

    Captura de pantalla que muestra cómo 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.

  7. Agregue las siguientes instrucciones using al principio del archivo Program.cs :

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  8. 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";
    
  9. 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());
    }
    
  10. 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.");
    }
    
  11. 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();
    
  12. 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.

  1. 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.

  2. 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.

    Ejecución de servicio y de aplicación de dispositivo

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 con la introducción a 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 Device Update 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.