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
Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
Completare la procedura descritta in Configurare il servizio Device Provisioning in hub IoT con il portale di Azure.
Usare l'ambiente Bash in Azure Cloud Shell. Per altre informazioni, vedere Avvio rapido su Bash in Azure Cloud Shell.
Se si preferisce eseguire i comandi di riferimento dell'interfaccia della riga di comando in locale, installare l'interfaccia della riga di comando di Azure. Per l'esecuzione in Windows o macOS, è consigliabile eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker. Per altre informazioni, vedere Come eseguire l'interfaccia della riga di comando di Azure in un contenitore Docker.
Se si usa un'installazione locale, accedere all'interfaccia della riga di comando di Azure con il comando az login. Per completare il processo di autenticazione, seguire la procedura visualizzata nel terminale. Per altre opzioni di accesso, vedere Accedere tramite l'interfaccia della riga di comando di Azure.
Quando richiesto, al primo utilizzo installare l'estensione dell'interfaccia della riga di comando di Azure. Per altre informazioni sulle estensioni, vedere Usare le estensioni con l'interfaccia della riga di comando di Azure.
Eseguire az version per trovare la versione e le librerie dipendenti installate. Per eseguire l'aggiornamento alla versione più recente, eseguire az upgrade.
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.
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
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.
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.
Accedere al portale di Azure e aprire l'istanza del servizio Device Provisioning.
Selezionare Gestisci registrazioni nella sezione Impostazioni del menu di spostamento.
Selezionare Aggiungi gruppo di registrazione.
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 ('-'
).Selezionare Avanti: Hub IoT.
Usare la procedura seguente per aggiungere due hub IoT al gruppo di registrazione:
Nella scheda Hub IoT della pagina Aggiungi gruppo di registrazione, selezionare Aggiungi collegamento all'hub IoT nella sezione Hub IoT di destinazione.
Nella pagina Aggiungi collegamento all'hub IoT, selezionare l'hub IoT creato nell'area eastus e assegnargli l'accesso iothubowner.
Seleziona Salva.
Selezionare di nuovo Aggiungi collegamento all'hub IoT e seguire la stessa procedura per aggiungere l'hub IoT creato nell'area westus2.
Nel menu a discesa Hub IoT di destinazione, selezionare entrambi gli hub IoT.
Come Criterio di allocazione, selezionare Latenza minima.
Selezionare Rivedi e crea.
Nella scheda Rivedi e crea, verificare tutti i valori e quindi selezionare Crea.
Dopo aver creato il gruppo di registrazione, selezionarne il nome contoso-us-devices dall'elenco dei gruppi di registrazione.
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.
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.
Dopo che il comando è stato completato, copiare il valore publicIpAddress per la macchina virtuale a livello di area Stati Uniti orientali.
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.
Dopo che il comando è stato completato, copiare il valore publicIpAddress per la macchina virtuale a livello di area Stati Uniti occidentali 2.
Aprire due shell della riga di comando.
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:
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
Trovare e copiare il nome del tag per la versione più recente del SDK.
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.
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
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 ..
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:
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
Lo script restituirà un output simile alla chiave seguente:
p3w2DQr9WqEGBLUSlFi1jPQ7UWQL4siAGy75HFTFbf8=
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.
Nel portale di Azure, selezionare la scheda Panoramica per il servizio Device Provisioning e prendere nota del valore di Ambito ID.
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
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";
In entrambe le macchine virtuali, trovare la definizione per la funzione
main()
nello stesso file. Assicurarsi che la variabilehsm_type
sia impostata suSECURE_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;
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=");
Salvare il file in entrambe le macchine virtuali.
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
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:
Accedere al portale di Azure.
Selezionare Gruppi di risorse.
Nella casella di testo Filtra per nome... digitare il nome del gruppo di risorse che contiene le risorse di interesse, contoso-us-resource-group.
A destra del gruppo di risorse nell'elenco dei risultati fare clic su ... quindi su Elimina gruppo di risorse.
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