Introducción a la administración de dispositivos (Node.js)

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:

  • dmpatterns_getstarted_device.js: 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.

  • dmpatterns_getstarted_service.js: una aplicación de consola de .NET que llame al método directo en la aplicación de dispositivo simulado mediante el centro de IoT. Muestra la respuesta y las propiedades notificadas actualizadas.

Prerrequisitos

  • Una instancia de IoT Hub. Cree uno con la CLI o el Azure Portal.

  • Dispositivo registrado. Registre uno en el Azure Portal.

  • Node.js versión 10.0.x o posteriores. En Preparación del entorno de desarrollo se describe cómo instalar Node.js para este artículo ya sea en Windows o en Linux.

  • 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 Node.js 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.

  1. Crea una nueva carpeta vacía con el nombre managed-device. En la carpeta managed-device, crea un archivo package.json con el siguiente comando en el símbolo del sistema. Acepte todos los valores predeterminados:

    npm init
    
  2. En el símbolo del sistema, en la carpeta managed.device, ejecuta el siguiente comando para instalar el paquete del SDK de dispositivo azure-iot-device y el paquete azure-iot-device-mqtt:

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. Con un editor de texto, crea un archivo dmpatterns_getstarted_device.js en la carpeta managed-device.

  4. Agregue las siguientes instrucciones "require" al principio del archivo dmpatterns_getstarted_device.js:

    'use strict';
    
    var Client = require('azure-iot-device').Client;
    var Protocol = require('azure-iot-device-mqtt').Mqtt;
    
  5. Agregue una variable connectionString y utilícela para crear una instancia de cliente. Reemplace el {yourdeviceconnectionstring} valor del marcador de posición por la cadena de conexión de dispositivo que vio cuando registró un dispositivo en IoT Hub:

    var connectionString = '{yourdeviceconnectionstring}';
    var client = Client.fromConnectionString(connectionString, Protocol);
    
  6. Agregue la siguiente función para implementar el método directo en el dispositivo

    var onReboot = function(request, response) {
    
        // Respond the cloud app for the direct method
        response.send(200, 'Reboot started', function(err) {
            if (err) {
                console.error('An error occurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.');
            }
        });
    
        // Report the reboot before the physical restart
        var date = new Date();
        var patch = {
            iothubDM : {
                reboot : {
                    lastReboot : date.toISOString(),
                }
            }
        };
    
        // Get device Twin
        client.getTwin(function(err, twin) {
            if (err) {
                console.error('could not get twin');
            } else {
                console.log('twin acquired');
                twin.properties.reported.update(patch, function(err) {
                    if (err) throw err;
                    console.log('Device reboot twin state reported')
                });  
            }
        });
    
        // Add your device's reboot API for physical restart.
        console.log('Rebooting!');
    };
    
  7. Abra la conexión al IoT Hub e inicie la escucha del método directo:

    client.open(function(err) {
        if (err) {
            console.error('Could not open IotHub client');
        }  else {
            console.log('Client opened.  Waiting for reboot method.');
            client.onDeviceMethod('reboot', onReboot);
        }
    });
    
  8. Guarde y cierre el archivo dmpatterns_getstarted_device.js.

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 el artículo 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 Node.js que inicia un reinicio remoto en un dispositivo mediante 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. Crea una carpeta vacía con el nombre trigger-reboot-on-device. En la carpeta trigger-reboot-on-device, crea un archivo package.json con el siguiente comando en el símbolo del sistema. Acepte todos los valores predeterminados:

    npm init
    
  2. En el símbolo del sistema, en la carpeta trigger-reboot-on-device, ejecuta el siguiente comando para instalar el paquete del SDK de dispositivo azure-iothub y el paquete azure-iot-device-mqtt:

    npm install azure-iothub --save
    
  3. Con un editor de texto, crea un archivo dmpatterns_getstarted_service.js en la carpeta trigger-reboot-on-device.

  4. Agregue las siguientes instrucciones "require" al principio del archivo dmpatterns_getstarted_service.js:

    'use strict';
    
    var Registry = require('azure-iothub').Registry;
    var Client = require('azure-iothub').Client;
    
  5. Agregue las declaraciones de variantes siguientes y reemplace el valor del marcador de posición {iothubconnectionstring} 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:

    var connectionString = '{iothubconnectionstring}';
    var registry = Registry.fromConnectionString(connectionString);
    var client = Client.fromConnectionString(connectionString);
    var deviceToReboot = 'myDeviceId';
    
  6. Agregue la siguiente función para invocar el método del dispositivo con el fin de reiniciar el dispositivo de destino:

    var startRebootDevice = function(twin) {
    
        var methodName = "reboot";
    
        var methodParams = {
            methodName: methodName,
            payload: null,
            timeoutInSeconds: 30
        };
    
        client.invokeDeviceMethod(deviceToReboot, methodParams, function(err, result) {
            if (err) {
                console.error("Direct method error: "+err.message);
            } else {
                console.log("Successfully invoked the device to reboot.");  
            }
        });
    };
    
  7. Agregue la siguiente función para consultar el dispositivo y obtener la última hora de reinicio:

    var queryTwinLastReboot = function() {
    
        registry.getTwin(deviceToReboot, function(err, twin){
    
            if (twin.properties.reported.iothubDM != null)
            {
                if (err) {
                    console.error('Could not query twins: ' + err.constructor.name + ': ' + err.message);
                } else {
                    var lastRebootTime = twin.properties.reported.iothubDM.reboot.lastReboot;
                    console.log('Last reboot time: ' + JSON.stringify(lastRebootTime, null, 2));
                }
            } else 
                console.log('Waiting for device to report last reboot time.');
        });
    };
    
  8. Agregue el siguiente código para llamar a las funciones que desencadenan el método directo de reinicio y la consulta de última hora de reinicio:

    startRebootDevice();
    setInterval(queryTwinLastReboot, 2000);
    
  9. Guarde y cierre el archivo dmpatterns_getstarted_service.js.

Ejecución de las aplicaciones

Ya está preparado para ejecutar las aplicaciones.

  1. En el símbolo del sistema dentro de la carpeta managed-device, ejecuta el siguiente comando para iniciar la escucha del método directo de reinicio.

    node dmpatterns_getstarted_device.js
    
  2. En el símbolo del sistema dentro de la carpeta trigger-reboot-on-device, ejecuta el siguiente comando para desencadenar el reinicio remoto y la consulta en el dispositivo gemelo para buscar la hora del último reinicio.

    node dmpatterns_getstarted_service.js
    
  3. Verá la respuesta del dispositivo al método directo de reinicio y el estado del reinicio en la consola.

    A continuación, puede ver la respuesta del dispositivo al método directo de reinicio que envía el servicio:

    salida de la aplicación manageddevice

    A continuación se muestra el servicio que desencadena el reinicio y sondea el dispositivo gemelo para la hora del último reinicio:

    salida de la aplicación triggerrebootondevice

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.