Pianificare e trasmettere processi (.NET)

Usare l'hub IoT per pianificare e tenere traccia dei processi che aggiornano milioni di dispositivi. Usare i processi per:

  • Aggiornare le proprietà desiderate

  • Aggiornare i tag

  • Richiamare metodi diretti

Un processo esegue il wrapping di una di queste azioni e tiene traccia dell'esecuzione rispetto a un set di dispositivi, definito da una query su dispositivi gemelli. Ad esempio, un'applicazione back-end può usare un processo per chiamare un metodo diretto su 10.000 dispositivi che riavvia i dispositivi stessi. È necessario specificare il set di dispositivi con una query di dispositivi gemelli e pianificare il processo in modo che venga eseguito in un secondo momento. Il processo tiene traccia dello stato di avanzamento quando ogni dispositivo riceve ed esegue il metodo diretto di riavvio.

Per altre informazioni su queste funzionalità, vedere:

Nota

Le funzionalità descritte in questo articolo sono disponibili solo nel livello Standard dell'hub IoT. Per altre informazioni sui livelli di hub IoT standard e standard, vedere Scegliere il livello di hub IoT appropriato per la soluzione.

Questo articolo illustra come creare due app console .NET (C#):

  • Un'app per dispositivo , SimulateDeviceMethods, che implementa un metodo diretto denominato LockDoor, che può essere chiamato dall'app back-end.

  • Un'app back-end , ScheduleJob, che crea due processi. Un processo chiama il metodo diretto lockDoor e un altro processo invia gli aggiornamenti delle proprietà desiderati a più dispositivi.

Nota

Vedere Azure IoT SDK per altre informazioni sugli strumenti SDK disponibili per creare app per dispositivi e back-end.

Prerequisiti

  • Visual Studio.

  • Un hub IoT. Crearne uno con l'interfaccia della riga di comando o il portale di Azure.

  • Un dispositivo registrato. Registrarne uno nel portale di Azure.

  • Assicurarsi che la porta 8883 sia aperta nel firewall. L'esempio di dispositivo di questo articolo usa il protocollo MQTT, che comunica tramite la porta 8883. Questa porta potrebbe essere bloccata in alcuni ambienti di rete aziendali e didattici. Per altre informazioni e soluzioni alternative per questo problema, vedere Connettersi all'hub IoT (MQTT).

Creare un'app di dispositivo simulato

In questa sezione viene creata un'app console .NET che risponde a un metodo diretto chiamato dal back-end della soluzione.

  1. In Visual Studio, selezionare Crea un nuovo progetto, quindi scegliere il modello di progetto App console (.NET Framework) . Selezionare Avanti per continuare.

  2. In Configura il nuovo progetto assegnare al progetto il nome SimulateDeviceMethods e quindi selezionare Avanti.

    Screenshot del popup

  3. Accettare la versione predefinita di .NET Framework e quindi selezionare Crea per creare il progetto.

  4. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto SimulateDeviceMethods e quindi scegliere Gestisci pacchetti NuGet.

  5. In Gestione pacchetti NuGet selezionare Sfoglia e cercare e scegliere Microsoft.Azure.Devices.Client. Selezionare Installa.

    Screenshot di Gestione pacchetti NuGet in Visual Studio.

    Questo passaggio scarica, installa e aggiunge un riferimento al pacchetto NuGet Azure IoT SDK per dispositivi e alle relative dipendenze.

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

    using Microsoft.Azure.Devices.Client;
    using Microsoft.Azure.Devices.Shared;
    using Newtonsoft.Json;
    using System.Threading.Tasks;
    using System.Text;
    
  7. Aggiungere i campi seguenti alla classe Program . Sostituire il valore del segnaposto con la stringa di connessione del dispositivo annotato nella sezione precedente:

    static string DeviceConnectionString = "<yourDeviceConnectionString>";
    static DeviceClient Client = null;
    
  8. Aggiungere il codice seguente per implementare il metodo diretto nel dispositivo:

    static Task<MethodResponse> LockDoor(MethodRequest methodRequest, object userContext)
    {
        Console.WriteLine();
        Console.WriteLine("Locking Door!");
        Console.WriteLine("\nReturning response for method {0}", methodRequest.Name);
    
        string result = "'Door was locked.'";
        return Task.FromResult(new MethodResponse(Encoding.UTF8.GetBytes(result), 200));
    }
    
  9. Aggiungere il metodo seguente per implementare nel dispositivo il listener del dispositivo gemello:

    private static async Task OnDesiredPropertyChanged(TwinCollection desiredProperties, 
      object userContext)
    {
        Console.WriteLine("Desired property change:");
        Console.WriteLine(JsonConvert.SerializeObject(desiredProperties));
    }
    
  10. Infine aggiungere il codice seguente al metodo Main per aprire la connessione all'hub IoT e inizializzare il listener del metodo:

    try
    {
        Console.WriteLine("Connecting to hub");
        Client = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
          TransportType.Mqtt);
    
        Client.SetMethodHandlerAsync("LockDoor", LockDoor, null);
        Client.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChanged, null);
    
        Console.WriteLine("Waiting for direct method call and device twin update\n Press enter to exit.");
        Console.ReadLine();
    
        Console.WriteLine("Exiting...");
    
        Client.SetMethodHandlerAsync("LockDoor", null, null);
        Client.CloseAsync().Wait();
    }
    catch (Exception ex)
    {
        Console.WriteLine();
        Console.WriteLine("Error in sample: {0}", ex.Message);
    }
    
  11. Salvare il lavoro e compilare la soluzione.

Nota

Per semplificare le operazioni, questo articolo non implementa criteri di ripetizione dei tentativi. Nel codice di produzione è consigliabile implementare criteri di ripetizione dei tentativi, ad esempio dei tentativi di connessione, come suggerito in Gestione degli errori temporanei.

Ottenere la stringa di connessione dell'hub IoT

In questo articolo viene creato un servizio back-end che pianifica un processo per richiamare un metodo diretto in un dispositivo, pianifica un processo per l'aggiornamento del dispositivo gemello e monitora lo stato di ogni processo. Per eseguire queste operazioni, è necessario che il servizio disponga delle autorizzazioni di lettura del registro di sistema e scrittura del registro di sistema. Per impostazione predefinita, ogni hub IoT viene creato con un registryReadWrite con nome di criteri di accesso condiviso che concede tale autorizzazione.i.

Per ottenere la stringa di connessione dell'hub IoT per i criteri registryReadWrite, seguire questa procedura:

  1. Nel portale di Azure fare clic su Gruppi di risorse. Selezionare il gruppo di risorse in cui si trova l'hub e quindi selezionare l'hub dall'elenco di risorse.

  2. Nel riquadro sinistro dell'hub selezionare Criteri di accesso condiviso.

  3. Dall'elenco dei criteri selezionare il criterio registryReadWrite.

  4. Copiare la stringa di connessione primaria e salvare il valore.

    Acquisizione schermata che mostra come recuperare la stringa di connessione

Per altre informazioni sui criteri di accesso condiviso e sulle autorizzazioni dell'hub IoT, vedere Controllo dell'accesso e autorizzazioni.

Pianificare i processi per chiamare un metodo diretto e inviare gli aggiornamenti dei dispositivi gemelli

In questa sezione si crea un'app console .NET (usando C#) che usa i processi per chiamare il metodo diretto LockDoor e inviare gli aggiornamenti di proprietà desiderati a più dispositivi.

  1. In Visual Studio selezionare File>Nuovo>Progetto. In Crea un nuovo progetto, scegliere App console (.NET Framework) , quindi selezionare Avanti.

  2. In Configura il nuovo progetto assegnare al progetto il nome ScheduleJob e quindi selezionare Crea.

    Assegnare un nome al progetto ScheduleJob e configurarlo

    Screenshot del popup

  3. Accettare la versione predefinita di .NET Framework e quindi selezionare Crea per creare il progetto.

  4. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto ScheduleJob e quindi selezionare Gestisci pacchetti NuGet.

  5. In Gestione pacchetti NuGet selezionare Sfoglia, cercare e scegliere Microsoft.Azure.Devices e quindi selezionare Installa.

    Questa procedura scarica, installa e aggiunge un riferimento al pacchetto NuGet Azure IoT SDK per servizi e alle relative dipendenze.

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

    using Microsoft.Azure.Devices;
    using Microsoft.Azure.Devices.Shared;
    
  7. Aggiungere l'istruzione using seguente se non è già presente nelle istruzioni predefinite.

    using System.Threading;
    using System.Threading.Tasks;
    
  8. Aggiungere i campi seguenti alla classe Program . Sostituire i segnaposto con la stringa di connessione dell'hub IoT copiata in precedenza in Ottenere la stringa di connessione dell’hub IoT e assegnare un nome al dispositivo.

    static JobClient jobClient;
    static string connString = "<yourIotHubConnectionString>";
    static string deviceId = "<yourDeviceId>";
    
  9. Aggiungere il metodo seguente alla classe Program :

    public static async Task MonitorJob(string jobId)
    {
        JobResponse result;
        do
        {
            result = await jobClient.GetJobAsync(jobId);
            Console.WriteLine("Job Status : " + result.Status.ToString());
            Thread.Sleep(2000);
        } while ((result.Status != JobStatus.Completed) && 
          (result.Status != JobStatus.Failed));
    }
    
  10. Aggiungere il metodo seguente alla classe Program :

    public static async Task StartMethodJob(string jobId)
    {
        CloudToDeviceMethod directMethod = 
          new CloudToDeviceMethod("LockDoor", TimeSpan.FromSeconds(5), 
          TimeSpan.FromSeconds(5));
    
        JobResponse result = await jobClient.ScheduleDeviceMethodAsync(jobId,
            $"DeviceId IN ['{deviceId}']",
            directMethod,
            DateTime.UtcNow,
            (long)TimeSpan.FromMinutes(2).TotalSeconds);
    
        Console.WriteLine("Started Method Job");
    }
    
  11. Aggiungere un altro metodo alla classe Program:

    public static async Task StartTwinUpdateJob(string jobId)
    {
        Twin twin = new Twin(deviceId);
        twin.Tags = new TwinCollection();
        twin.Tags["Building"] = "43";
        twin.Tags["Floor"] = "3";
        twin.ETag = "*";
    
        twin.Properties.Desired["LocationUpdate"] = DateTime.UtcNow;
    
        JobResponse createJobResponse = jobClient.ScheduleTwinUpdateAsync(
            jobId,
            $"DeviceId IN ['{deviceId}']", 
            twin, 
            DateTime.UtcNow, 
            (long)TimeSpan.FromMinutes(2).TotalSeconds).Result;
    
        Console.WriteLine("Started Twin Update Job");
    }
    

    Nota

    Per altre informazioni sulla sintassi della query, vedere Linguaggio di query di hub IoT.

  12. Aggiungere infine le righe seguenti al metodo Main :

    Console.WriteLine("Press ENTER to start running jobs.");
    Console.ReadLine();
    
    jobClient = JobClient.CreateFromConnectionString(connString);
    
    string methodJobId = Guid.NewGuid().ToString();
    
    StartMethodJob(methodJobId);
    MonitorJob(methodJobId).Wait();
    Console.WriteLine("Press ENTER to run the next job.");
    Console.ReadLine();
    
    string twinUpdateJobId = Guid.NewGuid().ToString();
    
    StartTwinUpdateJob(twinUpdateJobId);
    MonitorJob(twinUpdateJobId).Wait();
    Console.WriteLine("Press ENTER to exit.");
    Console.ReadLine();
    
  13. Salvare il lavoro e compilare la soluzione.

Eseguire le app

A questo punto è possibile eseguire le app.

  1. In Esplora soluzioni in Visual Studio fare clic con il pulsante destro del mouse sulla soluzione e quindi selezionare Imposta progetti di avvio.

  2. Selezionare Proprietà comuni>Progetto di avvio, quindi selezionare Progetti di avvio multipli.

  3. Assicurarsi che SimulateDeviceMethods si trovi all'inizio dell'elenco, seguito da ScheduleJob. Impostare le azioni di entrambi su Avvia e selezionare OK.

  4. Eseguire i progetti facendo clic su Avvia o passare al menu Debug e scegliere Avvia debug.

    L'output viene visualizzato sia dal dispositivo che dalle app back-end.

    Eseguire le app per pianificare i processi

Passaggi successivi

In questo articolo sono stati pianificati processi per eseguire un metodo diretto e aggiornare le proprietà del dispositivo gemello.

Per continuare a esplorare hub IoT e modelli di gestione dei dispositivi, aggiornare un'immagine in Aggiornamento dei dispositivi per hub IoT di Azure esercitazione usando l'immagine di riferimento Raspberry Pi 3 B+ .