Introduzione alle identità dei moduli di hub IoT e ai dispositivi gemelli di identità dei moduli
Le identità dei moduli e i dispositivi gemelli di identità dei moduli sono simili a hub IoT di Azure identità dei dispositivi e dispositivi gemelli, ma offrono una granularità più precisa. Mentre hub IoT di Azure identità dei dispositivi e dispositivi gemelli consentono all'applicazione back-end di configurare un dispositivo e fornire visibilità sulle condizioni del dispositivo, un'identità del modulo e un dispositivo gemello di identità del modulo forniscono queste funzionalità per singoli componenti di un dispositivo. Nei dispositivi con più componenti, ad esempio dispositivi del sistema operativo o dispositivi firmware, le identità dei moduli e i dispositivi gemelli di identità del modulo consentono la configurazione e le condizioni isolate per ogni componente. Per altre informazioni, vedere Informazioni sui moduli gemelli di hub IoT di Azure.
Nota
Le funzionalità descritte in questo articolo sono disponibili solo nel livello Standard dell'hub IoT. Per altre informazioni sui livelli Basic e Standard/Gratuito dell'hub IoT, vedere Scegliere il livello appropriato dell'hub IoT per la soluzione.
Questo articolo illustra come sviluppare due tipi di applicazioni:
- App per dispositivi che visualizzano e aggiornano le proprietà segnalate dei moduli gemelli e gestiscono le richieste per aggiornare le proprietà desiderate.
- App di servizio in grado di leggere e impostare le proprietà desiderate dell'identità del modulo.
Nota
Questo articolo ha lo scopo di integrare gli esempi degli SDK di Azure IoT a cui si fa riferimento al suo interno. È possibile usare gli strumenti degli SDK per compilare sia applicazioni per dispositivi sia applicazioni back-end.
Prerequisiti
Un hub IoT
Un dispositivo hub IoT
Identità del modulo del dispositivo dell'hub IoT
Se l'applicazione usa il protocollo MQTT, verificare che la porta 8883 sia aperta nel firewall. Il protocollo MQTT comunica infatti sulla 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).
- Richiede Visual Studio
Panoramica
Questo articolo descrive come usare Azure IoT SDK per .NET per creare il codice dell'applicazione del servizio back-end e del dispositivo per i moduli gemelli di identità.
Creare un'applicazione per dispositivi
Questa sezione descrive come usare il codice dell'applicazione per dispositivi per:
- Recuperare un dispositivo gemello identità del modulo ed esaminare le proprietà segnalate
- Aggiornare le proprietà del dispositivo gemello dell'identità del modulo segnalato
- Creare un gestore di callback per l'aggiornamento della proprietà desiderato del modulo
Importante
Questo articolo include la procedura per connettere un dispositivo usando una firma di accesso condiviso, altrimenti chiamata autenticazione con chiave simmetrica. Questo metodo di autenticazione è comodo per i test e le valutazioni, ma l'autenticazione tramite certificati X.509 rappresenta un approccio più sicuro. Per scoprire di più, vedere Procedure consigliate per la sicurezza > Sicurezza della connessione.
Pacchetto NuGet del dispositivo richiesto
Per le applicazioni client per dispositivi scritte in C# è necessario il pacchetto NuGet Microsoft.Azure.Devices.Client.
Aggiungere queste using
istruzioni per usare la libreria di dispositivi.
using Microsoft.Azure.Devices.Client;
using Microsoft.Azure.Devices.Shared;
Connettersi a un dispositivo
La classe ModuleClient espone tutti i metodi necessari per interagire con i dispositivi gemelli di identità del modulo dal dispositivo.
Connettersi al dispositivo usando il metodo CreateFromConnectionString con l'identità del modulo stringa di connessione.
La chiamata CreateFromConnectionString
senza un parametro di trasporto si connette utilizzando il trasporto AMQP predefinito.
Questo esempio si connette al dispositivo usando il trasporto AMQP predefinito.
static string ModuleConnectionString = "{Device module identity connection string}";
private static ModuleClient _moduleClient = null;
_moduleClient = ModuleClient.CreateFromConnectionString(ModuleConnectionString, null);
Nota
C#/.NET non supporta la connessione di un'app per dispositivi a un dispositivo gemello di identità del modulo hub IoT usando un certificato.
Recuperare un modulo gemello di identità ed esaminare le proprietà
Chiamare GetTwinAsync per recuperare le proprietà del dispositivo gemello dell'identità del modulo corrente in un oggetto Twin .
In questo esempio vengono recuperate e visualizzate le proprietà del dispositivo gemello dell'identità del modulo in formato JSON.
Console.WriteLine("Retrieving twin...");
Twin twin = await _moduleClient.GetTwinAsync();
Console.WriteLine("\tModule identity twin value received:");
Console.WriteLine(JsonConvert.SerializeObject(twin.Properties));
Aggiornare le proprietà segnalate del dispositivo gemello dell'identità del modulo
Per aggiornare una proprietà segnalata del dispositivo gemello:
- Creare un oggetto TwinCollection per l'aggiornamento della proprietà segnalata
- Aggiornare una o più proprietà segnalate all'interno dell'oggetto
TwinCollection
- Usare UpdateReportedPropertiesAsync per eseguire il push delle modifiche alle proprietà segnalate al servizio hub IoT
Ad esempio:
try
{
Console.WriteLine("Sending sample start time as reported property");
TwinCollection reportedProperties = new TwinCollection();
reportedProperties["DateTimeLastAppLaunch"] = DateTime.UtcNow;
await _moduleClient.UpdateReportedPropertiesAsync(reportedProperties);
}
catch (Exception ex)
{
Console.WriteLine();
Console.WriteLine("Error in sample: {0}", ex.Message);
}
Creare un gestore di callback di aggiornamento delle proprietà desiderate
Passare il nome del metodo del gestore di callback a SetDesiredPropertyUpdateCallbackAsync per creare un gestore di callback di aggiornamento delle proprietà desiderato che viene eseguito quando una proprietà desiderata viene modificata nell'identità del modulo gemello.
Ad esempio, questa chiamata configura il sistema per notificare a un metodo denominato OnDesiredPropertyChangedAsync
ogni volta che viene modificata una proprietà del modulo desiderata.
await _moduleClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChangedAsync, null);
Le proprietà del dispositivo gemello identity del modulo vengono passate al metodo di callback come TwinCollection e possono essere esaminate come KeyValuePair
strutture.
Questo esempio riceve gli aggiornamenti delle proprietà desiderate come TwinCollection
, quindi scorre e visualizza gli aggiornamenti della raccolta KeyValuePair
. Dopo lo scorrimento della raccolta KeyValuePair
, il codice chiama UpdateReportedPropertiesAsync
per aggiornare la proprietà segnalata DateTimeLastDesiredPropertyChangeReceived
in modo da mantenere aggiornata l'ora dell'ultimo aggiornamento.
private async Task OnDesiredPropertyChangedAsync(TwinCollection desiredProperties, object userContext)
{
var reportedProperties = new TwinCollection();
Console.WriteLine("\tDesired properties requested:");
Console.WriteLine($"\t{desiredProperties.ToJson()}");
// For the purpose of this sample, we'll blindly accept all twin property write requests.
foreach (KeyValuePair<string, object> desiredProperty in desiredProperties)
{
Console.WriteLine($"Setting {desiredProperty.Key} to {desiredProperty.Value}.");
reportedProperties[desiredProperty.Key] = desiredProperty.Value;
}
Console.WriteLine("\tAlso setting current time as reported property");
reportedProperties["DateTimeLastDesiredPropertyChangeReceived"] = DateTime.UtcNow;
await _moduleClient.UpdateReportedPropertiesAsync(reportedProperties);
}
Esempio di modulo SDK
Azure IoT SDK per .NET fornisce esempi funzionanti di app per dispositivi che gestiscono le attività dei moduli gemelli di identità. Per altre informazioni, vedi:
Creare un'applicazione back-end
Questa sezione descrive come leggere e aggiornare i campi identity del modulo.
La classe RegistryManager espone tutti i metodi necessari per creare un'applicazione back-end per interagire con i dispositivi gemelli di identità del modulo dal servizio.
Pacchetto NuGet del servizio richiesto
Le applicazioni di servizio back-end richiedono il pacchetto NuGet Microsoft.Azure.Devices.
Aggiungere queste using
istruzioni per usare la libreria di servizi.
using Microsoft.Azure.Devices;
using Microsoft.Azure.Devices.Shared;
Connettersi all'hub IoT
È possibile connettere un servizio back-end a hub IoT usando i metodi seguenti:
- Criteri di accesso condiviso
- Microsoft Entra
Importante
Questo articolo include la procedura per connettersi a un servizio usando una firma di accesso condiviso. Questo metodo di autenticazione è comodo per i test e le valutazioni, ma l'autenticazione a un servizio con Microsoft Entra ID o identità gestite rappresenta un approccio più sicuro. Per altre informazioni, vedere Procedure consigliate per la sicurezza > Sicurezza cloud.
Connettersi usando criteri di accesso condiviso
Connettere un'applicazione back-end all'hub IoT usando CreateFromConnectionString.
Il UpdateModuleAsync
metodo usato in questa sezione richiede l'autorizzazione dei criteri di accesso condiviso di Service Connect per aggiungere le proprietà desiderate a un modulo. Come parametro per CreateFromConnectionString
, fornire un criterio di accesso condiviso stringa di connessione che include l'autorizzazione Service Connect. Per altre informazioni sui criteri di accesso condiviso, vedere Controllare l'accesso alle hub IoT con firme di accesso condiviso.
Ad esempio:
static RegistryManager registryManager;
static string connectionString = "{IoT hub shared access policy connection string}";
registryManager = RegistryManager.CreateFromConnectionString(connectionString);
Connettersi con Microsoft Entra
Un'app back-end che usa Microsoft Entra deve eseguire correttamente l'autenticazione e ottenere le credenziali del token di sicurezza prima di connettersi a hub IoT. Questo token viene passato a un metodo di connessione hub IoT. Per informazioni generali sulla configurazione e l'uso di Microsoft Entra per hub IoT, vedere Controllare l'accesso alle hub IoT tramite Microsoft Entra ID.
Configurare l'app Microsoft Entra
È necessario configurare un'app Microsoft Entra configurata per le credenziali di autenticazione preferite. L'app contiene parametri come il segreto client usato dall'applicazione back-end per l'autenticazione. Le configurazioni di autenticazione delle app disponibili sono:
- Segreto client
- Certificate
- Credenziali di identità federate
Le app Microsoft Entra possono richiedere autorizzazioni di ruolo specifiche a seconda delle operazioni eseguite. Ad esempio, hub IoT Collaboratore gemello è necessario per abilitare l'accesso in lettura e scrittura a un dispositivo e a moduli gemelli hub IoT. Per altre informazioni, vedere Gestire l'accesso alle hub IoT usando l'assegnazione di ruolo controllo degli accessi in base al ruolo di Azure.
Per altre informazioni sulla configurazione di un'app Microsoft Entra, vedere Avvio rapido: Registrare un'applicazione con Microsoft Identity Platform.
Eseguire l'autenticazione con DefaultAzureCredential
Il modo più semplice per usare Microsoft Entra per autenticare un'applicazione back-end consiste nell'usare DefaultAzureCredential, ma è consigliabile usare un metodo diverso in un ambiente di produzione, incluso un oggetto specifico TokenCredential
o ridotto.ChainedTokenCredential
Per semplicità, questa sezione descrive l'autenticazione tramite DefaultAzureCredential
e il segreto client. Per altre informazioni sui vantaggi e sui svantaggi dell'uso DefaultAzureCredential
di , vedere Linee guida sull'utilizzo per DefaultAzureCredential.
DefaultAzureCredential
supporta meccanismi di autenticazione diversi e determina il tipo di credenziale appropriato in base all'ambiente in cui è in esecuzione. Tenta di usare più tipi di credenziali in un ordine fino a quando non trova una credenziale funzionante.
Microsoft Entra richiede questi pacchetti NuGet e le istruzioni corrispondenti using
:
- Azure.Core
- Azure.Identity
using Azure.Core;
using Azure.Identity;
In questo esempio, il segreto client di registrazione dell'app Microsoft Entra, l'ID client e l'ID tenant vengono aggiunti alle variabili di ambiente. Queste variabili di ambiente vengono usate da DefaultAzureCredential
per autenticare l'applicazione. Il risultato di un'autenticazione di Microsoft Entra riuscita è una credenziale del token di sicurezza passata a un metodo di connessione hub IoT.
string clientSecretValue = "xxxxxxxxxxxxxxx";
string clientID = "xxxxxxxxxxxxxx";
string tenantID = "xxxxxxxxxxxxx";
Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", clientSecretValue);
Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", clientID);
Environment.SetEnvironmentVariable("AZURE_TENANT_ID", tenantID);
TokenCredential tokenCredential = new DefaultAzureCredential();
TokenCredential risultante può quindi essere passato a una connessione a un metodo di hub IoT per qualsiasi client SDK che accetta le credenziali di Microsoft Entra:
In questo esempio viene passato a ServiceClient.Create
per creare un oggetto connessione ServiceClient.TokenCredential
string hostname = "xxxxxxxxxx.azure-devices.net";
using var serviceClient = ServiceClient.Create(hostname, tokenCredential, TransportType.Amqp);
In questo esempio viene TokenCredential
passato a RegistryManager.Create
per creare un oggetto RegistryManager .
string hostname = "xxxxxxxxxx.azure-devices.net";
registryManager = RegistryManager.Create(hostname, tokenCredential);
Esempio di codice
Per un esempio funzionante dell'autenticazione del servizio Microsoft Entra, vedere Esempio di autenticazione basata su ruoli.
Leggere e aggiornare i campi identity del modulo
Chiamare GetModuleAsync per recuperare i campi gemelli dell'identità del modulo corrente in un oggetto Module .
La Module
classe include properties
che corrispondono alle sezioni di un modulo gemello identity. Usare le proprietà della classe Module per visualizzare e aggiornare i campi del modulo gemello Identity. È possibile usare le proprietà dell'oggetto Module
per aggiornare più campi prima di scrivere gli aggiornamenti nel dispositivo usando UpdateModuleAsync
.
Dopo aver apportato gli aggiornamenti dei campi identity twin del modulo, chiama UpdateModuleAsync per scrivere Module
gli aggiornamenti dei campi oggetto in un dispositivo. Usare la logica try
e catch
abbinata a un gestore errori per rilevare errori di patch formattate in modo errato da UpdateModuleAsync
.
Questo esempio recupera un modulo in un Module
oggetto, aggiorna la module
LastActivityTime
proprietà e quindi aggiorna il modulo in hub IoT usando UpdateModuleAsync
.
// Retrieve the module
var module = await registryManager.GetModuleAsync("myDeviceId","myModuleId");
// Update the module object
module.LastActivityTime = DateTime.Now;
// Apply the patch to update the device twin tags section
try
{
await registryManager.UpdateModuleAsync(module);
}
catch (Exception e)
{
console.WriteLine("Module update failed.", e.Message);
}
Altre API del modulo
- GetModulesOnDeviceAsync : recupera le identità del modulo in un dispositivo
- RemoveModuleAsync - Elimina un modulo registrato in precedenza da un dispositivo
Esempio di SDK per servizi
Azure IoT SDK per .NET fornisce un esempio funzionante di un'app del servizio che gestisce le attività dei moduli gemelli di identità. Per altre informazioni, vedere Test E2E di Registry Manager.
- È consigliabile usare Python versione 3.7 o successive. Assicurarsi di usare le installazioni a 32 bit o 64 bit, come richiesto dalla configurazione. Quando richiesto durante l'installazione, assicurarsi di aggiungere Python alla variabile di ambiente specifica per la piattaforma.
Panoramica
Questo articolo descrive come usare Azure IoT SDK per Python per creare il codice dell'applicazione del servizio back-end e del dispositivo per i moduli gemelli di identità.
Installare i pacchetti
Per creare applicazioni per dispositivi, è necessario installare la libreria azure-iot-device .
pip install azure-iot-device
Per creare applicazioni di servizio back-end, è necessario installare la libreria azure-iot-hub .
pip install azure-iot-hub
La libreria msrest viene usata per rilevare le eccezioni HTTPOperationError.
pip install msrest
Creare un'applicazione per dispositivi
Questa sezione descrive come usare il codice dell'applicazione per dispositivi per:
- Recuperare un dispositivo gemello identità del modulo ed esaminare le proprietà segnalate
- Aggiornare le proprietà segnalate del dispositivo gemello dell'identità del modulo
- Creare un gestore di callback dell'aggiornamento della proprietà desiderata dell'identità del modulo gemello
Importante
Questo articolo include la procedura per connettere un dispositivo usando una firma di accesso condiviso, altrimenti chiamata autenticazione con chiave simmetrica. Questo metodo di autenticazione è comodo per i test e le valutazioni, ma l'autenticazione tramite certificati X.509 rappresenta un approccio più sicuro. Per scoprire di più, vedere Procedure consigliate per la sicurezza > Sicurezza della connessione.
Istruzioni Import
Aggiungere questa import
istruzione per usare la libreria di dispositivi.
# import the device client library
import asyncio
from azure.iot.device.aio import IoTHubDeviceClient
Connettersi a un dispositivo
La classe IoTHubModuleClient contiene metodi che possono essere usati per lavorare con i dispositivi gemelli di identità del modulo.
Per connettere un'applicazione a un dispositivo:
- Chiamare create_from_connection_string per aggiungere l'identità del modulo stringa di connessione
- Chiamare connect per connettere il client del dispositivo a un hub IoT di Azure
# import the device client library
import asyncio
from azure.iot.device.aio import IoTHubDeviceClient
# substitute the device connection string in conn_str
# and add it to the IoTHubDeviceClient object
conn_str = "{Device module identity connection string}"
device_client = IoTHubDeviceClient.create_from_connection_string(conn_str)
# connect the application to the device
await device_client.connect()
Nota
Python non supporta la connessione di un'app per dispositivi a un modulo gemello di hub IoT usando un certificato.
Recuperare un modulo gemello di identità ed esaminare le proprietà
Chiamare get_twin per recuperare l'identità del modulo gemello dal servizio hub IoT di Azure. Le informazioni sul gemello vengono inserite in una variabile che può essere esaminata.
Questo esempio recupera il dispositivo gemello e usa il comando print
per visualizzarlo in formato JSON.
# get the twin
twin = await device_client.get_twin()
print("Twin document:")
print("{}".format(twin))
Aggiornare le proprietà segnalate del dispositivo gemello dell'identità del modulo
È possibile applicare una patch per aggiornare le proprietà segnalate del dispositivo gemello dell'identità del modulo in formato JSON.
Per applicare una patch al fine di aggiornare le proprietà segnalate:
- Assegnare una patch JSON per le proprietà segnalate a una variabile.
- Chiamare patch_twin_reported_properties per applicare la patch JSON alle proprietà segnalate.
Ad esempio:
# create the reported properties patch
reported_properties = {"temperature": random.randint(320, 800) / 10}
print("Setting reported temperature to {}".format(reported_properties["temperature"]))
# update the reported properties and wait for the result
await device_client.patch_twin_reported_properties(reported_properties)
Creare un gestore di callback dell'aggiornamento della proprietà desiderata dell'identità del modulo gemello
Chiamare on_twin_desired_properties_patch_received per creare una funzione del gestore o una coroutine chiamata quando viene ricevuta una patch delle proprietà desiderate di un'identità del modulo gemello. Il gestore accetta un solo argomento, ovvero la patch del dispositivo gemello sotto forma di oggetto dizionario JSON.
Questo esempio configura un gestore patch delle proprietà desiderate denominato twin_patch_handler
.
Ad esempio:
try:
# Set handlers on the client
device_client.on_twin_desired_properties_patch_received = twin_patch_handler
except:
# Clean up in the event of failure
client.shutdown()
twin_patch_handler
riceve e visualizza gli aggiornamenti delle proprietà desiderate in formato JSON.
# Define behavior for receiving twin desired property patches
def twin_patch_handler(twin_patch):
print("Twin patch received:")
print(twin_patch)
Esempi di SDK per dispositivi
Azure IoT SDK per Python offre un esempio funzionante di app per dispositivi che gestiscono le attività dei moduli gemelli di identità:
- get_twin - Si connette a un dispositivo e recupera le informazioni sul dispositivo gemello.
- update_twin_reported_properties - Aggiorna le proprietà segnalate del dispositivo gemello.
- receive_twin_desired_properties - Riceve e aggiorna le proprietà desiderate.
Creare un'applicazione back-end
Questa sezione descrive come creare un'applicazione back-end per recuperare e aggiornare le proprietà desiderate dell'identità del modulo gemello.
La classe IoTHubRegistryManager espone tutti i metodi necessari per creare un'applicazione back-end per interagire con i dispositivi gemelli di identità del modulo dal servizio.
Istruzioni di importazione del servizio
Aggiungere questa import
istruzione per usare la libreria di servizi.
import sys
from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import Twin, TwinProperties, QuerySpecification, QueryResult
Connettersi all'hub IoT
È possibile connettere un servizio back-end a hub IoT usando i metodi seguenti:
- Criteri di accesso condiviso
- Microsoft Entra
Importante
Questo articolo include la procedura per connettersi a un servizio usando una firma di accesso condiviso. Questo metodo di autenticazione è comodo per i test e le valutazioni, ma l'autenticazione a un servizio con Microsoft Entra ID o identità gestite rappresenta un approccio più sicuro. Per altre informazioni, vedere Procedure consigliate per la sicurezza > Sicurezza cloud.
Connettersi usando criteri di accesso condiviso
Connettersi all'hub IoT mediante from_connection_string.
Il update_module_twin
metodo usato in questa sezione richiede l'autorizzazione dei criteri di accesso condiviso di Service Connect per aggiungere le proprietà desiderate a un modulo. Come parametro per from_connection_string
, fornire un criterio di accesso condiviso stringa di connessione che include l'autorizzazione Service Connect. Per altre informazioni sui criteri di accesso condiviso, vedere Controllare l'accesso alle hub IoT con firme di accesso condiviso.
Ad esempio:
# Connect to IoT hub
IOTHUB_CONNECTION_STRING = "{IoT hub shared access policy connection string}"
iothub_registry_manager = IoTHubRegistryManager.from_connection_string(IOTHUB_CONNECTION_STRING)
Connettersi con Microsoft Entra
Un'app back-end che usa Microsoft Entra deve eseguire correttamente l'autenticazione e ottenere le credenziali del token di sicurezza prima di connettersi a hub IoT. Questo token viene passato a un metodo di connessione hub IoT. Per informazioni generali sulla configurazione e l'uso di Microsoft Entra per hub IoT, vedere Controllare l'accesso alle hub IoT tramite Microsoft Entra ID.
Per una panoramica dell'autenticazione di Python SDK, vedere Autenticare le app Python nei servizi di Azure usando Azure SDK per Python
Configurare l'app Microsoft Entra
È necessario configurare un'app Microsoft Entra configurata per le credenziali di autenticazione preferite. L'app contiene parametri come il segreto client usato dall'applicazione back-end per l'autenticazione. Le configurazioni di autenticazione delle app disponibili sono:
- Segreto client
- Certificate
- Credenziali di identità federate
Le app Microsoft Entra possono richiedere autorizzazioni di ruolo specifiche a seconda delle operazioni eseguite. Ad esempio, hub IoT Collaboratore gemello è necessario per abilitare l'accesso in lettura e scrittura a un dispositivo e a moduli gemelli hub IoT. Per altre informazioni, vedere Gestire l'accesso alle hub IoT usando l'assegnazione di ruolo controllo degli accessi in base al ruolo di Azure.
Per altre informazioni sulla configurazione di un'app Microsoft Entra, vedere Avvio rapido: Registrare un'applicazione con Microsoft Identity Platform.
Eseguire l'autenticazione con DefaultAzureCredential
Il modo più semplice per usare Microsoft Entra per autenticare un'applicazione back-end consiste nell'usare DefaultAzureCredential, ma è consigliabile usare un metodo diverso in un ambiente di produzione, incluso un oggetto specifico TokenCredential
o ridotto.ChainedTokenCredential
Per semplicità, questa sezione descrive l'autenticazione tramite DefaultAzureCredential
e il segreto client. Per altre informazioni sui vantaggi e sui svantaggi dell'uso DefaultAzureCredential
di , vedere Catene di credenziali nella libreria client di Identità di Azure per Python.
DefaultAzureCredential supporta meccanismi di autenticazione diversi e determina il tipo di credenziale appropriato in base all'ambiente in cui è in esecuzione. Tenta di usare più tipi di credenziali in un ordine fino a quando non trova una credenziale funzionante.
Microsoft Entra richiede questo pacchetto di importazione e l'istruzione corrispondente import
:
pip install azure-identity
from azure.identity import DefaultAzureCredential
In questo esempio, il segreto client di registrazione dell'app Microsoft Entra, l'ID client e l'ID tenant sono stati aggiunti alle variabili di ambiente. Queste variabili di ambiente vengono usate da DefaultAzureCredential
per autenticare l'applicazione. Il risultato di un'autenticazione di Microsoft Entra riuscita è una credenziale del token di sicurezza passata a un metodo di connessione hub IoT.
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
L'oggetto AccessToken risultante può quindi essere passato a per connettersi from_token_credential
a hub IoT per qualsiasi client SDK che accetta le credenziali di Microsoft Entra:
- IoTHubRegistryManager per creare una connessione al servizio per hub IoT usando le credenziali del token Entra.
- IoTHubJobManager
- DigitalTwinClient
- IoTHubHttpRuntimeManager
- IoTHubConfigurationManager
from_token_credential
richiede due parametri:
- URL del servizio di Azure: l'URL del servizio di Azure deve essere nel formato
{Your Entra domain URL}.azure-devices.net
senza unhttps://
prefisso. Ad esempio:MyAzureDomain.azure-devices.net
. - Token delle credenziali di Azure
In questo esempio, le credenziali di Azure vengono ottenute usando DefaultAzureCredential
. L'URL e le credenziali del servizio di Azure vengono quindi forniti per IoTHubRegistryManager.from_token_credential
creare la connessione a hub IoT.
import sys
import os
from azure.identity import DefaultAzureCredential
from azure.iot.hub import IoTHubRegistryManager
# Define the client secret values
clientSecretValue = 'xxxxxxxxxxxxxxx'
clientID = 'xxxxxxxxxxxxxx'
tenantID = 'xxxxxxxxxxxxx'
# Set environment variables
os.environ['AZURE_CLIENT_SECRET'] = clientSecretValue
os.environ['AZURE_CLIENT_ID'] = clientID
os.environ['AZURE_TENANT_ID'] = tenantID
# Acquire a credential object
credential = DefaultAzureCredential()
# Use Entra to authorize IoT Hub service
print("Connecting to IoTHubRegistryManager...")
iothub_registry_manager = IoTHubRegistryManager.from_token_credential(
url="MyAzureDomain.azure-devices.net",
token_credential=credential)
Esempi di codice
Per esempi di utilizzo dell'autenticazione del servizio Microsoft Entra, vedere Microsoft Authentication Library (MSAL) per Python.
Recuperare e aggiornare le proprietà desiderate dell'identità del modulo gemello
È possibile aggiornare le proprietà desiderate da un'applicazione back-end usando update_module_twin.
Per recuperare e aggiornare le proprietà desiderate dell'identità del modulo gemello:
- Chiamare get_module_twin per ottenere la versione corrente dell'identità del modulo gemello.
- Usare la classe Twin per aggiungere le proprietà desiderate in formato JSON.
- Chiamare
update_module_twin
per applicare la patch al dispositivo gemello. È anche possibile usare replace_module_twin per sostituire le proprietà e i tag desiderati per un dispositivo gemello di identità del modulo.
In questo esempio la telemetryInterval
proprietà desiderata viene aggiornata a 122
.
try:
module_twin = iothub_registry_manager.get_module_twin(DEVICE_ID, MODULE_ID)
print ( "" )
print ( "Module identity twin properties before update:" )
print ( "{0}".format(module_twin.properties) )
# Update twin
twin_patch = Twin()
twin_patch.properties = TwinProperties(desired={"telemetryInterval": 122})
updated_module_twin = iothub_registry_manager.update_module_twin(
DEVICE_ID, MODULE_ID, twin_patch, module_twin.etag
)
print ( "" )
print ( "Module identity twin properties after update :" )
print ( "{0}".format(updated_module_twin.properties) )
except Exception as ex:
print ( "Unexpected error {0}".format(ex) )
except KeyboardInterrupt:
print ( "IoTHubRegistryManager sample stopped" )
Esempio di SDK per servizi
Azure IoT SDK per Python fornisce un esempio funzionante di un'app del servizio che gestisce le attività del modulo gemello del modulo di identità del dispositivo. Per altre informazioni, vedere Test IoTHub Registry Manager.For more information, see Test IoTHub Registry Manager.
- Richiede Node.js versione 10.0.x o successiva
Panoramica
Questo articolo descrive come usare Azure IoT SDK per Node.js per creare il codice dell'applicazione del servizio back-end e del dispositivo per i moduli gemelli di identità.
Creare un'applicazione per dispositivi
Questa sezione descrive come usare il pacchetto azure-iot-device in Azure IoT SDK per Node.js per creare un’applicazione per dispositivi al fine di:
- Recuperare un dispositivo gemello identità del modulo ed esaminare le proprietà segnalate
- Aggiornare le proprietà segnalate dell'identità del modulo gemello
- Ricevere una notifica di modifica della proprietà desiderata dell'identità del modulo gemello
Il pacchetto azure-iot-device contiene oggetti che si interfacciano con i dispositivi IoT. La classe twin include oggetti specifici del dispositivo gemello. Questa sezione descrive il Client
codice di classe usato per leggere e scrivere dati di identità del modulo dispositivo gemello.
Installare il pacchetto SDK
Eseguire questo comando per installare l’SDK per dispositivi azure-iot-device nel computer di sviluppo:
npm install azure-iot-device --save
Connettere un dispositivo all'hub IoT
Un'app per dispositivi può eseguire l'autenticazione con hub IoT usando i metodi seguenti:
- Chiave di accesso condiviso
- Certificato X.509
Importante
Questo articolo include la procedura per connettere un dispositivo usando una firma di accesso condiviso, altrimenti chiamata autenticazione con chiave simmetrica. Questo metodo di autenticazione è comodo per i test e le valutazioni, ma l'autenticazione tramite certificati X.509 rappresenta un approccio più sicuro. Per scoprire di più, vedere Procedure consigliate per la sicurezza > Sicurezza della connessione.
Eseguire l'autenticazione con una chiave di accesso condiviso
Scegliere un protocollo di trasporto
L'oggetto Client
supporta i protocolli seguenti:
Amqp
Http
: quando si usaHttp
, l'istanzaClient
verifica con scarsa frequenza la presenza di messaggi provenienti dall'hub IoT (almeno ogni 25 minuti).Mqtt
MqttWs
AmqpWs
Installare i protocolli di trasporto necessari nel computer di sviluppo.
Ad esempio, questo comando installa il protocollo Amqp
:
npm install azure-iot-device-amqp --save
Per altre informazioni sulle differenze tra il supporto MQTT, AMQP e HTTPS, vedere Linee guida per le comunicazioni da cloud a dispositivo e Scegliere un protocollo di comunicazione del dispositivo.
Creare un oggetto client
Creare un Client
oggetto usando il pacchetto installato.
Ad esempio:
const Client = require('azure-iot-device').Client;
Creare un oggetto protocollo
Creare un Protocol
oggetto usando un pacchetto di trasporto installato.
In questo esempio viene assegnato il protocollo AMQP:
const Protocol = require('azure-iot-device-amqp').Amqp;
Aggiungere la stringa di connessione del dispositivo e il protocollo di trasporto
Chiamare fromConnectionString per specificare i parametri di connessione del dispositivo:
- connStr: modulo identity dell'hub IoT stringa di connessione.
- transportCtor: protocollo di trasporto.
Questo esempio usa il protocollo di trasporto Amqp
:
const deviceConnectionString = "{IoT hub identity module connection string}"
const Protocol = require('azure-iot-device-mqtt').Amqp;
let client = Client.fromConnectionString(deviceConnectionString, Protocol);
Aprire la connessione all'hub IoT
Usare il metodo open per aprire una connessione tra un dispositivo IoT e l'hub IoT.
Ad esempio:
client.open(function(err) {
if (err) {
console.error('error connecting to hub: ' + err);
process.exit(1);
}
})
Eseguire l'autenticazione con un certificato X.509
Il certificato X.509 è collegato al trasporto di connessione da dispositivo a hub IoT.
Per configurare una connessione da dispositivo a hub IoT usando un certificato X.509:
Chiamare daConnectionString per aggiungere il modulo device o identity stringa di connessione e il tipo di trasporto all'oggetto
Client
. Aggiungerex509=true
al stringa di connessione per indicare che un certificato viene aggiunto aDeviceClientOptions
. Ad esempio:Un dispositivo stringa di connessione:
HostName=xxxxx.azure-devices.net;DeviceId=Device-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true
Un modulo identity stringa di connessione:
HostName=xxxxx.azure-devices.net;DeviceId=Device-1;ModuleId=Module-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true
Configurare una variabile JSON con i dettagli del certificato e passarla a DeviceClientOptions.
Chiamare setOptions per aggiungere un certificato e una chiave X.509 (e, facoltativamente, passphrase) al trasporto client.
Chiamare open per aprire la connessione dal dispositivo per hub IoT.
Questo esempio mostra le informazioni di configurazione del certificato all'interno di una variabile JSON. La configurazione clientOptions
della certificazione viene passata a setOptions
e la connessione viene aperta usando open
.
const Client = require('azure-iot-device').Client;
const Protocol = require('azure-iot-device-mqtt').Mqtt;
// Connection string illustrated for demonstration only. Never hard-code the connection string in production. Instead use an environmental variable or other secure storage.
const connectionString = `HostName=xxxxx.azure-devices.net;DeviceId=Device-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true`
const client = Client.fromConnectionString(connectionString, Protocol);
var clientOptions = {
cert: myX509Certificate,
key: myX509Key,
passphrase: passphrase,
http: {
receivePolicy: {
interval: 10
}
}
}
client.setOptions(clientOptions);
client.open(connectCallback);
Per altre informazioni sull'autenticazione del certificato, vedere:
Esempio di codice
Per un esempio funzionante dell'autenticazione del certificato X.509 del dispositivo, vedere Dispositivo di esempio semplice X.509.
Recuperare un dispositivo gemello identità del modulo ed esaminare le proprietà segnalate
Chiamare getTwin per recuperare le informazioni sul gemello dell'identità del modulo corrente in un oggetto Twin .
Il codice del dispositivo può quindi accedere alle proprietà del dispositivo gemello dell'identità del modulo.
Ad esempio:
// Retrieve the current module identity twin
client.getTwin(function(err, twin))
if (err)
console.error('could not get twin');
// Display the current properties
console.log('twin contents:');
console.log(twin.properties);
Aggiornare le proprietà segnalate del dispositivo gemello dell'identità del modulo
Usare update per aggiornare le proprietà segnalate del dispositivo. Includere una patch in formato JSON come primo parametro e il metodo di callback dello stato di esecuzione della funzione come secondo parametro del metodo.
In questo esempio, nella variabile viene archiviata patch
una patch di identità del modulo gemello in formato JSON. La patch contiene un valore di aggiornamento dell'identità del modulo gemello connectivity
pari a cellular
. La patch e il gestore errori vengono passati al metodo update
. In caso di errore, viene visualizzato un messaggio di errore della console.
// Create a patch to send to IoT Hub
var patch = {
updateTime: new Date().toString(),
firmwareVersion:'1.2.1',
weather:{
temperature: 72,
humidity: 17
}
};
// Apply the patch
twin.properties.reported.update(patch, function(err)
{
if (err)
{
console.error('could not update twin');
}
else
{
console.log('twin state reported');
process.exit();
}
});
Ricevere una notifica di modifica della proprietà desiderata dell'identità del modulo gemello
Creare un listener di eventi di aggiornamento delle proprietà desiderato dell'identità del modulo gemello che viene eseguito quando viene modificata una proprietà desiderata passando il nome del metodo del gestore di callback a twin.on.
Il listener di eventi di proprietà desiderato può assumere i formati seguenti:
- Ricevere tutte le patch con un solo gestore eventi
- Ricevere un evento se qualcosa cambia in un raggruppamento di proprietà
- Ricevere un evento per la modifica di una singola proprietà
Ricevere tutte le patch con un solo gestore eventi
È possibile creare un listener per ricevere qualsiasi modifica alle proprietà desiderate.
Questo codice di esempio restituisce tutte le proprietà ricevute dal servizio.
twin.on('properties.desired', function (delta) {
console.log('new desired properties received:');
console.log(JSON.stringify(delta));
});
Ricevere un evento se qualcosa cambia in un raggruppamento di proprietà
È possibile creare un listener per ricevere un evento se cambia qualcosa in un raggruppamento di proprietà.
Ad esempio:
Le proprietà
minTemperature
emaxTemperature
sono contenute in un raggruppamento di proprietà denominatoproperties.desired.climate changes
.Un'applicazione del servizio back-end applica questa patch per aggiornare le proprietà desiderate
minTemperature
emaxTemperature
:const twinPatch1 = { properties: { desired: { climate: { minTemperature: 68, maxTemperature: 76, }, }, }, };
Questo codice configura un listener di eventi di modifica della proprietà desiderato che attiva tutte le modifiche all'interno del raggruppamento di
properties.desired.climate
proprietà. Se è presente una modifica della proprietà desiderata all'interno di questo gruppo, nella console vengono visualizzati i messaggi di modifica della temperatura minima e massima:twin.on('properties.desired.climate', function (delta) { if (delta.minTemperature || delta.maxTemperature) { console.log('updating desired temp:'); console.log('min temp = ' + twin.properties.desired.climate.minTemperature); console.log('max temp = ' + twin.properties.desired.climate.maxTemperature); } });
Ricevere un evento per la modifica di una singola proprietà
È possibile configurare un listener per una singola modifica di proprietà. In questo esempio, il codice di questo evento viene eseguito solo se il valore booleano fanOn
fa parte della patch. Il codice restituisce il nuovo stato della proprietà desiderata fanOn
ogni volta che il servizio lo aggiorna.
Un'applicazione back-end applica questa patch della proprietà desiderata:
const twinPatch2 = { properties: { desired: { climate: { hvac: { systemControl: { fanOn: true, }, }, }, }, }, };
Il listener viene attivato solo quando la proprietà
fanOn
cambia:twin.on('properties.desired.climate.hvac.systemControl', function (fanOn) { console.log('setting fan state to ' + fanOn); });
Esempio completo
In questo esempio vengono incapsulati i principi di questa sezione, inclusa l'annidamento delle funzioni di callback a più livelli.
var Client = require('azure-iot-device').Client;
var Protocol = require('azure-iot-device-amqp').Amqp;
// Copy/paste your module connection string here.
var connectionString = 'HostName=xxx.azure-devices.net;DeviceId=myFirstDevice2;ModuleId=myFirstModule2;SharedAccessKey=xxxxxxxxxxxxxxxxxx';
// Create a client using the Amqp protocol.
var client = Client.fromConnectionString(connectionString, Protocol);
client.on('error', function (err) {
console.error(err.message);
});
// connect to the hub
client.open(function(err) {
if (err) {
console.error('error connecting to hub: ' + err);
process.exit(1);
}
console.log('client opened');
// Create device Twin
client.getTwin(function(err, twin) {
if (err) {
console.error('error getting twin: ' + err);
process.exit(1);
}
// Output the current properties
console.log('twin contents:');
console.log(twin.properties);
// Add a handler for desired property changes
twin.on('properties.desired', function(delta) {
console.log('new desired properties received:');
console.log(JSON.stringify(delta));
});
// create a patch to send to the hub
var patch = {
updateTime: new Date().toString(),
firmwareVersion:'1.2.1',
weather:{
temperature: 75,
humidity: 20
}
};
// send the patch
twin.properties.reported.update(patch, function(err) {
if (err) throw err;
console.log('twin state reported');
});
});
});
Esempi di SDK per dispositivi
Azure IoT SDK per Node.js fornisce esempi funzionanti di app per dispositivi che gestiscono le attività dei moduli gemelli di identità. Per altre informazioni, vedi:
Creare un'applicazione back-end
Questa sezione descrive come creare un'applicazione back-end che recupera un'identità del modulo gemello e aggiorna le proprietà desiderate.
Installare il pacchetto SDK del servizio
Eseguire questo comando per installare azure-iothub nel computer di sviluppo:
npm install azure-iothub --save
Creare un oggetto Registry
La classe Registry espone tutti i metodi necessari per interagire con i dispositivi gemelli di identità del modulo da un'applicazione back-end.
let Registry = require('azure-iothub').Registry;
Connettersi all'hub IoT
È possibile connettere un servizio back-end a hub IoT usando i metodi seguenti:
- Criteri di accesso condiviso
- Microsoft Entra
Importante
Questo articolo include la procedura per connettersi a un servizio usando una firma di accesso condiviso. Questo metodo di autenticazione è comodo per i test e le valutazioni, ma l'autenticazione a un servizio con Microsoft Entra ID o identità gestite rappresenta un approccio più sicuro. Per altre informazioni, vedere Procedure consigliate per la sicurezza > Sicurezza cloud.
Connettersi usando criteri di accesso condiviso
Usare fromConnectionString per connettersi all'hub IoT.
Il update
metodo usato in questa sezione richiede l'autorizzazione dei criteri di accesso condiviso di Service Connect per aggiungere le proprietà desiderate a un modulo. Come parametro per fromConnectionString
, fornire un criterio di accesso condiviso stringa di connessione che include l'autorizzazione Service Connect. Per altre informazioni sui criteri di accesso condiviso, vedere Controllare l'accesso alle hub IoT con firme di accesso condiviso.
let connectionString = '{IoT hub shared access policy connection string}';
let registry = Registry.fromConnectionString(serviceConnectionString);
Connettersi con Microsoft Entra
Un'app back-end che usa Microsoft Entra deve eseguire correttamente l'autenticazione e ottenere le credenziali del token di sicurezza prima di connettersi a hub IoT. Questo token viene passato a un metodo di connessione hub IoT. Per informazioni generali sulla configurazione e l'uso di Microsoft Entra per hub IoT, vedere Controllare l'accesso alle hub IoT tramite Microsoft Entra ID.
Per una panoramica dell'autenticazione Node.js SDK, vedere:
Configurare l'app Microsoft Entra
È necessario configurare un'app Microsoft Entra configurata per le credenziali di autenticazione preferite. L'app contiene parametri come il segreto client usato dall'applicazione back-end per l'autenticazione. Le configurazioni di autenticazione delle app disponibili sono:
- Segreto client
- Certificate
- Credenziali di identità federate
Le app Microsoft Entra possono richiedere autorizzazioni di ruolo specifiche a seconda delle operazioni eseguite. Ad esempio, hub IoT Collaboratore gemello è necessario per abilitare l'accesso in lettura e scrittura a un dispositivo e a moduli gemelli hub IoT. Per altre informazioni, vedere Gestire l'accesso alle hub IoT usando l'assegnazione di ruolo controllo degli accessi in base al ruolo di Azure.
Per altre informazioni sulla configurazione di un'app Microsoft Entra, vedere Avvio rapido: Registrare un'applicazione con Microsoft Identity Platform.
Eseguire l'autenticazione con DefaultAzureCredential
Il modo più semplice per usare Microsoft Entra per autenticare un'applicazione back-end consiste nell'usare DefaultAzureCredential, ma è consigliabile usare un metodo diverso in un ambiente di produzione, incluso un oggetto specifico TokenCredential
o ridotto.ChainedTokenCredential
Per semplicità, questa sezione descrive l'autenticazione tramite DefaultAzureCredential
e il segreto client.
Per altre informazioni sui vantaggi e sui svantaggi dell'uso DefaultAzureCredential
di , vedere Catene di credenziali nella libreria client di Identità di Azure per JavaScript
DefaultAzureCredential supporta meccanismi di autenticazione diversi e determina il tipo di credenziale appropriato in base all'ambiente in cui è in esecuzione. Tenta di usare più tipi di credenziali in un ordine fino a quando non trova una credenziale funzionante.
Microsoft Entra richiede questo pacchetto:
npm install --save @azure/identity
In questo esempio, il segreto client di registrazione dell'app Microsoft Entra, l'ID client e l'ID tenant sono stati aggiunti alle variabili di ambiente. Queste variabili di ambiente vengono usate da DefaultAzureCredential
per autenticare l'applicazione. Il risultato di un'autenticazione di Microsoft Entra riuscita è una credenziale del token di sicurezza passata a un metodo di connessione hub IoT.
import { DefaultAzureCredential } from "@azure/identity";
// Azure SDK clients accept the credential as a parameter
const credential = new DefaultAzureCredential();
Il token delle credenziali risultante può quindi essere passato a fromTokenCredential per connettersi a hub IoT per qualsiasi client SDK che accetta le credenziali di Microsoft Entra:
fromTokenCredential
richiede due parametri:
- URL del servizio di Azure: l'URL del servizio di Azure deve essere nel formato
{Your Entra domain URL}.azure-devices.net
senza unhttps://
prefisso. Ad esempio:MyAzureDomain.azure-devices.net
. - Token delle credenziali di Azure
In questo esempio, le credenziali di Azure vengono ottenute usando DefaultAzureCredential
. L'URL e le credenziali del dominio di Azure vengono quindi forniti per Registry.fromTokenCredential
creare la connessione a hub IoT.
const { DefaultAzureCredential } = require("@azure/identity");
let Registry = require('azure-iothub').Registry;
// Define the client secret values
clientSecretValue = 'xxxxxxxxxxxxxxx'
clientID = 'xxxxxxxxxxxxxx'
tenantID = 'xxxxxxxxxxxxx'
// Set environment variables
process.env['AZURE_CLIENT_SECRET'] = clientSecretValue;
process.env['AZURE_CLIENT_ID'] = clientID;
process.env['AZURE_TENANT_ID'] = tenantID;
// Acquire a credential object
const credential = new DefaultAzureCredential()
// Create an instance of the IoTHub registry
hostName = 'MyAzureDomain.azure-devices.net';
let registry = Registry.fromTokenCredential(hostName,credential);
Esempi di codice
Per esempi di utilizzo dell'autenticazione del servizio Microsoft Entra, vedere Esempi di identità di Azure.
Recuperare un modulo gemello identità e aggiornare le proprietà desiderate
È possibile creare una patch contenente gli aggiornamenti delle proprietà desiderati per un modulo gemello di identità.
Per aggiornare un modulo gemello identity:
Chiamare getModuleTwin per recuperare l'oggetto dispositivo Gemello.
Formattare una patch contenente l'aggiornamento del dispositivo gemello dell'identità del modulo. La patch è in formato JSON come descritto in Classe Twin. Una patch del servizio back-end contiene gli aggiornamenti delle proprietà desiderati. Per altre informazioni sul formato delle patch, vedere Formato di tag e proprietà.
Chiamare l'aggiornamento per aggiornare l'identità del modulo gemello con la patch.
In questo esempio l'identità del modulo gemello viene recuperata per myDeviceId
e myModuleId
. Viene quindi applicata una patch ai gemelli che contengono climate
informazioni.
// Insert your device ID and moduleId here.
var deviceId = 'myFirstDevice2';
var moduleId = 'myFirstModule2';
// Retrieve the current module identity twin
registry.getModuleTwin(deviceId, moduleId, function (err, twin) {
console.log('getModuleTwin returned ' + (err ? err : 'success'));
if (err) {
console.log(err);
} else {
console.log('success');
console.log('Current twin:' + JSON.stringify(twin))
// Format a desired property patch
const twinPatch1 = {
properties: {
desired: {
climate: { minTemperature: 69, maxTemperature: 77, },
},
},
};
// Send the desired property patch to IoT Hub
twin.update(twinPatch1, function(err) {
if (err) throw err;
console.log('twin state reported');
});
}
});
Esempi di Service SDK
Azure IoT SDK per Node.js fornisce esempi funzionanti di app del servizio che gestiscono le attività dei moduli gemelli di identità. Per altre informazioni, vedi: