Share via


Enviar mensagens da cloud para o dispositivo com Hub IoT (Node.js)

Hub IoT do Azure é um serviço totalmente gerido que ajuda a permitir comunicações bidirecionais fiáveis e seguras entre milhões de dispositivos e uma solução de back-end.

Este artigo mostra-lhe como:

  • Enviar mensagens da cloud para o dispositivo (C2D) a partir do back-end da solução para um único dispositivo através de Hub IoT

  • Receber mensagens da cloud para o dispositivo num dispositivo

  • Pedir a confirmação da entrega (feedback), do back-end da solução, para mensagens enviadas para um dispositivo a partir de Hub IoT

Nota

As funcionalidades descritas neste artigo só estão disponíveis no escalão padrão do Hub IoT. Para obter mais informações sobre os escalões de Hub IoT básico e standard/gratuito, consulte Escolher o escalão de Hub IoT certo para a sua solução.

No final deste artigo, irá executar duas aplicações de consola Node.js:

  • simple_sample_device: uma aplicação de dispositivo de exemplo incluída com o SDK do Microsoft Azure IoT para Node.js, que se liga ao seu hub IoT e recebe mensagens da cloud para o dispositivo.

  • SendCloudToDevice: uma aplicação de serviço que envia uma mensagem da cloud para o dispositivo para a aplicação do dispositivo através de Hub IoT e, em seguida, recebe a confirmação da entrega.

Nota

Hub IoT tem suporte de SDK para muitas plataformas e linguagens de dispositivos (C, Java, Python e JavaScript) através dos SDKs de dispositivos IoT do Azure.

Para saber mais sobre as mensagens da cloud para o dispositivo, veja Enviar mensagens da cloud para o dispositivo a partir de um hub IoT.

Pré-requisitos

  • Uma subscrição do Azure. Se não tiver uma subscrição do Azure, crie uma conta gratuita antes de começar.

  • Um hub IoT na sua subscrição do Azure. Se ainda não tiver um hub, pode seguir os passos em Criar um hub IoT.

  • Um dispositivo registado no seu hub IoT. Se ainda não registou um dispositivo, registe um no portal do Azure.

  • Este artigo utiliza código de exemplo do SDK do Azure IoT para Node.js.

    • Transfira ou clone o repositório do SDK do GitHub para o seu computador de desenvolvimento.
    • Certifique-se de que Node.js versão 10.0.x ou superior está instalada no seu computador de desenvolvimento. Preparar o ambiente de desenvolvimento descreve como instalar Node.js para este artigo no Windows ou Linux.
  • Certifique-se de que a porta 8883 está aberta na firewall. O exemplo de dispositivo neste artigo utiliza o protocolo MQTT, que comunica através da porta 8883. Esta porta pode ser bloqueada em alguns ambientes de rede empresarial e educacional. Para obter mais informações e formas de contornar este problema, veja Ligar ao Hub IoT (MQTT).

Obter a cadeia de ligação do dispositivo

Neste artigo, vai executar uma aplicação de exemplo que simula um dispositivo, que recebe mensagens da cloud para o dispositivo enviadas através da sua Hub IoT. A aplicação de exemplo simple_sample_device incluída com o SDK do Microsoft Azure IoT para Node.js liga-se ao seu hub IoT e atua como o seu dispositivo simulado. O exemplo utiliza a cadeia de ligação primária do dispositivo registado no seu hub IoT.

Para obter a cadeia de ligação primária de um dispositivo registado no hub IoT, siga estes passos:

  1. Na portal do Azure, selecione Grupos de recursos. Selecione o grupo de recursos onde o hub está localizado e, em seguida, selecione o hub na lista de recursos.

  2. No painel esquerdo do hub IoT, em Gestão de Dispositivos, selecione Dispositivos.

  3. Na lista de dispositivos, selecione o dispositivo adequado.

  4. Copie a cadeia de ligação Primária e guarde o valor.

    Captura de ecrã que mostra como obter a cadeia de ligação primária de um dispositivo registado no seu hub IoT no portal do Azure.

Receber mensagens na aplicação do dispositivo

Nesta secção, execute o simple_sample_device aplicação de dispositivo de exemplo para receber mensagens C2D enviadas através do seu hub IoT. Abra uma nova linha de comandos e navegue para a pasta azure-iot-sdk-node\device\samples\javascript , na pasta onde expandiu o SDK do Azure IoT Node.js. Execute os seguintes comandos, substituindo o valor do {Your device connection string} marcador de posição pela cadeia de ligação do dispositivo que copiou do dispositivo registado no hub IoT.

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

O resultado seguinte é da aplicação de dispositivo de exemplo depois de iniciar com êxito e ligar ao seu hub 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}

Neste exemplo, o dispositivo invoca a função completa para notificar Hub IoT que processou a mensagem e que pode ser removida em segurança da fila do dispositivo. A chamada a concluir não é necessária se estiver a utilizar o transporte MQTT e puder ser omitida. É necessário para AMQP e HTTPS.

Com AMQP e HTTPS, mas não com MQTT, o dispositivo também pode:

  • Abandone uma mensagem, o que resulta em Hub IoT manter a mensagem na fila do dispositivo para consumo futuro.
  • Rejeitar uma mensagem, que remove permanentemente a mensagem da fila do dispositivo.

Se ocorrer algo que impeça o dispositivo de concluir, abandonar ou rejeitar a mensagem, Hub IoT colocará novamente em fila a mensagem para entrega após um período de tempo limite fixo. Por este motivo, a lógica de processamento de mensagens na aplicação do dispositivo tem de ser idempotente, para que receber a mesma mensagem várias vezes produza o mesmo resultado.

Para obter mais informações sobre o ciclo de vida das mensagens da cloud para o dispositivo e como Hub IoT processa mensagens da cloud para o dispositivo, consulte Enviar mensagens da cloud para o dispositivo a partir de um hub IoT.

Nota

Se utilizar HTTPS em vez de MQTT ou AMQP como transporte, a instância do Cliente verifica se existem mensagens de Hub IoT com pouca frequência (um mínimo de cada 25 minutos). Para obter mais informações sobre as diferenças entre o suporte MQTT, AMQP e HTTPS, veja Orientação de comunicações da cloud para dispositivo e Escolher um protocolo de comunicação.

Obter a cadeia de ligação do hub IoT

Neste artigo, vai criar um serviço de back-end para enviar mensagens da cloud para o dispositivo através da sua Hub IoT. Para enviar mensagens da cloud para o dispositivo, o serviço precisa da permissão de ligação do serviço . Por predefinição, todos os Hub IoT são criados com uma política de acesso partilhado denominada serviço que concede esta permissão.

Para obter a cadeia de ligação Hub IoT para a política de serviço, siga estes passos:

  1. Na portal do Azure, selecione Grupos de recursos. Selecione o grupo de recursos onde o hub está localizado e, em seguida, selecione o hub na lista de recursos.

  2. No painel esquerdo do hub IoT, selecione Políticas de acesso partilhado.

  3. Na lista de políticas, selecione a política de serviço .

  4. Copie a cadeia de ligação Primária e guarde o valor.

Captura de ecrã que mostra como obter a cadeia de ligação do Hub IoT no portal do Azure.

Para obter mais informações sobre Hub IoT permissões e políticas de acesso partilhado, veja Controlo de acesso e permissões.

Enviar uma mensagem da cloud para o dispositivo

Nesta secção, vai criar uma aplicação de consola Node.js que envia mensagens da cloud para o dispositivo para a aplicação de dispositivo simulado. Precisa do ID do dispositivo e da cadeia de ligação do hub IoT.

  1. Crie uma pasta vazia denominada sendcloudtodevicemessage. Abra uma linha de comandos, navegue para a pasta sendcloudtodevicemessage e, em seguida, execute o seguinte comando para criar um package.json ficheiro nessa pasta. Prima Enter em cada linha de comando apresentada pelo npm comando para aceitar a predefinição para essa linha de comandos:

    npm init
    
  2. Na sua linha de comandos na pasta sendcloudtodevicemessage , execute o seguinte comando para instalar o pacote azure-iothub :

    npm install azure-iothub --save
    
  3. Com um editor de texto, crie um ficheiro SendCloudToDeviceMessage.js na pasta sendcloudtodevicemessage .

  4. Adicione as seguintes require instruções no início do ficheiro SendCloudToDeviceMessage.js :

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Adicione o seguinte código ao ficheiro SendCloudToDeviceMessage.js . Substitua os valores de marcador de posição "{iot hub connection string}" e "{device ID}" pela cadeia de ligação do hub IoT e pelo ID do dispositivo que anotou anteriormente:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Adicione a seguinte função para imprimir os resultados da operação à 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. Adicione a seguinte função para imprimir mensagens de feedback de entrega na consola:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Adicione o seguinte código para enviar uma mensagem para o seu dispositivo e processar a mensagem de feedback quando o dispositivo reconhecer a mensagem da cloud para o 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 e feche SendCloudToDeviceMessage.js ficheiro.

Executar as aplicações

Agora, está pronto para executar as aplicações.

  1. Na linha de comandos na pasta azure-iot-sdk-node\device\samples\javascript, execute o seguinte comando para enviar telemetria para Hub IoT e para escutar mensagens da cloud para o dispositivo:

    node simple_sample_device.js
    

    Executar a aplicação de dispositivo simulado

  2. Numa linha de comandos na pasta sendcloudtodevicemessage , execute o seguinte comando para enviar uma mensagem da cloud para o dispositivo e aguarde pelo feedback de confirmação:

    node SendCloudToDeviceMessage.js
    

    Executar a aplicação para enviar o comando da cloud para o dispositivo

    Nota

    Para simplificar, este artigo não implementa nenhuma política de repetição. No código de produção, deve implementar políticas de repetição (como o backoff exponencial), conforme sugerido no artigo Processamento Transitório de Falhas.

Passos seguintes

Neste artigo, aprendeu a enviar e receber mensagens da cloud para o dispositivo.