Esercitazione: Effettuare il provisioning per la latenza geografica

Questa esercitazione illustra come effettuare in modo sicuro il provisioning di più dispositivi simulati con chiave simmetrica in un gruppo di hub IoT usando criteri di allocazione. Il servizio Device Provisioning in hub IoT (DPS) supporta diversi scenari di allocazione tramite i criteri di allocazione predefiniti e il supporto per i criteri di allocazione personalizzati.

Il provisioning per georilevazione/latenza geografica è uno scenario di allocazione comune. Quando un dispositivo si sposta tra posizioni, la latenza della rete viene migliorata effettuando il provisioning del dispositivo sull'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. Il criterio di allocazione integrato Latenza minima è selezionato per queste registrazioni. 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 dal SDK Azure IoT C per illustrare come effettuare il provisioning di 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 di 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 che fungano 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 ne venga effettuato il provisioning nell'hub IoT nell'area più vicina.

Importante

Alcune aree possono talvolta applicare restrizioni alla creazione di macchine virtuali. Al momento della stesura di questa guida, le aree westus2 e eastus consentivano la creazione di macchine virtuali. Se non è possibile creare una macchina virtuale in una di queste aree, tentare con 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 creeranno un gruppo di risorse di Azure e due nuove risorse dell'hub IoT a livello di area. Un hub IoT sarà destinato all'area Stati Uniti occidentali 2 e l'altro all'area Stati Uniti orientali.

Importante

È consigliabile usare lo stesso gruppo di risorse per tutte le risorse create in questa esercitazione. Ciò faciliterà la pulizia una volta terminate le operazioni.

  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. A questo punto, creare un hub IoT nella località westus2 e aggiungerlo al gruppo di risorse creato con il seguente comando az iot hub create (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 si creerà un nuovo gruppo di registrazione per i dispositivi.

Per praticità, in questa esercitazione viene usata l'attestazione con chiave simmetrica per 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 registrazione.

  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 chiave simmetrica Selezionare la casella Genera chiavi simmetriche automaticamente.
    Nome gruppo Assegnare al gruppo il nome contoso-us-devices, oppure specificare il proprio nome del 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 un 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 assegnargli l'accesso iothubowner.

    3. Seleziona 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. Come Criterio 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, selezionarne 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 univoche di dispositivo per entrambi i dispositivi simulati.

Creare macchine virtuali Linux a livello di area

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

Per rendere più semplici le operazioni di pulizia, aggiungere queste macchine virtuali allo stesso gruppo di risorse contenente gli hub IoT creati, ovvero contoso-us-resource-group.

  1. In Azure Cloud Shell, eseguire il comando seguente per creare una macchina virtuale dell'area Stati Uniti orientali dopo aver apportato le modifiche ai parametri seguenti 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. Dopo che il comando è stato completato, copiare il valore publicIpAddress per la macchina virtuale a livello di area Stati Uniti orientali.

  3. In Azure Cloud Shell, eseguire il comando per creare una macchina virtuale dell'area Stati Uniti occidentali 2 dopo aver apportato le modifiche ai parametri seguenti nel comando:

    --name: immettere un nome univoco per la macchina virtuale del dispositivo a livello 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. Dopo che il comando è stato completato, copiare il valore publicIpAddress per la macchina virtuale a livello di 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 a 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. Il SDK contiene un esempio che simula il provisioning di un dispositivo da ogni area.

Per ogni macchina virtuale:

  1. Installare CMake, g++, gcce 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 del SDK.

  3. Clonare il SDK Azure IoT Device per C in entrambe le macchine virtuali. Usare il tag trovato nel passaggio precedente come valore per il parametro -b, 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 del SDK specifica per la piattaforma di sviluppo client:

    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 per ogni dispositivo dalla chiave del gruppo di registrazione.

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.

Sia per dispositivi eastus che westus2:

  1. Generare la chiave univoca usando openssl. Si userà lo script della 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 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 un 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 restituirà un output simile alla chiave seguente:

    p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
    
  3. A questo punto, ogni dispositivo ha una propria chiave del dispositivo derivata e un ID di registrazione univoco per eseguire l'attestazione con 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 fa sì che il dispositivo venga riconosciuto e lo assegnerà all'hub IoT più vicino in base alla latenza.

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

    Estrarre le informazioni dell'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 id_scope e sostituire il 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 funzione main() 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, individuare la chiamata a prov_dev_set_symmetric_key_info() in prov_dev_client_sample.c impostata come commento.

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

    Rimuovere il commento dalle chiamate di funzione e sostituire i valori segnaposto (incluse le parentesi angolari) con gli ID di registrazione univoci e le chiavi di dispositivo derivate per ogni dispositivo derivato nella sezione precedente. Le chiavi illustrate di seguito sono degli 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. Salvare il file in entrambe le macchine virtuali.

  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. Al termine della compilazione, eseguire prov_dev_client_sample.exe in entrambe le macchine virtuali per simulare un dispositivo da ciascun’area. Notare che ogni dispositivo viene allocato all'hub IoT più vicino alle aree 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 intende continuare a usare le risorse create in questa esercitazione, è possibile mantenerle. In caso contrario, usare la procedura seguente per eliminare tutte le risorse create Iin questa esercitazione per evitare costi superflui.

Questi passaggi 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