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:
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.
No painel esquerdo do hub IoT, em Gestão de Dispositivos, selecione Dispositivos.
Na lista de dispositivos, selecione o dispositivo adequado.
Copie a cadeia de ligação Primária e guarde o valor.
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:
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.
No painel esquerdo do hub IoT, selecione Políticas de acesso partilhado.
Na lista de políticas, selecione a política de serviço .
Copie a cadeia de ligação Primária e guarde o valor.
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.
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 pelonpm
comando para aceitar a predefinição para essa linha de comandos:npm init
Na sua linha de comandos na pasta sendcloudtodevicemessage , execute o seguinte comando para instalar o pacote azure-iothub :
npm install azure-iothub --save
Com um editor de texto, crie um ficheiro SendCloudToDeviceMessage.js na pasta sendcloudtodevicemessage .
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;
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);
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); }; }
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')); }); }
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')); } });
Guarde e feche SendCloudToDeviceMessage.js ficheiro.
Executar as aplicações
Agora, está pronto para executar as aplicações.
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
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
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.
Para saber mais sobre as mensagens da cloud para o dispositivo, consulte Enviar mensagens da cloud para o dispositivo a partir de um hub IoT.
Para saber mais sobre Hub IoT formatos de mensagens, consulte Criar e ler mensagens Hub IoT.