Esercitazione: Effettuare il provisioning per la latenza geografica

Questa esercitazione illustra come effettuare il provisioning sicuro di più dispositivi con chiave simmetrica simulata in un gruppo di hub IoT usando un criterio di allocazione. hub IoT Servizio Device Provisioning supporta vari scenari di allocazione tramite i criteri di allocazione predefiniti e il supporto per i criteri di allocazione personalizzati.

Il provisioning per la georilevazione/latenza geografica è uno scenario di allocazione comune. Man mano che un dispositivo si sposta tra posizioni, la latenza di rete è migliorata grazie al provisioning del dispositivo all'hub IoT più vicino a ogni posizione. In questo scenario per le registrazioni viene selezionato un gruppo di hub IoT, che si estendono su più aree geografiche. Per queste registrazioni è selezionato il criterio di allocazione della latenza minima predefinito. Questo criterio fa sì che il servizio Device Provisioning valuti la latenza del dispositivo e determini l'hub IoT più vicino tra quelli all'interno del gruppo.

Questa esercitazione usa un esempio di dispositivo simulato di Azure IoT C SDK per illustrare come effettuare il provisioning dei dispositivi tra aree. In questa esercitazione verranno eseguiti i passaggi seguenti:

  • Usare l'interfaccia della riga di comando di Azure per creare due hub IoT a livello di area (Stati Uniti occidentali 2 e Stati Uniti orientali)
  • Creare una registrazione che effettua il provisioning dei dispositivi in base alla georilevazione (latenza più bassa)
  • Usare l'interfaccia della riga di comando di Azure per creare due macchine virtuali Linux a livello di area per fungere da dispositivi nelle stesse aree (Stati Uniti occidentali 2 e Stati Uniti orientali)
  • Configurare l'ambiente di sviluppo per Azure IoT C SDK in entrambe le macchine virtuali Linux
  • Simulare i dispositivi e verificare che sia stato effettuato il provisioning nell'hub IoT nell'area più vicina.

Importante

Alcune aree possono, di tanto in tanto, applicare restrizioni alla creazione di Macchine virtuali. Al momento della stesura di questa guida, le aree westus2 e eastus hanno consentito la creazione di macchine virtuali. Se non è possibile creare in una di queste aree, è possibile provare un'area diversa. Per altre informazioni sulla scelta delle aree geografiche di Azure durante la creazione di macchine virtuali, vedere Aree per le macchine virtuali in Azure

Prerequisiti

Creare due hub IoT a livello di area

In questa sezione si creerà un gruppo di risorse di Azure e due nuove risorse dell'hub IoT a livello di area. Un hub IoT sarà per l'area Stati Uniti occidentali 2 e l'altro per l'area Stati Uniti orientali .

Importante

È consigliabile usare lo stesso gruppo di risorse per tutte le risorse create in questa esercitazione. Questa operazione semplifica la pulizia al termine dell'operazione.

  1. In Azure Cloud Shell creare un gruppo di risorse con il comando az group create seguente:

    az group create --name contoso-us-resource-group --location eastus
    
  2. Creare un hub IoT nella località eastus e aggiungerlo al gruppo di risorse creato con il comando az iot hub create seguente(sostituire {unique-hub-name} con il proprio nome univoco):

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location eastus --sku S1
    

    Il completamento del comando può richiedere alcuni minuti.

  3. Creare ora un hub IoT nella località westus2 e aggiungerlo al gruppo di risorse creato con il comando az iot hub create seguente(sostituire {unique-hub-name} con il proprio nome univoco):

    az iot hub create --name {unique-hub-name} --resource-group contoso-us-resource-group --location westus2 --sku S1
    

    Il completamento del comando può richiedere alcuni minuti.

Creare una registrazione per la latenza geografica

In questa sezione verrà creato un nuovo gruppo di registrazione per i dispositivi.

Per semplicità, questa esercitazione usa l'attestazione con chiave simmetrica con la registrazione. Per una soluzione più sicura è consigliabile usare l'attestazione del certificato X.509 con una catena di certificati.

  1. Accedere al portale di Azure e aprire l'istanza del servizio Device Provisioning.

  2. Selezionare Gestisci registrazioni nella sezione Impostazioni del menu di spostamento.

  3. Selezionare Aggiungi gruppo di registrazioni.

  4. Nella scheda Registrazione e provisioning della pagina Aggiungi gruppo di registrazione specificare le informazioni seguenti per configurare i dettagli del gruppo di registrazione:

    Campo Descrizione
    Attestazione Selezionare Chiave simmetrica come meccanismo di attestazione.
    Impostazioni della chiave simmetrica Selezionare la casella Genera chiavi simmetriche automaticamente .
    Nome gruppo Assegnare al gruppo il nome contoso-us-devices o specificare il nome del proprio gruppo. Il nome del gruppo di registrazione è una stringa senza distinzione tra maiuscole e minuscole (fino a 128 caratteri) di caratteri alfanumerici più i caratteri speciali: '-', , '.''_', ':'. L'ultimo carattere deve essere alfanumerico o trattino ('-').
  5. Selezionare Avanti: Hub IoT.

  6. Usare la procedura seguente per aggiungere due hub IoT al gruppo di registrazione:

    1. Nella scheda Hub IoT della pagina Aggiungi gruppo di registrazione selezionare Aggiungi collegamento all'hub IoT nella sezione Hub IoT di destinazione.

    2. Nella pagina Aggiungi collegamento all'hub IoT selezionare l'hub IoT creato nell'area eastus e assegnarlo all'accesso iothubowner .

    3. Selezionare Salva.

    4. Selezionare di nuovo Aggiungi collegamento all'hub IoT e seguire la stessa procedura per aggiungere l'hub IoT creato nell'area westus2 .

    5. Nel menu a discesa Hub IoT di destinazione selezionare entrambi gli hub IoT.

  7. Per Criteri di allocazione selezionare Latenza minima.

  8. Selezionare Rivedi e crea.

  9. Nella scheda Rivedi e crea verificare tutti i valori e quindi selezionare Crea.

  10. Dopo aver creato il gruppo di registrazione, selezionare il nome contoso-us-devices dall'elenco dei gruppi di registrazione.

  11. Copiare la chiave primaria. Questa chiave verrà usata in un secondo momento per generare chiavi di dispositivo univoco per entrambi i dispositivi simulati.

Creare macchine virtuali Linux a livello di area

In questa sezione vengono create due macchine virtuali Linux a livello di area, una negli Stati Uniti occidentali 2 e una negli Stati Uniti orientali 2. Queste macchine virtuali eseguono un esempio di simulazione di dispositivi da ogni area per illustrare il provisioning dei dispositivi per i dispositivi di entrambe le aree.

Per semplificare la pulizia, aggiungere queste macchine virtuali allo stesso gruppo di risorse che contiene gli hub IoT creati, contoso-us-resource-group.

  1. Nel Cloud Shell di Azure eseguire il comando seguente per creare una macchina virtuale dell'area Stati Uniti orientali dopo aver apportato le modifiche seguenti al parametro nel comando:

    --name: immettere un nome univoco per la macchina virtuale del dispositivo a livello di area Stati Uniti orientali.

    --admin-username: usare il proprio nome utente amministratore.

    --admin-password: usare la propria password amministratore.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceEast \
    --location eastus \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Il completamento del comando richiederà alcuni minuti.

  2. Al termine del comando, copiare il valore publicIpAddress per la macchina virtuale dell'area Stati Uniti orientali.

  3. Nell'Cloud Shell di Azure eseguire il comando per creare una macchina virtuale dell'area Stati Uniti occidentali 2 dopo aver apportato le modifiche seguenti al parametro nel comando:

    --name: immettere un nome univoco per la macchina virtuale del dispositivo di area Stati Uniti occidentali 2 .

    --admin-username: usare il proprio nome utente amministratore.

    --admin-password: usare la propria password amministratore.

    az vm create \
    --resource-group contoso-us-resource-group \
    --name ContosoSimDeviceWest2 \
    --location westus2 \
    --image Canonical:UbuntuServer:18.04-LTS:18.04.201809110 \
    --admin-username contosoadmin \
    --admin-password myContosoPassword2018 \
    --authentication-type password
    --public-ip-sku Standard
    

    Il completamento del comando richiederà alcuni minuti.

  4. Al termine del comando, copiare il valore publicIpAddress per la macchina virtuale dell'area Stati Uniti occidentali 2.

  5. Aprire due shell della riga di comando.

  6. Connettersi a una delle macchine virtuali a livello di area in ogni shell tramite SSH.

    Passare il nome utente amministratore e l'indirizzo IP pubblico copiati come parametri in SSH. Quando richiesto, immettere la password amministratore.

    ssh contosoadmin@1.2.3.4
    
    contosoadmin@ContosoSimDeviceEast:~$
    
    ssh contosoadmin@5.6.7.8
    
    contosoadmin@ContosoSimDeviceWest:~$
    

Preparare l'ambiente di sviluppo per Azure IoT C SDK

In questa sezione si clonerà Azure IoT C SDK in ogni macchina virtuale. L'SDK contiene un esempio che simula il provisioning di un dispositivo da ogni area.

Per ogni macchina virtuale:

  1. Installare CMake, g++, gcc e Git usando i comandi seguenti:

    sudo apt-get update
    sudo apt-get install cmake build-essential libssl-dev libcurl4-openssl-dev uuid-dev git-all
    
  2. Trovare e copiare il nome del tag per la versione più recente dell'SDK.

  3. Clonare Azure IoT Device SDK per C in entrambe le macchine virtuali. Usare il tag trovato nel passaggio precedente come valore per il -b parametro, ad esempio: lts_01_2023.

    git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git
    cd azure-iot-sdk-c
    git submodule update --init
    

    Il completamento di questa operazione richiederà alcuni minuti.

  4. Creare una nuova cartella cmake all'interno del repository e passare a tale cartella.

    mkdir ~/azure-iot-sdk-c/cmake
    cd ~/azure-iot-sdk-c/cmake
    
  5. Eseguire il comando seguente, che compila una versione dell'SDK specifica per la piattaforma client di sviluppo:

    cmake -Dhsm_type_symm_key:BOOL=ON -Duse_prov_client:BOOL=ON  ..
    
  6. Al termine della compilazione, le ultime righe di output saranno simili all'output seguente:

    -- IoT Client SDK Version = 1.7.0
    -- Provisioning SDK Version = 1.7.0
    -- Looking for include file stdint.h
    -- Looking for include file stdint.h - found
    -- Looking for include file stdbool.h
    -- Looking for include file stdbool.h - found
    -- target architecture: x86_64
    -- Performing Test CXX_FLAG_CXX11
    -- Performing Test CXX_FLAG_CXX11 - Success
    -- Found OpenSSL: /usr/lib/x86_64-linux-gnu/libcrypto.so (found version "1.1.1")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so (found version "7.58.0")
    -- Found CURL: /usr/lib/x86_64-linux-gnu/libcurl.so
    -- target architecture: x86_64
    -- iothub architecture: x86_64
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /home/contosoadmin/azure-iot-sdk-c/azure-iot-sdk-c
    

Derivare le chiavi univoche di dispositivo

Quando si usa l'attestazione con chiave simmetrica con le registrazioni di gruppo, non si usano direttamente le chiavi dei gruppi di registrazione. Si deriva invece una chiave univoca dalla chiave del gruppo di registrazione per ogni dispositivo.

In questa parte dell'esercitazione si genererà una chiave del dispositivo dalla chiave master del gruppo per calcolare un HMAC-SHA256 dell'ID di registrazione univoco per il dispositivo. Il risultato verrà quindi convertito in formato Base64.

Importante

Non includere la chiave master del gruppo nel codice del dispositivo.

Per entrambi i dispositivi eastus e westus2:

  1. Generare la chiave univoca usando openssl. Si userà lo script di shell Bash seguente (sostituire {primary-key} con la chiave primaria del gruppo di registrazione copiata in precedenza e sostituire {contoso-simdevice}con il proprio ID di registrazione univoco per ogni dispositivo. L'ID di registrazione è una stringa senza distinzione tra maiuscole e minuscole (fino a 128 caratteri lunghi) di caratteri alfanumerici e i caratteri speciali: '-', , '_''.'':'. L'ultimo carattere deve essere alfanumerico o trattino ('-').

    KEY={primary-key}
    REG_ID={contoso-simdevice}
    
    keybytes=$(echo $KEY | base64 --decode | xxd -p -u -c 1000)
    echo -n $REG_ID | openssl sha256 -mac HMAC -macopt hexkey:$keybytes -binary | base64
    
  2. Lo script restituisce una chiave simile alla seguente:

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    
  3. A questo punto ogni dispositivo ha la propria chiave del dispositivo derivata e l'ID di registrazione univoco per eseguire l'attestazione della chiave simmetrica con il gruppo di registrazione durante il processo di provisioning.

Simulare i dispositivi da ogni area

In questa sezione si aggiornerà un esempio di provisioning in Azure IoT C SDK per entrambe le macchine virtuali a livello di area.

Il codice di esempio simula una sequenza di avvio di dispositivo che invia la richiesta di provisioning all'istanza del servizio Device Provisioning. La sequenza di avvio causa il riconoscimento e l'assegnazione del dispositivo all'hub IoT più vicino in base alla latenza.

  1. Nella portale di Azure selezionare la scheda Panoramica per il servizio Device Provisioning e prendere nota del valore ambito ID.

    Estrarre le informazioni sull'endpoint del servizio Device Provisioning dal pannello del portale.

  2. In entrambe le macchine virtuali aprire ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c per la modifica.

    vi ~/azure-iot-sdk-c/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample.c
    
  3. In entrambe le macchine virtuali trovare la costante e sostituire il id_scope valore con il valore ambito ID copiato in precedenza.

    static const char* id_scope = "0ne00002193";
    
  4. In entrambe le macchine virtuali trovare la definizione per la main() funzione nello stesso file. Assicurarsi che la variabile hsm_type sia impostata su SECURE_DEVICE_TYPE_SYMMETRIC_KEY come illustrato di seguito, in modo che corrisponda al metodo di attestazione del gruppo di registrazione.

    Salvare le modifiche ai file in entrambe le macchine virtuali.

    SECURE_DEVICE_TYPE hsm_type;
    //hsm_type = SECURE_DEVICE_TYPE_TPM;
    //hsm_type = SECURE_DEVICE_TYPE_X509;
    hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
    
  5. In entrambe le macchine virtuali trovare la chiamata a prov_dev_set_symmetric_key_info() in prov_dev_client_sample.c che viene commentata.

    // Set the symmetric key if using they auth type
    //prov_dev_set_symmetric_key_info("<symm_registration_id>", "<symmetric_Key>");
    

    Annullare ilcommentazione delle chiamate alla funzione e sostituire i valori segnaposto (incluse le parentesi graffe) con gli ID di registrazione univoci e le chiavi di dispositivo derivate per ogni dispositivo derivato nella sezione precedente. Le chiavi riportate di seguito sono esempi. Usare le chiavi generate in precedenza.

    Stati Uniti orientali:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-east", "p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=");
    

    Stati Uniti occidentali:

    // Set the symmetric key if using they auth type
    prov_dev_set_symmetric_key_info("contoso-simdevice-west", "J5n4NY2GiBYy7Mp4lDDa5CbEe6zDU/c62rhjCuFWxnc=");
    
  6. In entrambe le macchine virtuali salvare il file.

  7. In entrambe le macchine virtuali passare alla cartella di esempio illustrata di seguito e compilare l'esempio.

    cd ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/
    cmake --build . --target prov_dev_client_sample --config Debug
    
  8. Dopo aver completato la compilazione, eseguire prov_dev_client_sample.exe in entrambe le macchine virtuali per simulare un dispositivo da ogni area. Si noti che ogni dispositivo viene allocato all'hub IoT più vicino all'area del dispositivo simulato.

    Eseguire la simulazione:

    ~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample/prov_dev_client_sample
    

    Output di esempio per la macchina virtuale Stati Uniti orientali:

    contosoadmin@ContosoSimDeviceEast:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-east-hub.azure-devices.net, deviceId: contoso-simdevice-east
    Press enter key to exit:
    
    

    Output di esempio per la macchina virtuale Stati Uniti occidentali:

    contosoadmin@ContosoSimDeviceWest:~/azure-iot-sdk-c/cmake/provisioning_client/samples/prov_dev_client_sample$ ./prov_dev_client_sample
    Provisioning API Version: 1.2.9
    
    Registering Device
    
    Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING
    
    Registration Information received from service: contoso-west-hub.azure-devices.net, deviceId: contoso-simdevice-west
    Press enter key to exit:
    

Pulire le risorse

Se si prevede di continuare a usare le risorse create in questa esercitazione, è possibile lasciarle. In caso contrario, seguire questa procedura per eliminare tutte le risorse create da questa esercitazione per evitare addebiti non necessari.

I passaggi seguenti presuppongono che tutte le risorse in questa esercitazione siano state create come indicato nello stesso gruppo di risorse denominato contoso-us-resource-group.

Importante

L'eliminazione di un gruppo di risorse è irreversibile. Il gruppo di risorse e tutte le risorse in esso contenute vengono eliminati in modo permanente. Assicurarsi di non eliminare accidentalmente il gruppo di risorse sbagliato o le risorse errate. Se si è creato l'hub IoT all'interno di un gruppo di risorse esistente che contiene risorse che si vogliono conservare, eliminare solo la risorsa dell'hub IoT invece di eliminare il gruppo di risorse.

Per eliminare il gruppo di risorse per nome:

  1. Accedere al portale di Azure.

  2. Selezionare Gruppi di risorse.

  3. Nella casella di testo Filtra per nome... digitare il nome del gruppo di risorse che contiene le risorse di interesse, contoso-us-resource-group.

  4. A destra del gruppo di risorse nell'elenco dei risultati fare clic su ... quindi su Elimina gruppo di risorse.

  5. Verrà chiesto di confermare l'eliminazione del gruppo di risorse. Digitare di nuovo il nome del gruppo di risorse per confermare e quindi selezionare Elimina. Dopo qualche istante il gruppo di risorse e tutte le risorse che contiene vengono eliminati.

Passaggi successivi

Per altre informazioni sui criteri di allocazione personalizzati, vedere