Envío de mensajes de nube a dispositivo con IoT Hub (Node.js)

IoT Hub de Azure es un servicio totalmente administrado que permite la comunicación bidireccional confiable y segura entre millones de dispositivos y una solución de back-end.

En este artículo aprenderá a:

  • Envío de mensajes de la nube al dispositivo (C2D) desde el back-end de la solución a un único dispositivo a través de IoT Hub

  • Reciba mensajes de nube a dispositivo en un dispositivo.

  • Solicitar acuse de recibo (comentarios), desde el backend de su solución, para los mensajes enviados a un dispositivo desde 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.

Al final de este artículo, ejecutará dos aplicaciones de consola de Node.js:

  • simple_sample_device: una aplicación del dispositivo de ejemplo incluida con el SDK de Microsoft Azure IoT para Node.js, que se conecta al centro de IoT y recibe mensajes de la nube al dispositivo.

  • SendCloudToDevice: una aplicación del servicio que envía un mensaje de la nube al dispositivo a la aplicación del dispositivo mediante IoT Hub y, luego, recibe su confirmación de entrega.

Nota

IoT Hub tiene soporte SDK para muchas plataformas de dispositivos y lenguajes (C, Java, Python y JavaScript) a través de los SDK de dispositivo IoT de Azure.

Para más información sobre los mensajes de nube a dispositivo, consulte Envío de mensajes de nube a dispositivo desde un centro de IoT.

Prerrequisitos

  • Suscripción a Azure. Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.

  • 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 aún no ha registrado el dispositivo, regístrelo en Azure Portal.

  • En este artículo, se usa un código de ejemplo del SDK de Azure IoT para Node.js.

    • Descargue o clone el repositorio del SDK desde GitHub en la máquina de desarrollo.
    • Asegúrese de tener instalada la versión 10.0.x o posterior de Node.js en el equipo de desarrollo. 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).

Obtener la cadena de conexión del dispositivo

En este artículo, ejecutará una aplicación de ejemplo que simula un dispositivo que recibe mensajes de la nube al dispositivo enviados a través de IoT Hub. La aplicación de ejemplo simple_sample_device incluida con el SDK de Microsoft Azure IoT para Node.js se conecta al centro de IoT y actúa como el dispositivo simulado. En el ejemplo, se usa la cadena de conexión principal del dispositivo registrado en el centro de IoT.

Para obtener la cadena de conexión principal de un dispositivo registrado en el centro de IoT, 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 izquierdo del centro de IoT, en Administración de dispositivos, seleccione Dispositivos.

  3. En la lista de dispositivos, seleccione el dispositivo adecuado.

  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 principal de un dispositivo registrado en su centro de IoT en Azure Portal.

Recepción de mensajes en la aplicación de dispositivo

En esta sección, ejecute la aplicación del dispositivo de ejemplo simple_sample_device para recibir mensajes de C2D enviados a través del centro de IoT. Abra un nuevo símbolo del sistema y vaya a la carpeta azure-iot-sdk-node\device\samples\javascript, en la carpeta donde expandió el SDK de Node.js para Azure IoT. Ejecute los siguientes comandos y reemplace el valor del marcador de posición {Your device connection string} con la cadena de conexión del dispositivo que copió del dispositivo registrado en el centro de IoT.

set IOTHUB_DEVICE_CONNECTION_STRING={Your device connection string}
node simple_sample_device.js

La siguiente salida procede de la aplicación del dispositivo de ejemplo después de que se inicia correctamente y se conecta al centro de IoT:

Client connected
Client connected
Client connected
Sending message: {"deviceId":"myFirstDevice","windSpeed":10.949952400617569,"temperature":26.0096515658525,"humidity":72.59398225838534}
Client connected
Client connected
send status: MessageEnqueued
Sending message: {"deviceId":"myFirstDevice","windSpeed":12.917649160180087,"temperature":27.336831253904613,"humidity":77.37300365434534}

En este ejemplo el dispositivo invoca la función complete para notificar a IoT Hub que ha procesado el mensaje y que este puede quitarse de la cola del dispositivo sin problemas. La llamada a complete no es necesaria si se usa el transporte MQTT y se puede omitir. Se requiere para HTTPS y AMQP.

Con AMQP y HTTPS, pero no MQTT, el dispositivo también puede:

  • Abandonar un mensaje, lo que da lugar a que IoT Hub retenga el mensaje en la cola del dispositivo para su posterior consumo.
  • Rechace un mensaje, de forma que este se quite permanentemente de la cola del dispositivo.

Si se produce algo que impide que el dispositivo complete, abandone o rechace el mensaje, IoT Hub, después de un período de tiempo de espera fijo, lo pone en cola para repetir la entrega. Por este motivo, la lógica de procesamiento de mensajes de la aplicación del dispositivo debe ser idempotente, de modo que, si se recibe el mismo mensaje varias veces, se genere el mismo resultado.

Para más información sobre el ciclo de vida de los mensajes de la nube al dispositivo y sobre cómo IoT Hub procesa los mensajes de nube a dispositivo, consulte Enviar mensajes de nube a dispositivo desde un IoT Hub.

Nota

Si usa HTTPS en lugar de MQTT o AMQP como transporte, la instancia Client busca mensajes de IoT Hub con menos frecuencia (cada 25 minutos como mínimo). Para más información sobre las diferencias entre la compatibilidad con MQTT, AMQP y HTTPS, consulte Guía de comunicación de nube a dispositivo y Elección de un protocolo de comunicación.

Obtención de la cadena de conexión de IoT Hub

En este artículo, creará un servicio back-end para enviar mensajes de la nube al dispositivo a través de IoT Hub. Para enviar mensajes de nube a un dispositivo, el servicio necesita el permiso de conexión de 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.

Envío de mensajes de nube a dispositivo

En esta sección, usted crea una aplicación de consola de Node.js que envía mensajes de nube a dispositivo a la aplicación del dispositivo simulado. Necesita el identificador de dispositivo del dispositivo y la cadena de conexión de IoT Hub.

  1. Cree una carpeta vacía denominada sendcloudtodevicemessage. Abra un símbolo del sistema, vaya a la carpeta sendcloudtodevicemessage y, a continuación, ejecute el siguiente comando para crear un archivo package.json en esa carpeta. Presione Entrar en cada símbolo del sistema presentado por el comando npm para aceptar el valor predeterminado de ese símbolo del sistema:

    npm init
    
  2. En el símbolo del sistema en la carpeta sendcloudtodevicemessage, ejecute el siguiente comando para instalar el paquete azure-iothub:

    npm install azure-iothub --save
    
  3. Con un editor de texto, cree un archivo SendCloudToDeviceMessage.js en la carpeta sendcloudtodevicemessage.

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

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Agregue el código siguiente al archivo SendCloudToDeviceMessage.js . Reemplace los valores de marcador de posición "{iot hub connection string}" y "{device ID}" por la cadena de conexión del centro de IoT y el identificador de dispositivo que ha anotado anteriormente:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Agregue la función siguiente para imprimir los resultados de la operación en la consola:

    function printResultFor(op) {
      return function printResult(err, res) {
        if (err) console.log(op + ' error: ' + err.toString());
        if (res) console.log(op + ' status: ' + res.constructor.name);
      };
    }
    
  7. Agregue la función siguiente para imprimir mensajes de comentarios de entrega en la consola:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Agregue el código siguiente para enviar un mensaje a su dispositivo y procesar el mensaje de comentarios cuando el dispositivo reconozca el mensaje de la nube al dispositivo:

    serviceClient.open(function (err) {
      if (err) {
        console.error('Could not connect: ' + err.message);
      } else {
        console.log('Service client connected');
        serviceClient.getFeedbackReceiver(receiveFeedback);
        var message = new Message('Cloud to device message.');
        message.ack = 'full';
        message.messageId = "My Message ID";
        console.log('Sending message: ' + message.getData());
        serviceClient.send(targetDevice, message, printResultFor('send'));
      }
    });
    
  9. Guarde y cierre el archivo SendCloudToDeviceMessage.js .

Ejecución de las aplicaciones

Ya está listo para ejecutar las aplicaciones.

  1. En el símbolo del sistema de la carpeta azure-iot-sdk-node\device\samples\javascript, ejecute el comando siguiente para enviar la telemetría a IoT Hub y escuchar los mensajes de la nube al dispositivo:

    node simple_sample_device.js
    

    Ejecución de una aplicación de dispositivo simulada

  2. En un símbolo del sistema de la carpeta sendcloudtodevicemessage , ejecute el comando siguiente para enviar un mensaje de nube al dispositivo y espere el comentario de confirmación:

    node SendCloudToDeviceMessage.js
    

    Ejecución de la aplicación para enviar el comando de nube a dispositivo

    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.

Pasos siguientes

En este artículo, ha aprendido a enviar y recibir mensajes de la nube al dispositivo.