Connettere il dispositivo simulato all'hub IoT usando Node

Introduzione

L'hub IoT di Azure è un servizio completamente gestito che consente comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi IoT (Internet delle cose) e un back-end della soluzione. Una delle maggiori difficoltà con i progetti IoT consiste nel connettere in modo affidabile e sicuro i dispositivi al back-end della soluzione. Per affrontare questa sfida, l'hub IoT:

  • Offre messaggistica affidabile da dispositivo a cloud e da cloud a dispositivo su vasta scala.
  • Rende possibili comunicazioni sicure mediante le credenziali di sicurezza per i singoli dispositivi e il controllo di accesso.
  • Comprende librerie di dispositivi per i linguaggi e le piattaforme più diffusi.

Questa esercitazione illustra come:

  • Usare il portale di Azure per creare un hub IoT.
  • Creare un'identità del dispositivo nell'hub IoT.
  • Creare un'app per dispositivo simulato che invii dati di telemetria al back-end della soluzione.

Al termine di questa esercitazione si avranno tre app console Node.js:

  • CreateDeviceIdentity.js, che crea un'identità del dispositivo e la chiave di sicurezza associata per connettere l'app per dispositivo simulato.
  • ReadDeviceToCloudMessages.js, che visualizza i dati di telemetria inviati dall'app per dispositivo simulato.
  • SimulatedDevice.js, che si connette all'hub IoT con l'identità del dispositivo creata in precedenza e invia un messaggio di telemetria ogni secondo usando il protocollo MQTT.
Nota

L'articolo Azure IoT SDK offre informazioni sui vari Azure IoT SDK che è possibile usare per compilare applicazioni da eseguire nei dispositivi e il backend della soluzione.

Per completare l'esercitazione, sono necessari gli elementi seguenti:

  • Node.js 0.10.x o versione successiva.
  • Un account Azure attivo. Se non si ha un account, è possibile creare un account gratuito in pochi minuti.

Creare un hub IoT

Creare un hub IoT per connettere l'app per dispositivo simulato. La procedura seguente illustra come completare questa attività usando il portale di Azure.

  1. Accedere al portale di Azure.
  2. Nell'indice fare clic su Nuovo > Internet delle cose > Hub IoT.

    Indice del portale di Azure

  3. Nel pannello Hub IoT scegliere la configurazione per l'hub IoT.

    Pannello Hub IoT

    1. Nella casella Nome immettere un nome per l'hub IoT. Se il Nome è valido e disponibile, appare un segno di spunta verde nella casella Nome.

      Importante

      L'hub IoT sarà individuabile pubblicamente come endpoint DNS, quindi evitare di indicare informazioni riservate nell'assegnazione del nome.

    2. Selezionare un piano tariffario e un livello di scalabilità. Per questa esercitazione non è necessario un livello specifico. Per questa esercitazione, usare il livello F1 gratuito.

    3. In Gruppo di risorse creare un gruppo di risorse o selezionarne uno esistente. Per altre informazioni, vedere Using resource groups to manage your Azure resources (Uso di Gruppi di risorse per gestire le risorse di Azure).
    4. In Percorsoselezionare il percorso per ospitare l'hub IoT. Per questa esercitazione, scegliere la località più vicina.
  4. Dopo aver scelto le opzioni di configurazione dell'hub IoT, fare clic su Crea. La creazione dell'hub IoT da parte di Azure può richiedere alcuni minuti. Per verificare lo stato, è possibile monitorare l'avanzamento nella Schermata iniziale o nel pannello Notifiche.

    Stato del nuovo hub IoT

  5. Dopo avere creato l'hub IoT, fare clic sul nuovo riquadro per l'hub IoT nel portale di Azure per aprire il pannello del nuovo hub IoT. Annotare il Nome host, quindi fare clic su Criteri di accesso condiviso.

    Pannello del nuovo hub IoT

  6. Nel pannello Criteri di accesso condivisi fare clic sul criterio iothubowner, quindi copiare e annotare la stringa di connessione dell'hub IoT nel pannello iothubowner. Per altre informazioni, vedere Controllo di accesso nella "Guida per gli sviluppatori dell'hub IoT".

    Pannello Criteri di accesso condivisi

L'hub IoT è stato creato. Ora sono disponibili il nome host e la stringa di connessione dell'hub IoT necessari per completare il resto di questa esercitazione.

Creare un'identità del dispositivo

In questa sezione si scriverà un'app console Node.js che crea un'identità del dispositivo nel registro delle identità dell'hub IoT. Un dispositivo può connettersi all'hub IoT solo se ha una voce nel registro delle identità. Per altre informazioni, vedere la sezione Registro di identità della Guida per gli sviluppatori dell'hub IoT. Quando si esegue questa app console vengono generati un ID dispositivo univoco e una chiave con cui il dispositivo può identificarsi quando invia messaggi da dispositivo a cloud all'hub IoT.

  1. Creare una nuova cartella vuota denominata createdeviceidentity. Nella cartella createdeviceidentity creare un file package.json eseguendo questo comando al prompt dei comandi. Accettare tutte le impostazioni predefinite:

    npm init
    
  2. Eseguire questo comando al prompt dei comandi nella cartella createdeviceidentity per installare il pacchetto SDK del servizio azure-iothub:

    npm install azure-iothub --save
    
  3. Con un editor di testo creare un file CreateDeviceIdentity.js nella cartella createdeviceidentity.
  4. Aggiungere l'istruzione require seguente all'inizio del file CreateDeviceIdentity.js :

    'use strict';
    
    var iothub = require('azure-iothub');
    
  5. Aggiungere il codice seguente al file CreateDeviceIdentity.js e sostituire il valore del segnaposto con la stringa di connessione dell'hub IoT creato nella sezione precedente:

    var connectionString = '{iothub connection string}';
    
    var registry = iothub.Registry.fromConnectionString(connectionString);
    
  6. Aggiungere il codice seguente per creare una definizione di dispositivo nel registro di identità dell'hub IoT. .Se l'ID del dispositivo non esiste nel registro delle identità dei dispositivi il codice crea un dispositivo, in caso contrario restituisce la chiave di quello esistente:

    var device = {
      deviceId: 'myFirstNodeDevice'
    }
    registry.create(device, function(err, deviceInfo, res) {
      if (err) {
        registry.get(device.deviceId, printDeviceInfo);
      }
      if (deviceInfo) {
        printDeviceInfo(err, deviceInfo, res)
      }
    });
    
    function printDeviceInfo(err, deviceInfo, res) {
      if (deviceInfo) {
        console.log('Device ID: ' + deviceInfo.deviceId);
        console.log('Device key: ' + deviceInfo.authentication.symmetricKey.primaryKey);
      }
    }
    
    Importante

    L'ID dispositivo può essere visibile nei log raccolti per il supporto tecnico e la risoluzione dei problemi, quindi evitare di indicare informazioni riservate nell'assegnazione del nome.

  7. Salvare e chiudere il file CreateDeviceIdentity.js .

  8. Per eseguire l'applicazione createdeviceidentity , eseguire questo comando al prompt dei comandi nella cartella createdeviceidentity:

    node CreateDeviceIdentity.js 
    
  9. Prendere nota dei valori di Device ID e Device key, che saranno necessari più avanti quando si creerà un'applicazione che si connette all'hub IoT come dispositivo.
Nota

Il registro di identità dell'hub IoT archivia solo le identità del dispositivo per abilitare l'accesso sicuro all'hub. Archivia le chiavi e gli ID dispositivo da usare come credenziali di sicurezza e un flag di abilitazione/disabilitazione che consente di disabilitare l'accesso per un singolo dispositivo. Se l'applicazione deve archiviare altri metadati specifici del dispositivo, dovrà usare un archivio specifico dell'applicazione. Per altre informazioni, vedere la Guida per gli sviluppatori dell'hub IoT.

Ricezione di messaggi da dispositivo a cloud

In questa sezione si creerà un'app console di Node.js che legge i messaggi da dispositivo a cloud dall'hub IoT. L'hub IoT espone un endpoint compatibile con l'hub eventi per abilitare la lettura dei messaggi dispositivo a cloud. Per semplicità, questa esercitazione crea un lettore di base non adatto per una distribuzione con velocità effettiva elevata. L'esercitazione Elaborare messaggi dispositivo a cloud illustra come elaborare i messaggi dispositivo a cloud su vasta scala. L'esercitazione Introduzione all'hub eventi offre altre informazioni su come elaborare i messaggi da hub eventi ed è applicabile agli endpoint compatibili con l'hub eventi dell'hub IoT.

Nota

L'endpoint compatibile con Hub eventi per la lettura di messaggi da dispositivo a cloud usa sempre il protocollo AMQP.

  1. Creare una cartella vuota denominata readdevicetocloudmessages. Nella cartella readdevicetocloudmessages creare un file package.json immettendo il comando seguente al prompt dei comandi. Accettare tutte le impostazioni predefinite:

    npm init
    
  2. Eseguire questo comando al prompt dei comandi nella cartella readdevicetocloudmessages per installare il pacchetto azure-event-hubs:

    npm install azure-event-hubs --save
    
  3. Con un editor di testo creare un file ReadDeviceToCloudMessages.js nella cartella readdevicetocloudmessages.
  4. Aggiungere le istruzioni require seguenti all'inizio del file ReadDeviceToCloudMessages.js :

    'use strict';
    
    var EventHubClient = require('azure-event-hubs').Client;
    
  5. Aggiungere la dichiarazione di variabile seguente e sostituire il valore del segnaposto con la stringa di connessione per l'hub IoT:

    var connectionString = '{iothub connection string}';
    
  6. Aggiungere le due funzioni seguenti che stampano l'output nella console:

    var printError = function (err) {
      console.log(err.message);
    };
    
    var printMessage = function (message) {
      console.log('Message received: ');
      console.log(JSON.stringify(message.body));
      console.log('');
    };
    
  7. Aggiungere il codice seguente per creare EventHubClient, aprire la connessione all'hub IoT e creare un ricevitore per ogni partizione. Questa applicazione usa un filtro quando crea un ricevitore, in modo che il ricevitore legga i messaggi inviati all'hub IoT soltanto dopo l'avvio dell'esecuzione del ricevitore. Questo filtro è utile in un ambiente di test perché consente di visualizzare solo il set di messaggi corrente. In un ambiente di produzione, il codice deve verificare di avere elaborato tutti i messaggi. Per altre informazioni, vedere l'esercitazione Elaborare messaggi da dispositivo a cloud dell'hub IoT:

    var client = EventHubClient.fromConnectionString(connectionString);
    client.open()
        .then(client.getPartitionIds.bind(client))
        .then(function (partitionIds) {
            return partitionIds.map(function (partitionId) {
                return client.createReceiver('$Default', partitionId, { 'startAfterTime' : Date.now()}).then(function(receiver) {
                    console.log('Created partition receiver: ' + partitionId)
                    receiver.on('errorReceived', printError);
                    receiver.on('message', printMessage);
                });
            });
        })
        .catch(printError);
    
  8. Salvare e chiudere il file ReadDeviceToCloudMessages.js .

Creare un'app di dispositivo simulato

In questa sezione si creerà un'app console Node.js che simula un dispositivo che invia messaggi da dispositivo a cloud a un hub IoT.

  1. Creare una cartella vuota denominata simulateddevice. Nella cartella simulateddevice creare un file package.json eseguendo questo comando al prompt dei comandi. Accettare tutte le impostazioni predefinite:

    npm init
    
  2. Eseguire questo comando al prompt dei comandi nella cartella simulateddevice per installare il pacchetto SDK per dispositivi azure-iot-device e il pacchetto azure-iot-device-mqtt:

    npm install azure-iot-device azure-iot-device-mqtt --save
    
  3. Con un editor di testo creare un file SimulatedDevice.js nella cartella simulateddevice.
  4. Aggiungere le istruzioni require seguenti all'inizio del file SimulatedDevice.js :

    'use strict';
    
    var clientFromConnectionString = require('azure-iot-device-mqtt').clientFromConnectionString;
    var Message = require('azure-iot-device').Message;
    
  5. Aggiungere una variabile connectionString e usarla per creare un'istanza Client. Sostituire il valore di {youriothostname} con il nome dell'hub IoT creato nella sezione Creare un hub IoT . Sostituire {yourdevicekey} con il valore della chiave del dispositivo generato nella sezione Creare un'identità del dispositivo :

    var connectionString = 'HostName={youriothostname};DeviceId=myFirstNodeDevice;SharedAccessKey={yourdevicekey}';
    
    var client = clientFromConnectionString(connectionString);
    
  6. Aggiungere la funzione seguente per visualizzare l'output dell'applicazione:

    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. Creare un callback e usare la funzione setInterval per inviare un messaggio all'hub IoT ogni secondo:

    var connectCallback = function (err) {
      if (err) {
        console.log('Could not connect: ' + err);
      } else {
        console.log('Client connected');
    
        // 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);
      }
    };
    
  8. Aprire la connessione all'hub IoT e iniziare a inviare messaggi:

    client.open(connectCallback);
    
  9. Salvare e chiudere il file SimulatedDevice.js .
Nota

Per semplicità, in questa esercitazione non si implementa alcun criterio di ripetizione dei tentativi. Nel codice di produzione è consigliabile implementare criteri per i tentativi, ad esempio un backoff esponenziale, come illustrato nell'articolo di MSDN Transient Fault Handling (Gestione degli errori temporanei).

Eseguire le app

A questo punto è possibile eseguire le app.

  1. Eseguire questo comando al prompt dei comandi nella cartella readdevicetocloudmessages per iniziare il monitoraggio dell'hub IoT:

    node ReadDeviceToCloudMessages.js 
    

    App del servizio hub IoT per Node.js per monitorare i messaggi dispositivo a cloud

  2. Eseguire questo comando al prompt dei comandi nella cartella simulateddevice per iniziare a inviare dati di telemetria all'hub IoT:

    node SimulatedDevice.js
    

    App del dispositivo hub IoT per Node.js per inviare i messaggi da dispositivo a cloud

  3. Il riquadro Utilizzo nel portale di Azure mostra il numero di messaggi inviati all'hub IoT:

    Riquadro Utilizzo del portale di Azure con il numero dei messaggi inviati all'hub IoT

Passaggi successivi

In questa esercitazione è stato configurato un nuovo hub IoT nel Portale di Azure ed è stata quindi creata un'identità del dispositivo nel registro di identità dell'hub IoT. Questa identità del dispositivo è stata usata per consentire all'app per dispositivo simulato di inviare all'hub IoT messaggi dispositivo a cloud. È stata anche creata un'app che visualizza i messaggi ricevuti dall'hub IoT.

Per altre informazioni sulle attività iniziali con l'hub IoT e per esplorare altri scenari IoT, vedere:

Per informazioni sull'estensione della soluzione IoT e l'elaborazione di messaggi dispositivo a cloud su vasta scala, vedere l'esercitazione Elaborare messaggi dispositivo a cloud.

Per altre informazioni sulle attività iniziali con l'hub IoT di Azure e per esplorare altri scenari IoT, vedere: