Usare metodi diretti (.NET/Node)

L'hub IoT di Azure è un servizio completamente gestito che consente comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi e un back-end della soluzione. Le esercitazioni precedenti, ad esempio Introduzione all'hub IoT e Inviare messaggi da cloud a dispositivo con l'hub IoT, illustrano le funzionalità di messaggistica di base da dispositivo a cloud e da cloud a dispositivo dell'hub IoT. L'hub IoT offre inoltre la possibilità di richiamare metodi non durevoli dal cloud ai dispositivi. I metodi diretti rappresentano un'interazione di tipo richiesta-risposta con un dispositivo simile a una chiamata HTTP, perché dopo il timeout specificato dall'utente l'esito positivo o negativo viene comunicato immediatamente per far conoscere all'utente lo stato della chiamata. Richiamare un metodo diretto in un dispositivo descrive in maniera dettagliata i metodi diretti e illustra quando usarli in alternativa ai messaggi da cloud a dispositivo o alle proprietà desiderate.

Questa esercitazione illustra come:

  • Creare un hub IoT nel portale di Azure e un'identità del dispositivo nell'hub IoT.
  • Creare un'app per dispositivo simulato che ha un metodo diretto che può essere chiamato dal cloud.
  • Creare un'app console che chiama un metodo diretto nell'app per dispositivo simulato tramite l'hub IoT.
Nota

Al momento i metodi diretti sono supportati solo sui dispositivi che si connettono all'hub IoT usando il protocollo MQTT. Per istruzioni su come convertire l'app per dispositivo esistente in modo che usi MQTT, vedere l'articolo Supporto di MQTT.

In questa esercitazione verrà sviluppata un'app console Node.js e .NET:

  • CallMethodOnDevice.sln, un'app back-end .NET, che chiama un metodo nell'app per dispositivo simulato e visualizza la risposta.
  • SimulatedDevice.js, un'app Node.js che simula un dispositivo che si connette all'hub IoT con l'identità del dispositivo creata in precedenza e risponde al metodo chiamato dal cloud.
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 questa esercitazione, sono necessari:

  • Visual Studio 2015 o Visual Studio 2017.
  • 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

Creare un'identità del dispositivo

In questa sezione si usa uno strumento di Node.js denominato iothub-explorer per creare un'identità del dispositivo per questa esercitazione. Gli ID dispositivo fanno distinzione tra maiuscole e minuscole.

  1. Eseguire il codice seguente nell'ambiente della riga di comando:

    npm install -g iothub-explorer@latest

  2. Eseguire quindi il comando indicato di seguito per accedere all'hub. Sostituire {iot hub connection string} con la stringa di connessione all'hub IoT copiata prima:

    iothub-explorer login "{iot hub connection string}"

  3. Creare infine una nuova identità del dispositivo denominata myDeviceId con il comando:

    iothub-explorer create myDeviceId --connection-string

    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.

Annotare la stringa di connessione del dispositivo visualizzata nei risultati. Questa stringa di connessione del dispositivo viene usata dall'app del dispositivo per la connessione all'hub IoT come dispositivo.

Per creare identità del dispositivo a livello di codice, vedere Introduzione all'hub IoT.

Creare un'app di dispositivo simulato

In questa sezione viene creata un'applicazione console Node.js che risponde a un metodo chiamato dal back-end della soluzione.

  1. Creare una nuova 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 i pacchetti azure-iot-device e azure-iot-device-mqtt:

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

    'use strict';
    
    var Mqtt = require('azure-iot-device-mqtt').Mqtt;
    var DeviceClient = require('azure-iot-device').Client;
    
  5. Aggiungere una variabile connectionString e usarla per creare un'istanza di DeviceClient. Sostituire {device connection string} con la stringa di connessione del dispositivo generata nella sezione Creare un'identità del dispositivo:

    var connectionString = '{device connection string}';
    var client = DeviceClient.fromConnectionString(connectionString, Mqtt);
    
  6. Aggiungere la funzione seguente per implementare il metodo diretto nel dispositivo:

    function onWriteLine(request, response) {
        console.log(request.payload);
    
        response.send(200, 'Input was written to log.', function(err) {
            if(err) {
                console.error('An error occurred when sending a method response:\n' + err.toString());
            } else {
                console.log('Response to method \'' + request.methodName + '\' sent successfully.' );
            }
        });
    }
    
  7. Aprire la connessione all'hub IoT e inizializzare il listener del metodo:

    client.open(function(err) {
        if (err) {
            console.error('could not open IotHub client');
        }  else {
            console.log('client opened');
            client.onDeviceMethod('writeLine', onWriteLine);
        }
    });
    
  8. 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 di ripetizione dei tentativi, ad esempio i tentativi di connessione, come indicato nell'articolo di MSDN Transient Fault Handling (Gestione degli errori temporanei).

Chiamare un metodo diretto in un dispositivo

In questa sezione viene creata un'app console .NET che chiama un metodo nell'app per dispositivo simulato e quindi visualizza la risposta.

  1. In Visual Studio aggiungere un progetto desktop di Windows classico in Visual C# usando il modello di progetto Applicazione console . Verificare che la versione di .NET Framework sia 4.5.1 o successiva. Assegnare al progetto il nome CallMethodOnDevice.

    Nuovo progetto desktop di Windows classico in Visual C#

  2. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto CallMethodOnDevice e quindi scegliere Gestisci pacchetti NuGet.
  3. Nella finestra Gestione pacchetti NuGet selezionare Esplora, cercare microsoft.azure.devices, selezionare Installa per installare il pacchetto Microsoft.Azure.Devices e accettare le condizioni per l'uso. Questa procedura scarica, installa e aggiunge un riferimento al pacchetto NuGet Azure IoT - SDK per dispositivi e alle relative dipendenze.

    Finestra Gestione pacchetti NuGet

  4. Aggiungere le istruzione using seguenti all'inizio del file Program.cs :

     using System.Threading.Tasks;
     using Microsoft.Azure.Devices;
    
  5. Aggiungere i campi seguenti alla classe Program . Sostituire il valore del segnaposto con la stringa di connessione dell'hub IoT creato nella sezione precedente.

     static ServiceClient serviceClient;
     static string connectionString = "{iot hub connection string}";
    
  6. Aggiungere il metodo seguente alla classe Program :

     private static async Task InvokeMethod()
     {
         var methodInvocation = new CloudToDeviceMethod("writeLine") { ResponseTimeout = TimeSpan.FromSeconds(30) };
         methodInvocation.SetPayloadJson("'a line to be written'");
    
         var response = await serviceClient.InvokeDeviceMethodAsync("myDeviceId", methodInvocation);
    
         Console.WriteLine("Response status: {0}, payload:", response.Status);
         Console.WriteLine(response.GetPayloadAsJson());
     }
    

    Questo metodo richiama un metodo diretto con nome writeLine nel dispositivo myDeviceId. Scrive quindi la risposta specificata dal dispositivo nella console. Si noti che è possibile specificare un valore di timeout per la risposta del dispositivo.

  7. Aggiungere infine le righe seguenti al metodo Main :

     serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
     InvokeMethod().Wait();
     Console.WriteLine("Press Enter to exit.");
     Console.ReadLine();
    

Eseguire le applicazioni

A questo punto è possibile eseguire le applicazioni.

  1. In Esplora soluzioni in Visual Studio fare clic con il pulsante destro del mouse sulla soluzione e quindi scegliere Imposta progetti di avvio.... Selezionare Progetto di avvio singolo, quindi selezionare il progetto CallMethodOnDevice nel menu a discesa.

  2. Eseguire questo comando al prompt dei comandi nella cartella simulateddevice per iniziare ad ascoltare le chiamate ai metodi dall'hub IoT:

    node SimulatedDevice.js
    

    Attendere l'apertura del dispositivo simulato:

  3. Quando il dispositivo è connesso e in attesa di chiamate del metodo, eseguire l'app .NET CallMethodOnDevice per richiamare il metodo nell'app per dispositivo simulato. La risposta del dispositivo dovrebbe essere scritta nella console.

  4. Il dispositivo risponde quindi al metodo stampando questo messaggio:

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 del dispositivo simulato di reagire ai metodi richiamati dal cloud. È stata anche creata un'applicazione che richiama i metodi sul dispositivo e visualizza la risposta dal dispositivo.

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

Per informazioni su come estendere la soluzione IoT e pianificare le chiamate al metodo su più dispositivi, vedere l'esercitazione Pianificare e trasmettere processi.