Inviare messaggi da cloud a dispositivo con l'hub IoT (Node)Send cloud-to-device messages with IoT Hub (Node)

IntroduzioneIntroduction

L'hub IoT di Azure è un servizio completamente gestito che consente di abilitare comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi e un back-end della soluzione.Azure IoT Hub is a fully managed service that helps enable reliable and secure bi-directional communications between millions of devices and a solution back end. L'esercitazione Introduzione all'hub IoT di Azure illustra come creare un hub IoT, effettuare il provisioning dell'identità di un dispositivo al suo interno e creare il codice di un'app per dispositivo simulato che invia messaggi da dispositivo a cloud.The [Get started with IoT Hub] tutorial shows how to create an IoT hub, provision a device identity in it, and code a simulated device app that sends device-to-cloud messages.

Questa esercitazione si basa su Introduzione all'hub IoT di Azure.This tutorial builds on [Get started with IoT Hub]. Illustra le operazioni seguenti:It shows you how to:

  • Dal back-end della soluzione inviare messaggi da cloud a dispositivo a un singolo dispositivo tramite l'hub IoT.From your solution back end, send cloud-to-device messages to a single device through IoT Hub.
  • Ricevere messaggi da cloud a dispositivo in un dispositivo.Receive cloud-to-device messages on a device.
  • Dal back-end della soluzione richiedere l'acknowledgement di recapito (feedback) per i messaggi inviati a un dispositivo dall'hub IoT.From your solution back end, request delivery acknowledgement (feedback) for messages sent to a device from IoT Hub.

Per altre informazioni sui messaggi da cloud a dispositivo, vedere laGuida per sviluppatori dell'hub IoT.You can find more information on cloud-to-device messages in the IoT Hub developer guide.

Al termine di questa esercitazione, vengono eseguite due app console Node.js:At the end of this tutorial, you run two Node.js console apps:

  • SimulatedDevice, una versione modificata dell'app creata in Introduzione all'hub IoT di Azure, che si connette all'hub IoT e riceve messaggi da cloud a dispositivo.SimulatedDevice, a modified version of the app created in [Get started with IoT Hub], which connects to your IoT hub and receives cloud-to-device messages.
  • SendCloudToDeviceMessage, che invia un messaggio da cloud a dispositivo all'app per dispositivo simulato tramite l'hub IoT e riceve quindi l'acknowledgement di recapito.SendCloudToDeviceMessage, which sends a cloud-to-device message to the simulated device app through IoT Hub, and then receives its delivery acknowledgement.

Nota

L’hub IoT dispone del supporto SDK per molte piattaforme e linguaggi (inclusi C, Java e Javascript) tramite gli SDK del dispositivo IoT Azure.IoT Hub has SDK support for many device platforms and languages (including C, Java, and Javascript) through Azure IoT device SDKs. Per istruzioni dettagliate su come connettere il dispositivo al codice dell'esercitazione e in generale all'hub IoT di Azure, vedere il Centro per sviluppatori Azure IoT.For step-by-step instructions on how to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the [Azure IoT Developer Center].

Per completare l'esercitazione, sono necessari gli elementi seguenti:To complete this tutorial, you need the following:

  • Node.js 4.0.x o versione successiva.Node.js version 4.0.x or later.
  • Un account Azure attivo.An active Azure account. Se non si ha un account, è possibile creare un account gratuito in pochi minuti.(If you don't have an account, you can create a free account in just a couple of minutes.)

Ricevere messaggi nell'app per dispositivo simulatoReceive messages in the simulated device app

In questa sezione si modificherà l'app per il dispositivo simulato creata in Introduzione all'hub IoT di Azure per ricevere i messaggi da cloud a dispositivo dall'hub IoT.In this section, you modify the simulated device app you created in [Get started with IoT Hub] to receive cloud-to-device messages from the IoT hub.

  1. Con un editor di testo aprire il file SimulatedDevice.js.Using a text editor, open the SimulatedDevice.js file.
  2. Modificare la funzione connectCallback per gestire i messaggi inviati dall'hub IoT.Modify the connectCallback function to handle messages sent from IoT Hub. In questo esempio il dispositivo richiama sempre la funzione complete per notificare all'hub IoT Hub che ha elaborato il messaggio.In this example, the device always invokes the complete function to notify IoT Hub that it has processed the message. La nuova versione della funzione connectCallback è simile al frammento seguente:Your new version of the connectCallback function looks like the following snippet:

    var connectCallback = function (err) {
      if (err) {
        console.log('Could not connect: ' + err);
      } else {
        console.log('Client connected');
        client.on('message', function (msg) {
          console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
          client.complete(msg, printResultFor('completed'));
        });
        // Create a message and send it to the IoT Hub every second
        setInterval(function(){
            var temperature = 20 + (Math.random() * 15);
            var humidity = 60 + (Math.random() * 20);            
            var data = JSON.stringify({ deviceId: 'myFirstNodeDevice', temperature: temperature, humidity: humidity });
            var message = new Message(data);
            message.properties.add('temperatureAlert', (temperature > 30) ? 'true' : 'false');
            console.log("Sending message: " + message.getData());
            client.sendEvent(message, printResultFor('send'));
        }, 1000);
      }
    };
    

    Nota

    Se si usa HTTPS invece di MQTT o AMQP per il trasporto, l'istanza di DeviceClient controlla raramente i messaggi provenienti dall'hub IoT (meno di 25 minuti).If you use HTTPS instead of MQTT or AMQP as the transport, the DeviceClient instance checks for messages from IoT Hub infrequently (less than every 25 minutes). Per altre informazioni sulle differenze tra il supporto di MQTT, AMQP e HTTPS e sulla limitazione delle richieste dell'hub IoT, vedere la Guida per gli sviluppatori dell'hub IoT.For more information about the differences between MQTT, AMQP and HTTPS support, and IoT Hub throttling, see the IoT Hub developer guide.

Inviare un messaggio da cloud a dispositivoSend a cloud-to-device message

In questa sezione si crea un'app console Node.js che invia messaggi da cloud a dispositivo all'app del dispositivo simulato.In this section, you create a Node.js console app that sends cloud-to-device messages to the simulated device app. È necessario l'ID del dispositivo aggiunto nell'esercitazione Introduzione all'hub IoT di Azure .You need the device ID of the device you added in the [Get started with IoT Hub] tutorial. È necessaria anche la stringa di connessione per l'hub IoT, disponibile nel portale di Azure.You also need the IoT Hub connection string for your hub that you can find in the [Azure portal].

  1. Creare una cartella vuota denominata sendcloudtodevicemessage.Create an empty folder called sendcloudtodevicemessage. Nella cartella sendcloudtodevicemessage creare un file package.json eseguendo questo comando al prompt dei comandi.In the sendcloudtodevicemessage folder, create a package.json file using the following command at your command prompt. Accettare tutte le impostazioni predefinite:Accept all the defaults:

    npm init
    
  2. Eseguire questo comando al prompt dei comandi nella cartella sendcloudtodevicemessage per installare il pacchetto azure-iothub:At your command prompt in the sendcloudtodevicemessage folder, run the following command to install the azure-iothub package:

    npm install azure-iothub --save
    
  3. Con un editor di testo, creare un file SendCloudToDeviceMessage.js nella cartella sendcloudtodevicemessage.Using a text editor, create a SendCloudToDeviceMessage.js file in the sendcloudtodevicemessage folder.
  4. Aggiungere le istruzioni require seguenti all'inizio del file SendCloudToDeviceMessage.js :Add the following require statements at the start of the SendCloudToDeviceMessage.js file:

    'use strict';
    
    var Client = require('azure-iothub').Client;
    var Message = require('azure-iot-common').Message;
    
  5. Aggiungere il codice seguente al file SendCloudToDeviceMessage.js .Add the following code to SendCloudToDeviceMessage.js file. Sostituire il valore del segnaposto "{iot hub connection string}" con la stringa di connessione dell'hub IoT creato durante l'esercitazione Introduzione all'hub IoT di Azure.Replace the "{iot hub connection string}" placeholder value with the IoT Hub connection string for the hub you created in the [Get started with IoT Hub] tutorial. Sostituire il segnaposto "{device id}" con l'ID del dispositivo aggiunto nell'esercitazione Introduzione all'hub IoT di Azure:Replace the "{device id}" placeholder with the device ID of the device you added in the [Get started with IoT Hub] tutorial:

    var connectionString = '{iot hub connection string}';
    var targetDevice = '{device id}';
    
    var serviceClient = Client.fromConnectionString(connectionString);
    
  6. Aggiungere la funzione seguente per stampare i risultati dell'operazione sulla console:Add the following function to print operation results to the console:

    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. Aggiungere la funzione seguente per stampare i messaggi di feedback del recapito sulla console:Add the following function to print delivery feedback messages to the console:

    function receiveFeedback(err, receiver){
      receiver.on('message', function (msg) {
        console.log('Feedback message:')
        console.log(msg.getData().toString('utf-8'));
      });
    }
    
  8. Aggiungere il codice seguente per inviare un messaggio al dispositivo e gestire il messaggio di feedback quando il dispositivo accetta il messaggio da cloud a dispositivo:Add the following code to send a message to your device and handle the feedback message when the device acknowledges the cloud-to-device message:

    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. Salvare e chiudere il file SendCloudToDeviceMessage.js .Save and close SendCloudToDeviceMessage.js file.

Eseguire le applicazioniRun the applications

A questo punto è possibile eseguire le applicazioni.You are now ready to run the applications.

  1. Al prompt dei comandi nella cartella simulateddevice eseguire questo comando per inviare i dati di telemetria all'hub IoT e per rimanere in ascolto dei messaggi da cloud a dispositivo:At the command prompt in the simulateddevice folder, run the following command to send telemetry to IoT Hub and to listen for cloud-to-device messages:

    node SimulatedDevice.js 
    

    Eseguire un'app di dispositivo simulato

  2. A un prompt dei comandi nella cartella sendcloudtodevicemessage eseguire questo comando per inviare un messaggio da cloud a dispositivo e attendere il feedback di acknowledgment:At a command prompt in the sendcloudtodevicemessage folder, run the following command to send a cloud-to-device message and wait for the acknowledgment feedback:

    node SendCloudToDeviceMessage.js 
    

    Eseguire l'app per inviare il comando da cloud a dispositivo

    Nota

    Per semplicità, in questa esercitazione non si implementa alcun criterio di nuovi tentativi.For simplicity's sake, this tutorial does not implement any retry policy. Nel codice di produzione è consigliabile implementare criteri di ripetizione dei tentativi, ad esempio un backoff esponenziale, come indicato nell'articolo di MSDN Transient Fault Handling.In production code, you should implement retry policies (such as exponential backoff), as suggested in the MSDN article Transient Fault Handling.

Passaggi successiviNext steps

In questa esercitazione è stato descritto come inviare e ricevere messaggi da cloud a dispositivo.In this tutorial, you learned how to send and receive cloud-to-device messages.

Per avere degli esempi di soluzioni complete che utilizzano l'hub IoT, vedere la Azure IoT Suite.To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Suite.

Per altre informazioni sullo sviluppo delle soluzioni con l'hub IoT, vedere la Guida per sviluppatori dell'hub IoT.To learn more about developing solutions with IoT Hub, see the [IoT Hub developer guide].