Wprowadzenie do zarządzania bliźniaczymi reprezentacjami urządzeń
Użyj zestawu SDK urządzenia usługi Azure IoT Hub i zestawu SDK usługi, aby opracowywać aplikacje obsługujące typowe zadania bliźniaczych reprezentacji urządzeń. Bliźniacze reprezentacje urządzeń to dokumenty JSON, które przechowują informacje o stanie urządzenia, w tym metadane, konfiguracje i warunki. Usługa IoT Hub utrzymuje bliźniacze reprezentację urządzenia dla każdego urządzenia, które łączy się z nim.
Bliźniacze reprezentacje urządzeń umożliwiają:
- Przechowywanie metadanych urządzenia z zaplecza rozwiązania
- Zgłoś bieżące informacje o stanie, takie jak dostępne możliwości i warunki, na przykład użyta metoda łączności z poziomu aplikacji urządzenia
- Synchronizowanie stanu długotrwałych przepływów pracy, takich jak aktualizacje oprogramowania układowego i konfiguracji, między aplikacją urządzenia a aplikacją zaplecza
- Wykonywanie zapytań dotyczących metadanych, konfiguracji lub stanu urządzenia
Aby uzyskać więcej informacji o bliźniaczych reprezentacjach urządzeń, w tym o tym, kiedy używać bliźniaczych reprezentacji urządzeń, zobacz Omówienie bliźniaczych reprezentacji urządzeń i korzystanie z nich w usłudze IoT Hub.
Uwaga
Funkcje opisane w tym artykule są dostępne tylko w warstwie Standardowa usługi IoT Hub. Aby uzyskać więcej informacji na temat warstw podstawowej i standardowej/bezpłatnej usługi IoT Hub, zobacz Wybieranie odpowiedniej warstwy usługi IoT Hub dla rozwiązania.
W tym artykule przedstawiono sposób tworzenia dwóch typów aplikacji:
- Aplikacje urządzeń mogą obsługiwać żądania aktualizacji żądanych właściwości i reagować na zmiany w zgłoszonych właściwościach.
- Aplikacje usługi mogą aktualizować tagi bliźniaczych reprezentacji urządzeń, ustawiać nowe żądane właściwości i wykonywać zapytania dotyczące urządzeń na podstawie wartości bliźniaczych reprezentacji urządzeń.
Uwaga
Ten artykuł ma na celu uzupełnienie przykładów zestawów SDK usługi Azure IoT, do których odwołuje się ten artykuł. Za pomocą narzędzi zestawu SDK można tworzyć zarówno aplikacje urządzeń, jak i zaplecza.
Wymagania wstępne
Centrum IoT. Niektóre wywołania zestawu SDK wymagają parametry połączenia podstawowej usługi IoT Hub, dlatego zanotuj parametry połączenia.
Zarejestrowane urządzenie. Niektóre wywołania zestawu SDK wymagają parametry połączenia podstawowego urządzenia, dlatego zanotuj parametry połączenia.
Jeśli aplikacja używa protokołu MQTT, upewnij się, że port 8883 jest otwarty w zaporze. Protokół MQTT komunikuje się za pośrednictwem portu 8883. Ten port może zostać zablokowany w niektórych środowiskach sieci firmowych i edukacyjnych. Aby uzyskać więcej informacji i sposobów obejścia tego problemu, zobacz Nawiązywanie połączenia z usługą IoT Hub (MQTT).
Wymagania dotyczące zestawu SDK języka:
- .NET SDK — wymaga programu Visual Studio.
- Zalecany jest zestaw Python SDK - w wersji 3.7 lub nowszej. Upewnij się, że używasz 32-bitowej lub 64-bitowej instalacji zgodnie z wymaganiami konfiguracji. Po wyświetleniu monitu podczas instalacji upewnij się, że język Python został dodany do zmiennej środowiskowej specyficznej dla platformy.
- Java — wymaga zestawu Java SE Development Kit 8. Upewnij się, że wybrano środowisko Java 8 w obszarze Obsługa długoterminowa , aby przejść do pobierania zestawu JDK 8.
- Node.js — wymaga Node.js w wersji 10.0.x lub nowszej.
Omówienie
W tym artykule opisano sposób użycia zestawu SDK usługi Azure IoT dla platformy .NET do tworzenia kodu aplikacji usługi urządzenia i zaplecza dla bliźniaczych reprezentacji urządzeń.
Tworzenie aplikacji urządzenia
Aplikacje urządzeń mogą odczytywać i zapisywać zgłaszane właściwości bliźniaczej reprezentacji bliźniaczej oraz otrzymywać powiadomienia o zmianach właściwości żądanej reprezentacji bliźniaczej, które są ustawiane przez aplikację zaplecza lub usługę IoT Hub.
W tej sekcji opisano sposób używania kodu aplikacji urządzenia do wykonywania następujących czynności:
- Pobieranie bliźniaczej reprezentacji urządzenia i badanie zgłoszonych właściwości
- Aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
- Tworzenie procedury obsługi wywołania zwrotnego żądanej aktualizacji właściwości
Ważne
Ten artykuł zawiera kroki łączenia urządzenia przy użyciu sygnatury dostępu współdzielonego, nazywanej również uwierzytelnianiem klucza symetrycznego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie urządzenia przy użyciu certyfikatów X.509 jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Zabezpieczenia najlepszych rozwiązań > zabezpieczeń Zabezpieczenia zabezpieczeń Zabezpieczenia zabezpieczeń.
Dodawanie pakietu NuGet urządzenia
Aplikacje klienckie urządzeń napisane w języku C# wymagają pakietu NuGet Microsoft.Azure.Devices.Client .
Nawiązywanie połączenia z urządzeniem
Klasa DeviceClient uwidacznia wszystkie metody wymagane do interakcji z bliźniaczymi reprezentacjami urządzeń z urządzenia.
Nawiąż połączenie z urządzeniem przy użyciu metody CreateFromConnectionString wraz z parametry połączenia urządzenia i protokołem transportu połączenia.
Parametr CreateFromConnectionString
protokołu transportowego TransportType obsługuje następujące protokoły transportu:
Mqtt
Mqtt_WebSocket_Only
Mqtt_Tcp_Only
Amqp
Amqp_WebSocket_Only
Amqp_Tcp_Only
Protokół Http1
nie jest obsługiwany w przypadku aktualizacji bliźniaczej reprezentacji urządzenia.
Ten przykład łączy się z urządzeniem przy użyciu protokołu transportowego Mqtt
.
using Microsoft.Azure.Devices.Client;
using Microsoft.Azure.Devices.Shared;
using Newtonsoft.Json;
static string DeviceConnectionString = "{IoT hub device connection string}";
static _deviceClient = null;
_deviceClient = DeviceClient.CreateFromConnectionString(DeviceConnectionString,
TransportType.Mqtt);
Pobieranie bliźniaczej reprezentacji urządzenia i badanie właściwości
Wywołaj metodę GetTwinAsync , aby pobrać bieżące właściwości bliźniaczej reprezentacji urządzenia. Istnieje wiele właściwości obiektu bliźniaczej reprezentacji, których można użyć do uzyskiwania dostępu do określonych obszarów Twin
danych JSON, w tym Properties
, Status
, Tags
i Version
.
Ten przykład pobiera właściwości bliźniaczej reprezentacji urządzenia i drukuje wartości bliźniaczych reprezentacji w formacie JSON.
Console.WriteLine("Retrieving twin...");
Twin twin = await _deviceClient.GetTwinAsync();
Console.WriteLine("\tInitial twin value received:");
Console.WriteLine($"\t{twin.ToJson()}");
Aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
Aby zaktualizować zgłoszoną właściwość bliźniaczej reprezentacji:
- Tworzenie obiektu TwinCollection dla zgłaszanej aktualizacji właściwości
- Aktualizowanie co najmniej jednej zgłoszonej właściwości w
TwinCollection
obiekcie - Użyj metody UpdateReportedPropertiesAsync , aby wypchnąć zmiany zgłaszanej właściwości do usługi IoT Hub
Na przykład:
try
{
Console.WriteLine("Sending sample start time as reported property");
TwinCollection reportedProperties = new TwinCollection();
reportedProperties["DateTimeLastAppLaunch"] = DateTime.UtcNow;
await _deviceClient.UpdateReportedPropertiesAsync(reportedProperties);
}
catch (Exception ex)
{
Console.WriteLine();
Console.WriteLine("Error in sample: {0}", ex.Message);
}
Tworzenie procedury obsługi wywołania zwrotnego żądanej aktualizacji właściwości
Utwórz żądaną procedurę obsługi wywołania zwrotnego aktualizacji właściwości, która jest wykonywana po zmianie żądanej właściwości w bliźniaczej reprezentacji urządzenia, przekazując nazwę metody obsługi wywołania zwrotnego na SetDesiredPropertyUpdateCallbackAsync.
Na przykład to wywołanie konfiguruje system w celu powiadomienia metody o nazwieOnDesiredPropertyChangedAsync
za każdym razem, gdy żądana właściwość zostanie zmieniona.
await _deviceClient.SetDesiredPropertyUpdateCallbackAsync(OnDesiredPropertyChangedAsync, null);
Właściwości bliźniaczej reprezentacji są przekazywane do metody wywołania zwrotnego jako twinCollection i można je zbadać jako KeyValuePair
struktury.
Ten przykład odbiera żądane aktualizacje właściwości jako TwinCollection
element , a następnie przechodzi w pętli i drukuje KeyValuePair
aktualizacje kolekcji. Po pętli w KeyValuePair
kolekcji kod wywołuje UpdateReportedPropertiesAsync
polecenie w celu zaktualizowania zgłaszanej DateTimeLastDesiredPropertyChangeReceived
właściwości, aby zachować aktualność czasu ostatniej aktualizacji.
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 _deviceClient.UpdateReportedPropertiesAsync(reportedProperties);
}
Przykład urządzenia z zestawem SDK
Zestaw SDK usługi Azure IoT dla platformy .NET udostępnia działającą przykładową aplikację urządzenia, która obsługuje zadania bliźniaczej reprezentacji urządzenia. Aby uzyskać więcej informacji, zobacz TwinSample.
Tworzenie aplikacji zaplecza
Aplikacja zaplecza łączy się z urządzeniem za pośrednictwem usługi IoT Hub i może odczytywać zgłaszane i żądane właściwości urządzenia, zapisywać żądane właściwości urządzenia i uruchamiać zapytania dotyczące urządzeń.
W tej sekcji opisano sposób tworzenia kodu aplikacji zaplecza w celu:
- Odczytywanie i aktualizowanie pól bliźniaczych reprezentacji urządzenia
- Tworzenie zapytania bliźniaczej reprezentacji urządzenia
Klasa RegistryManager uwidacznia wszystkie metody wymagane do utworzenia aplikacji zaplecza w celu interakcji z bliźniaczymi reprezentacjami urządzeń z usługi.
Dodawanie pakietu NuGet usługi
Aplikacje usługi zaplecza wymagają pakietu NuGet Microsoft.Azure.Devices .
Nawiązywanie połączenia z centrum IoT
Usługę zaplecza można połączyć z usługą IoT Hub przy użyciu następujących metod:
- Zasady dostępu współdzielonego
- Microsoft Entra
Ważne
Ten artykuł zawiera kroki nawiązywania połączenia z usługą przy użyciu sygnatury dostępu współdzielonego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie w usłudze przy użyciu identyfikatora Entra firmy Microsoft lub tożsamości zarządzanych jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Security best practices Cloud security (Najlepsze rozwiązania > dotyczące zabezpieczeń w chmurze).
Nawiązywanie połączenia przy użyciu zasad dostępu współdzielonego
Połącz aplikację zaplecza z urządzeniem przy użyciu polecenia CreateFromConnectionString. Aplikacja wymaga uprawnień połączenia usługi w celu zmodyfikowania żądanych właściwości bliźniaczej reprezentacji urządzenia i wymaga uprawnień do odczytu rejestru w celu wykonywania zapytań dotyczących rejestru tożsamości. Nie ma domyślnych zasad dostępu współdzielonego, które zawierają tylko te dwa uprawnienia, więc należy utworzyć je, jeśli jeszcze nie istnieje. Podaj te zasady dostępu współdzielonego parametry połączenia jako parametr do fromConnectionString
. Aby uzyskać więcej informacji na temat zasad dostępu współdzielonego, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego.
using Microsoft.Azure.Devices;
static RegistryManager registryManager;
static string connectionString = "{Shared access policy connection string}";
registryManager = RegistryManager.CreateFromConnectionString(connectionString);
Nawiązywanie połączenia przy użyciu usługi Microsoft Entra
Aplikacja zaplecza korzystająca z usługi Microsoft Entra musi pomyślnie uwierzytelnić się i uzyskać poświadczenia tokenu zabezpieczającego przed nawiązaniem połączenia z usługą IoT Hub. Ten token jest przekazywany do metody połączenia usługi IoT Hub. Aby uzyskać ogólne informacje na temat konfigurowania i używania usługi Microsoft Entra dla usługi IoT Hub, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu identyfikatora Microsoft Entra.
Konfigurowanie aplikacji Microsoft Entra
Musisz skonfigurować aplikację Firmy Microsoft Entra skonfigurowaną dla preferowanych poświadczeń uwierzytelniania. Aplikacja zawiera parametry, takie jak klucz tajny klienta, który jest używany przez aplikację zaplecza do uwierzytelniania. Dostępne konfiguracje uwierzytelniania aplikacji to:
- Klucz tajny klienta
- Certyfikat
- Poświadczenia tożsamości federacyjnej
Aplikacje Firmy Microsoft Entra mogą wymagać określonych uprawnień roli w zależności od wykonywanych operacji. Na przykład współautor bliźniaczej reprezentacji usługi IoT Hub jest wymagany do włączenia dostępu do odczytu i zapisu na urządzeniu usługi IoT Hub i bliźniaczych reprezentacjach modułów. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do usługi IoT Hub przy użyciu przypisania roli RBAC platformy Azure.
Aby uzyskać więcej informacji na temat konfigurowania aplikacji Microsoft Entra, zobacz Szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.
Uwierzytelnianie przy użyciu wartości DefaultAzureCredential
Najprostszym sposobem użycia usługi Microsoft Entra do uwierzytelniania aplikacji zaplecza jest użycie wartości DefaultAzureCredential, ale zaleca się użycie innej metody w środowisku produkcyjnym, w tym określonej TokenCredential
lub pared-down ChainedTokenCredential
. Dla uproszczenia w tej sekcji opisano uwierzytelnianie przy użyciu i DefaultAzureCredential
klucz tajny klienta. Aby uzyskać więcej informacji na temat zalet i wad korzystania z usługi , zobacz Wskazówki dotyczące użycia DefaultAzureCredential
dla elementu DefaultAzureCredential.
DefaultAzureCredential
obsługuje różne mechanizmy uwierzytelniania i określa odpowiedni typ poświadczeń na podstawie środowiska, w których jest wykonywany. Próbuje użyć wielu typów poświadczeń w kolejności, dopóki nie znajdzie działającego poświadczenia.
Firma Microsoft Entra wymaga tych pakietów NuGet i odpowiednich using
instrukcji:
- Azure.Core
- Azure.Identity
using Azure.Core;
using Azure.Identity;
W tym przykładzie klucz tajny klienta rejestracji aplikacji Firmy Microsoft, identyfikator klienta i identyfikator dzierżawy są dodawane do zmiennych środowiskowych. Te zmienne środowiskowe są używane przez DefaultAzureCredential
program do uwierzytelniania aplikacji. Wynikiem pomyślnego uwierzytelnienia firmy Microsoft Entra jest poświadczenie tokenu zabezpieczającego przekazywane do metody połączenia usługi IoT Hub.
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();
Wynikowy tokenCredential można następnie przekazać do metody łączenia z usługą IoT Hub dla dowolnego klienta zestawu SDK, który akceptuje poświadczenia firmy Microsoft Entra:
W tym przykładzie TokenCredential
parametr jest przekazywany do , aby ServiceClient.Create
utworzyć obiekt połączenia ServiceClient .
string hostname = "xxxxxxxxxx.azure-devices.net";
using var serviceClient = ServiceClient.Create(hostname, tokenCredential, TransportType.Amqp);
W tym przykładzie TokenCredential
parametr jest przekazywany do RegistryManager.Create
, aby utworzyć obiekt RegistryManager .
string hostname = "xxxxxxxxxx.azure-devices.net";
registryManager = RegistryManager.Create(hostname, tokenCredential);
Przykład kodu
Aby zapoznać się z roboczym przykładem uwierzytelniania usługi Entra firmy Microsoft, zobacz Przykład uwierzytelniania opartego na rolach.
Odczytywanie i aktualizowanie pól bliźniaczych reprezentacji urządzenia
Bieżące pola bliźniaczej reprezentacji urządzenia można pobrać do obiektu bliźniaczej reprezentacji , wywołując polecenie GetTwinAsync.
Klasa Twin
zawiera właściwości odpowiadające każdej sekcji bliźniaczej reprezentacji urządzenia. Twin
Użyj właściwości klasy, aby wyświetlić i zaktualizować pola bliźniaczej reprezentacji urządzenia. Właściwości obiektu umożliwiają Twin
aktualizowanie wielu pól bliźniaczych reprezentacji przed zapisaniem aktualizacji na urządzeniu przy użyciu polecenia UpdateTwinAsync
.
Po wprowadzeniu aktualizacji pól bliźniaczej reprezentacji wywołaj metodę UpdateTwinAsync , aby zapisać Twin
aktualizacje pól obiektów z powrotem na urządzeniu. Użyj funkcji try
i catch
logiki powiązanej z procedurą obsługi błędów, aby przechwycić błędy niepoprawnie sformatowanych poprawek z programu UpdateTwinAsync
.
Odczytywanie i aktualizowanie tagów bliźniaczych reprezentacji urządzenia
Użyj właściwości Tag bliźniaczej reprezentacji urządzenia, aby odczytywać i zapisywać informacje o tagach urządzenia.
Aktualizowanie tagów przy użyciu obiektu bliźniaczej reprezentacji
W tym przykładzie jest tworzona poprawka tagu location
, przypisuje ją do Twin
obiektu przy użyciu właściwości , a następnie stosuje poprawkę przy użyciu Tags
polecenia UpdateTwinAsync
.
// Retrieve the device twin
var twin = await registryManager.GetTwinAsync("myDeviceId");
// Create the tag patch
var tagspatch =
@"{
tags: {
location: {
region: 'US',
plant: 'Redmond43'
}
}
}";
// Assign the patch to the Twin object
twin.Tags["location"] = tagspatch;
// Apply the patch to update the device twin tags section
try
{
await registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);
}
catch (Exception e)
{
console.WriteLine("Twin update failed.", e.Message);
}
Aktualizowanie tagów przy użyciu ciągu JSON
Możesz utworzyć i zastosować poprawkę aktualizacji informacji bliźniaczej reprezentacji urządzenia w formacie JSON. Usługa IoT Hub analizuje i stosuje poprawkę, jeśli jest poprawnie sformatowana.
W tym przykładzie wywołano metodę GetTwinAsync
pobierania bieżących pól bliźniaczej reprezentacji urządzenia do Twin
obiektu, tworzy poprawkę w tag
formacie JSON z informacjami o regionie i lokalizacji zakładu, a następnie wywołuje UpdateTwinAsync
metodę stosowania poprawki w celu zaktualizowania bliźniaczej reprezentacji urządzenia. Jeśli błąd nie powiedzie się, zostanie wyświetlony UpdateTwinAsync
komunikat o błędzie.
// Retrieve the device twin
var twin = await registryManager.GetTwinAsync("myDeviceId");
// Create the JSON tags patch
var patch =
@"{
tags: {
location: {
region: 'US',
plant: 'Redmond43'
}
}
}";
// Apply the patch to update the device twin tags
try
{
await registryManager.UpdateTwinAsync(twin.DeviceId, patch, twin.ETag);
}
catch (Exception e)
{
console.WriteLine("Twin update failed.", e.Message);
}
Wyświetlanie i aktualizowanie żądanych właściwości bliźniaczej reprezentacji
Użyj właściwości TwinProperties.Desired bliźniaczej reprezentacji urządzenia, aby odczytywać i zapisywać informacje o żądanej właściwości urządzenia. Zaktualizuj właściwości bliźniaczej reprezentacji Desired
przy użyciu poprawki w formacie JSON.
W tym przykładzie wywoływane jest GetTwinAsync
pobieranie bieżących pól bliźniaczej reprezentacji urządzenia do Twin
obiektu, aktualizowanie żądanej właściwości bliźniaczej reprezentacji bliźniaczej speed
, a następnie wywoływanie UpdateTwinAsync
w celu zastosowania Twin
obiektu w celu zaktualizowania bliźniaczej reprezentacji urządzenia.
// Retrieve the device twin
var twin = await registryManager.GetTwinAsync("myDeviceId");
twin.Properties.Desired["speed"] = "type: '5G'";
await registryManager.UpdateTwinAsync(twin.DeviceId, twin, twin.ETag);
Inne metody aktualizacji bliźniaczej reprezentacji bliźniaczej
Aktualizacje bliźniaczej reprezentacji można również stosować przy użyciu następujących metod zestawu SDK:
- Wywołaj metodę ReplaceTwinAsync , aby zastąpić całą reprezentację urządzenia.
- Wywołaj metodę UpdateTwins2Async , aby zaktualizować listę bliźniaczych reprezentacji utworzonych wcześniej w systemie.
Tworzenie zapytania bliźniaczej reprezentacji urządzenia
W tej sekcji przedstawiono dwa zapytania bliźniaczej reprezentacji urządzenia. Zapytania bliźniaczych reprezentacji urządzeń to zapytania podobne do języka SQL, które zwracają zestaw wyników bliźniaczych reprezentacji urządzeń.
Aby utworzyć zapytanie bliźniaczej reprezentacji urządzenia, wywołaj metodę CreateQuery , aby przesłać zapytanie SQL bliźniaczych reprezentacji bliźniaczych i uzyskać interfejs IQuery . Opcjonalnie można wywołać CreateQuery
przy użyciu drugiego parametru, aby określić maksymalną liczbę elementów na stronę.
Następne wywołanie GetNextAsTwinAsync
lub GetNextAsJsonAsync
metoda tyle razy, ile potrzeba, aby pobrać wszystkie wyniki reprezentacji bliźniaczej.
- GetNextAsTwinAsync , aby pobrać następny stronicowany wynik jako obiekty bliźniaczej reprezentacji .
- GetNextAsJsonAsync , aby pobrać następny stronicowany wynik jako ciągi JSON.
Interfejs IQuery
zawiera właściwość logiczną HasMoreResults , której można użyć, aby sprawdzić, czy istnieje więcej wyników bliźniaczych reprezentacji do pobrania.
To przykładowe zapytanie wybiera tylko bliźniacze reprezentacje urządzeń znajdujące się w zakładzie Redmond43 .
var query = registryManager.CreateQuery(
"SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'", 100);
var twinsInRedmond43 = await query.GetNextAsTwinAsync();
Console.WriteLine("Devices in Redmond43: {0}",
string.Join(", ", twinsInRedmond43.Select(t => t.DeviceId)));
To przykładowe zapytanie uściśli pierwsze zapytanie, aby wybrać tylko urządzenia, które są również połączone za pośrednictwem sieci komórkowej.
query = registryManager.CreateQuery("SELECT * FROM devices WHERE tags.location.plant = 'Redmond43' AND properties.reported.connectivity.type = 'cellular'", 100);
var twinsInRedmond43UsingCellular = await query.GetNextAsTwinAsync();
Console.WriteLine("Devices in Redmond43 using cellular network: {0}",
string.Join(", ", twinsInRedmond43UsingCellular.Select(t => t.DeviceId)));
Przykład usługi SDK
Zestaw SDK usługi Azure IoT dla platformy .NET udostępnia działający przykład aplikacji usługi obsługującej zadania bliźniaczej reprezentacji urządzenia. Aby uzyskać więcej informacji, zobacz Przykład menedżera rejestru.
Omówienie
W tym artykule opisano sposób używania zestawu SDK usługi Azure IoT dla języka Java do tworzenia kodu aplikacji usługi urządzenia i zaplecza dla bliźniaczych reprezentacji urządzeń.
Tworzenie aplikacji urządzenia
Aplikacje urządzeń mogą odczytywać i zapisywać zgłaszane właściwości bliźniaczej reprezentacji bliźniaczej oraz otrzymywać powiadomienia o zmianach właściwości żądanej reprezentacji bliźniaczej, które są ustawiane przez aplikację zaplecza lub usługę IoT Hub.
W tej sekcji opisano sposób tworzenia kodu aplikacji urządzenia w celu:
- Pobieranie i wyświetlanie bliźniaczej reprezentacji urządzenia
- Aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
- Subskrybowanie żądanych zmian właściwości
Klasa DeviceClient uwidacznia wszystkie metody wymagane do interakcji z bliźniaczymi reprezentacjami urządzeń z urządzenia.
Ważne
Ten artykuł zawiera kroki łączenia urządzenia przy użyciu sygnatury dostępu współdzielonego, nazywanej również uwierzytelnianiem klucza symetrycznego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie urządzenia przy użyciu certyfikatów X.509 jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Zabezpieczenia najlepszych rozwiązań > zabezpieczeń Zabezpieczenia zabezpieczeń Zabezpieczenia zabezpieczeń.
Instrukcje importowania urządzenia
Użyj poniższych instrukcji importowania urządzeń, aby uzyskać dostęp do zestawu AZURE IoT SDK dla języka Java.
import com.microsoft.azure.sdk.iot.device.*;
import com.microsoft.azure.sdk.iot.device.DeviceTwin.*;
Nawiązywanie połączenia z urządzeniem
Aby nawiązać połączenie z urządzeniem:
Użyj protokołu IotHubClientProtocol , aby wybrać protokół transportu. Na przykład:
IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
Użyj konstruktora
DeviceClient
, aby dodać podstawowe parametry połączenia i protokół urządzenia.String connString = "{IoT hub device connection string}"; DeviceClient client = new DeviceClient(connString, protocol);
Użyj opcji otwórz , aby połączyć urządzenie z centrum IoT Hub. Jeśli klient jest już otwarty, metoda nic nie robi.
client.open(true);
Pobieranie i wyświetlanie bliźniaczej reprezentacji urządzenia
Po otwarciu połączenia klienta wywołaj metodę getTwin , aby pobrać bieżące właściwości bliźniaczej reprezentacji do Twin
obiektu.
Na przykład:
private static Twin twin;
System.out.println("Getting current twin");
twin = client.getTwin();
System.out.println("Received current twin:");
System.out.println(twin);
Aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
Po pobraniu bieżącej reprezentacji bliźniaczej możesz rozpocząć wprowadzanie aktualizacji zgłoszonych właściwości. Można również aktualizować zgłaszane właściwości bez pobierania bieżącej reprezentacji bliźniaczej, o ile masz poprawną zgłoszoną wersję właściwości. Jeśli wysyłasz zgłoszone właściwości i otrzymujesz błąd "Niepowodzenie warunku wstępnego", zgłoszona wersja właściwości jest nieaktualna. W takim przypadku pobierz najnowszą wersję, wywołując getTwin
ponownie.
Aby zaktualizować zgłoszone właściwości:
Wywołaj metodę getReportedProperties, aby pobrać zgłoszone właściwości bliźniaczej reprezentacji do obiektu TwinCollection .
Użyj polecenia put , aby zaktualizować zgłoszoną właściwość w
TwinCollection
obiekcie. Wywołajput
każdą zgłoszoną aktualizację właściwości.Użyj właściwości updateReportedProperties , aby zastosować grupę zgłoszonych właściwości, które zostały zaktualizowane przy użyciu
put
metody .
Na przykład:
TwinCollection reportedProperties = twin.getReportedProperties();
int newTemperature = new Random().nextInt(80);
reportedProperties.put("HomeTemp(F)", newTemperature);
System.out.println("Updating reported property \"HomeTemp(F)\" to value " + newTemperature);
ReportedPropertiesUpdateResponse response = client.updateReportedProperties(reportedProperties);
System.out.println("Successfully set property \"HomeTemp(F)\" to value " + newTemperature);
Subskrybowanie żądanych zmian właściwości
Wywołaj metodę subscribeToDesiredProperties , aby zasubskrybować żądane zmiany właściwości. Ten klient otrzymuje wywołanie zwrotne z obiektem Twin
za każdym razem, gdy żądana właściwość jest aktualizowana. Wywołanie zwrotne zawiera pełny zestaw żądanych właściwości lub tylko zaktualizowaną żądaną właściwość w zależności od sposobu zmiany żądanej właściwości.
W tym przykładzie subskrybowane są zmiany żądanej właściwości. Wszelkie żądane zmiany właściwości są przekazywane do programu obsługi o nazwie DesiredPropertiesUpdatedHandler
.
client.subscribeToDesiredProperties(new DesiredPropertiesUpdatedHandler(), null);
W tym przykładzie DesiredPropertiesUpdatedHandler
żądana właściwość zmienia wywołania obsługi wywołania zwrotnego wywołuje metodę getDesiredProperties w celu pobrania zmian właściwości, a następnie wyświetla zaktualizowane właściwości bliźniaczej reprezentacji.
private static class DesiredPropertiesUpdatedHandler implements DesiredPropertiesCallback
{
@Override
public void onDesiredPropertiesUpdated(Twin desiredPropertyUpdateTwin, Object context)
{
if (twin == null)
{
// No need to care about this update because these properties will be present in the twin retrieved by getTwin.
System.out.println("Received desired properties update before getting current twin. Ignoring this update.");
return;
}
// desiredPropertyUpdateTwin.getDesiredProperties() contains all the newly updated desired properties as well as the new version of the desired properties
twin.getDesiredProperties().putAll(desiredPropertyUpdateTwin.getDesiredProperties());
twin.getDesiredProperties().setVersion(desiredPropertyUpdateTwin.getDesiredProperties().getVersion());
System.out.println("Received desired property update. Current twin:");
System.out.println(twin);
}
}
Przykład urządzenia z zestawem SDK
Zestaw SDK usługi Azure IoT dla języka Java zawiera działający przykład testowania pojęć dotyczących aplikacji urządzenia opisanych w tym artykule. Aby uzyskać więcej informacji, zobacz Przykład bliźniaczej reprezentacji urządzenia.
Tworzenie aplikacji zaplecza
W tej sekcji opisano sposób tworzenia aplikacji zaplecza, która:
- Aktualizuje tagi bliźniaczej reprezentacji urządzenia
- Wysyła zapytania do urządzeń przy użyciu filtrów w tagach i właściwościach
Klasa ServiceClient
DeviceTwin zawiera metody, których usługi mogą używać do uzyskiwania dostępu do bliźniaczych reprezentacji urządzeń.
Instrukcje importowania usługi
Użyj poniższych instrukcji importowania usługi, aby uzyskać dostęp do zestawu AZURE IoT SDK dla języka Java.
import com.microsoft.azure.sdk.iot.service.devicetwin.*;
import com.microsoft.azure.sdk.iot.service.exceptions.IotHubException;
Nawiązywanie połączenia z usługą IoT Hub
Usługę zaplecza można połączyć z usługą IoT Hub przy użyciu następujących metod:
- Zasady dostępu współdzielonego
- Microsoft Entra
Ważne
Ten artykuł zawiera kroki nawiązywania połączenia z usługą przy użyciu sygnatury dostępu współdzielonego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie w usłudze przy użyciu identyfikatora Entra firmy Microsoft lub tożsamości zarządzanych jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Security best practices Cloud security (Najlepsze rozwiązania > dotyczące zabezpieczeń w chmurze).
Nawiązywanie połączenia przy użyciu zasad dostępu współdzielonego
Użyj konstruktora DeviceTwin , aby utworzyć połączenie z centrum IoT Hub. Obiekt DeviceTwin
obsługuje komunikację z centrum IoT Hub.
Aplikacja wymaga uprawnień połączenia usługi w celu zmodyfikowania żądanych właściwości bliźniaczej reprezentacji urządzenia i wymaga uprawnień do odczytu rejestru w celu wykonywania zapytań dotyczących rejestru tożsamości. Nie ma domyślnych zasad dostępu współdzielonego, które zawierają tylko te dwa uprawnienia, więc należy utworzyć je, jeśli jeszcze nie istnieje. Podaj te zasady dostępu współdzielonego parametry połączenia jako parametr do fromConnectionString
. Aby uzyskać więcej informacji na temat zasad dostępu współdzielonego, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego.
Obiekt DeviceTwinDevice reprezentuje bliźniacze reprezentację urządzenia z jego właściwościami i tagami.
Na przykład:
public static final String iotHubConnectionString = "{Shared access policy connection string}";
public static final String deviceId = "myDeviceId";
public static final String region = "US";
public static final String plant = "Redmond43";
// Get the DeviceTwin and DeviceTwinDevice objects
DeviceTwin twinClient = new DeviceTwin(iotHubConnectionString);
DeviceTwinDevice device = new DeviceTwinDevice(deviceId);
Nawiązywanie połączenia przy użyciu usługi Microsoft Entra
Aplikacja zaplecza korzystająca z usługi Microsoft Entra musi pomyślnie uwierzytelnić się i uzyskać poświadczenia tokenu zabezpieczającego przed nawiązaniem połączenia z usługą IoT Hub. Ten token jest przekazywany do metody połączenia usługi IoT Hub. Aby uzyskać ogólne informacje na temat konfigurowania i używania usługi Microsoft Entra dla usługi IoT Hub, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu identyfikatora Microsoft Entra.
Aby zapoznać się z omówieniem uwierzytelniania zestawu Java SDK, zobacz Uwierzytelnianie platformy Azure przy użyciu języka Java i tożsamości platformy Azure.
Dla uproszczenia ta sekcja koncentruje się na opisywaniu uwierzytelniania przy użyciu klucza tajnego klienta.
Konfigurowanie aplikacji Microsoft Entra
Musisz skonfigurować aplikację Firmy Microsoft Entra skonfigurowaną dla preferowanych poświadczeń uwierzytelniania. Aplikacja zawiera parametry, takie jak klucz tajny klienta, który jest używany przez aplikację zaplecza do uwierzytelniania. Dostępne konfiguracje uwierzytelniania aplikacji to:
- Klucz tajny klienta
- Certyfikat
- Poświadczenia tożsamości federacyjnej
Aplikacje Firmy Microsoft Entra mogą wymagać określonych uprawnień roli w zależności od wykonywanych operacji. Na przykład współautor bliźniaczej reprezentacji usługi IoT Hub jest wymagany do włączenia dostępu do odczytu i zapisu na urządzeniu usługi IoT Hub i bliźniaczych reprezentacjach modułów. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do usługi IoT Hub przy użyciu przypisania roli RBAC platformy Azure.
Aby uzyskać więcej informacji na temat konfigurowania aplikacji Microsoft Entra, zobacz Szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.
Uwierzytelnianie przy użyciu wartości DefaultAzureCredential
Najprostszym sposobem użycia usługi Microsoft Entra do uwierzytelniania aplikacji zaplecza jest użycie wartości DefaultAzureCredential, ale zaleca się użycie innej metody w środowisku produkcyjnym, w tym określonej TokenCredential
lub pared-down ChainedTokenCredential
.
Aby uzyskać więcej informacji na temat zalet i wad używania programu DefaultAzureCredential
, zobacz Łańcuchy poświadczeń w bibliotece klienta tożsamości platformy Azure dla języka Java.
Ustawienie domyślneAzureCredential obsługuje różne mechanizmy uwierzytelniania i określa odpowiedni typ poświadczeń na podstawie środowiska, w których jest wykonywany. Próbuje użyć wielu typów poświadczeń w kolejności, dopóki nie znajdzie działającego poświadczenia.
Możesz uwierzytelnić poświadczenia aplikacji Microsoft Entra przy użyciu polecenia DefaultAzureCredentialBuilder. Zapisz parametry połączenia, takie jak identyfikator dzierżawy klucza tajnego klienta, identyfikator klienta i wartości wpisów tajnych klienta jako zmienne środowiskowe. Po utworzeniu TokenCredential
elementu przekaż go do elementu ServiceClient lub innego konstruktora jako parametru "credential".
W tym przykładzie DefaultAzureCredentialBuilder
próbuje uwierzytelnić połączenie z listy opisanej w artykule DefaultAzureCredential. Wynikiem pomyślnego uwierzytelnienia firmy Microsoft Entra jest poświadczenie tokenu zabezpieczającego przekazywane do konstruktora takiego jak ServiceClient.
TokenCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();
Uwierzytelnianie przy użyciu elementu ClientSecretCredentialBuilder
Aby utworzyć poświadczenia przy użyciu informacji o kluczu tajnym klienta, możesz użyć elementu ClientSecretCredentialBuilder . Jeśli ta metoda powiedzie się, zwraca wartość TokenCredential , która może zostać przekazana do klasy ServiceClient lub innego konstruktora jako parametru "credential".
W tym przykładzie do zmiennych środowiskowych dodano wartości klucza tajnego klienta rejestracji aplikacji Firmy Microsoft, identyfikatora klienta i identyfikatora dzierżawy. Te zmienne środowiskowe są używane przez ClientSecretCredentialBuilder
program do kompilowania poświadczeń.
string clientSecretValue = System.getenv("AZURE_CLIENT_SECRET");
string clientID = System.getenv("AZURE_CLIENT_ID");
string tenantID = System.getenv("AZURE_TENANT_ID");
TokenCredential credential =
new ClientSecretCredentialBuilder()
.tenantId(tenantID)
.clientId(clientID)
.clientSecret(clientSecretValue)
.build();
Inne klasy uwierzytelniania
Zestaw JAVA SDK zawiera również te klasy, które uwierzytelniają aplikację zaplecza za pomocą usługi Microsoft Entra:
- AuthorizationCodeCredential
- AzureCliCredential
- AzureDeveloperCliCredential
- AzurePipelinesCredential
- ChainedTokenCredential
- ClientAssertionCredential
- ClientCertificateCredential
- DeviceCodeCredential
- EnvironmentCredential
- InteractiveBrowserCredential
- ManagedIdentityCredential
- OnBehalfOfCredential
Przykłady kodu
Aby zapoznać się z roboczymi przykładami uwierzytelniania usługi Entra firmy Microsoft, zobacz Przykład uwierzytelniania opartego na rolach.
Aktualizowanie pól bliźniaczych reprezentacji urządzenia
Aby zaktualizować pola bliźniaczej reprezentacji urządzenia:
Użyj polecenia getTwin , aby pobrać bieżące pola bliźniaczej reprezentacji urządzenia
W tym przykładzie są pobierane i drukowane pola bliźniaczej reprezentacji urządzenia:
// Get the device twin from IoT Hub System.out.println("Device twin before update:"); twinClient.getTwin(device); System.out.println(device);
HashSet
Używanie obiektu doadd
grupy par tagów bliźniaczychDodawanie grupy par tagów z
tags
obiektu doDeviceTwinDevice
obiektu za pomocą elementu setTagsAktualizowanie bliźniaczej reprezentacji bliźniaczej w centrum IoT za pomocą narzędzia updateTwin
W tym przykładzie zaktualizowano tagi bliźniaczej reprezentacji urządzenia w regionie i zakładzie dla bliźniaczej reprezentacji urządzenia:
// Update device twin tags if they are different // from the existing values String currentTags = device.tagsToString(); if ((!currentTags.contains("region=" + region) && !currentTags.contains("plant=" + plant))) { // Create the tags and attach them to the DeviceTwinDevice object Set<Pair> tags = new HashSet<Pair>(); tags.add(new Pair("region", region)); tags.add(new Pair("plant", plant)); device.setTags(tags); // Update the device twin in IoT Hub System.out.println("Updating device twin"); twinClient.updateTwin(device); } // Retrieve and display the device twin with the tag values from IoT Hub System.out.println("Device twin after update:"); twinClient.getTwin(device); System.out.println(device);
Tworzenie zapytania bliźniaczej reprezentacji urządzenia
W tej sekcji przedstawiono dwa zapytania bliźniaczej reprezentacji urządzenia. Zapytania bliźniaczych reprezentacji urządzeń to zapytania podobne do języka SQL, które zwracają zestaw wyników bliźniaczych reprezentacji urządzeń.
Klasa Query zawiera metody, których można użyć do tworzenia zapytań w stylu SQL w usłudze IoT Hub dla bliźniaczych reprezentacji, zadań, zadań urządzeń lub danych pierwotnych.
Aby utworzyć zapytanie dotyczące urządzenia:
Tworzenie zapytania SQL bliźniaczych reprezentacji bliźniaczych za pomocą polecenia createSqlQuery
Wykonywanie zapytania przy użyciu metody queryTwin
Użyj polecenia hasNextDeviceTwin , aby sprawdzić, czy w zestawie wyników znajduje się inna reprezentacja urządzenia
Użyj polecenia getNextDeviceTwin , aby pobrać następną reprezentację urządzenia z zestawu wyników
Poniższe przykładowe zapytania zwracają maksymalnie 100 urządzeń.
To przykładowe zapytanie wybiera tylko bliźniacze reprezentacje urządzeń znajdujące się w zakładzie Redmond43 .
// Query the device twins in IoT Hub
System.out.println("Devices in Redmond:");
// Construct the query
SqlQuery sqlQuery = SqlQuery.createSqlQuery("*", SqlQuery.FromType.DEVICES, "tags.plant='Redmond43'", null);
// Run the query, returning a maximum of 100 devices
Query twinQuery = twinClient.queryTwin(sqlQuery.getQuery(), 100);
while (twinClient.hasNextDeviceTwin(twinQuery)) {
DeviceTwinDevice d = twinClient.getNextDeviceTwin(twinQuery);
System.out.println(d.getDeviceId());
}
To przykładowe zapytanie uściśli pierwsze zapytanie, aby wybrać tylko urządzenia, które są również połączone za pośrednictwem sieci komórkowej.
System.out.println("Devices in Redmond using a cellular network:");
// Construct the query
sqlQuery = SqlQuery.createSqlQuery("*", SqlQuery.FromType.DEVICES, "tags.plant='Redmond43' AND properties.reported.connectivityType = 'cellular'", null);
// Run the query, returning a maximum of 100 devices
twinQuery = twinClient.queryTwin(sqlQuery.getQuery(), 3);
while (twinClient.hasNextDeviceTwin(twinQuery)) {
DeviceTwinDevice d = twinClient.getNextDeviceTwin(twinQuery);
System.out.println(d.getDeviceId());
}
Przykład usługi SDK
Zestaw SDK usługi Azure IoT dla języka Java udostępnia działający przykład aplikacji usługi obsługującej zadania bliźniaczej reprezentacji urządzenia. Aby uzyskać więcej informacji, zobacz Przykład bliźniaczej reprezentacji urządzenia.
Omówienie
W tym artykule opisano sposób używania zestawu SDK usługi Azure IoT dla języka Python do tworzenia kodu aplikacji usługi urządzenia i zaplecza dla bliźniaczych reprezentacji urządzeń.
Tworzenie aplikacji urządzenia
Aplikacje urządzeń mogą odczytywać i zapisywać zgłaszane właściwości bliźniaczej reprezentacji bliźniaczej oraz otrzymywać powiadomienia o zmianach właściwości żądanej reprezentacji bliźniaczej, które są ustawiane przez aplikację zaplecza lub usługę IoT Hub.
Klasa IoTHubDeviceClient zawiera metody, których można użyć do pracy z bliźniaczymi reprezentacjami urządzeń.
W tej sekcji opisano sposób tworzenia kodu aplikacji urządzenia, który:
- Pobiera bliźniacze reprezentacje urządzenia i sprawdza zgłaszane właściwości
- Stosowanie poprawek zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
Ważne
Ten artykuł zawiera kroki łączenia urządzenia przy użyciu sygnatury dostępu współdzielonego, nazywanej również uwierzytelnianiem klucza symetrycznego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie urządzenia przy użyciu certyfikatów X.509 jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Zabezpieczenia najlepszych rozwiązań > zabezpieczeń Zabezpieczenia zabezpieczeń Zabezpieczenia zabezpieczeń.
Nawiązywanie połączenia z urządzeniem
W tej sekcji pokazano, jak połączyć aplikację z urządzeniem przy użyciu klucza podstawowego urządzenia zawierającego klucz dostępu współdzielonego.
Aby połączyć aplikację z urządzeniem:
- Wywołaj create_from_connection_string, aby dodać parametry połączenia urządzenia
- Wywołanie połączenia w celu połączenia klienta urządzenia z centrum Azure IoT Hub
# 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 = "{IOT hub device connection string}"
device_client = IoTHubDeviceClient.create_from_connection_string(conn_str)
# connect the application to the device
await device_client.connect()
Pobieranie bliźniaczej reprezentacji urządzenia i badanie zgłoszonych właściwości
Możesz pobrać i zbadać informacje o bliźniaczej reprezentacji urządzenia, w tym tagi i właściwości. Pobrane informacje o bliźniaczej reprezentacji urządzenia są zgodne z danymi w formacie JSON bliźniaczej reprezentacji urządzenia, które można wyświetlić dla urządzenia w witrynie Azure Portal.
Wywołaj get_twin , aby pobrać bliźniacze reprezentacje urządzenia z usługi Azure IoT Hub. Informacje o bliźniaczej reprezentacji są umieszczane w zmiennej, którą można wydrukować lub zbadać.
W tym przykładzie pobrano bliźniacza reprezentację urządzenia i użyto print
polecenia w celu wyświetlenia bliźniaczej reprezentacji urządzenia w formacie JSON.
# get the twin
twin = await device_client.get_twin()
print("Twin document:")
print("{}".format(twin))
Stosowanie poprawek zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
Możesz zastosować poprawkę w celu zaktualizowania właściwości zgłoszonych przez urządzenie w formacie JSON.
Aby zastosować poprawkę w celu zaktualizowania zgłoszonych właściwości:
- Przypisz poprawkę JSON zgłaszanej właściwości do zmiennej.
- Wywołaj patch_twin_reported_properties , aby zastosować poprawkę JSON do zgłoszonych właściwości. Jest to wywołanie synchroniczne, co oznacza, że ta funkcja nie zwraca się do momentu wysłania poprawki do usługi i potwierdzenia.
Jeśli patch_twin_reported_properties
zwraca błąd, ta funkcja zgłasza odpowiedni błąd.
# 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)
Można również wywołać te metody w celu zaktualizowania bliźniaczych reprezentacji urządzeń:
- Wywołaj replace_twin , aby zastąpić tagi bliźniaczej reprezentacji urządzenia i żądane właściwości.
- Wywołaj update_twin, aby zaktualizować tagi bliźniaczej reprezentacji urządzenia i żądane właściwości.
Przychodzący żądany program obsługi poprawek właściwości
Wywołaj on_twin_desired_properties_patch_received , aby utworzyć funkcję obsługi lub coroutine wywoływaną po odebraniu poprawki żądanej właściwości bliźniaczej reprezentacji. Procedura obsługi przyjmuje jeden argument, który jest poprawką bliźniaczej reprezentacji w postaci obiektu słownika JSON.
W tym przykładzie skonfigurowano żądaną procedurę obsługi poprawek właściwości o nazwie twin_patch_handler
.
Na przykład:
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()
Odbiera twin_patch_handler
i drukuje aktualizacje żądanej właściwości w formacie JSON.
# Define behavior for receiving twin desired property patches
def twin_patch_handler(twin_patch):
print("Twin patch received:")
print(twin_patch)
Przykłady urządzeń z zestawem SDK
Zestaw AZURE IoT SDK dla języka Python zawiera następujące przykłady:
- get_twin — połącz się z urządzeniem i pobierz informacje o bliźniaczej reprezentacji.
- update_twin_reported_properties — aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji bliźniaczej.
- receive_twin_desired_properties — odbieranie i aktualizowanie żądanych właściwości.
Tworzenie aplikacji zaplecza
Aplikacja zaplecza łączy się z urządzeniem za pośrednictwem usługi IoT Hub i może odczytywać zgłaszane i żądane właściwości urządzenia, zapisywać żądane właściwości urządzenia i uruchamiać zapytania dotyczące urządzeń.
W tej sekcji opisano sposób tworzenia aplikacji zaplecza w celu:
- Aktualizowanie tagów bliźniaczych reprezentacji i żądanych właściwości
- Wysyła zapytania do urządzeń przy użyciu filtrów w tagach i właściwościach
Klasa IoTHubRegistryManager uwidacznia wszystkie metody wymagane do utworzenia aplikacji zaplecza w celu interakcji z bliźniaczymi reprezentacjami urządzeń z usługi.
Nawiązywanie połączenia z centrum IoT
Usługę zaplecza można połączyć z usługą IoT Hub przy użyciu następujących metod:
- Zasady dostępu współdzielonego
- Microsoft Entra
Ważne
Ten artykuł zawiera kroki nawiązywania połączenia z usługą przy użyciu sygnatury dostępu współdzielonego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie w usłudze przy użyciu identyfikatora Entra firmy Microsoft lub tożsamości zarządzanych jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Security best practices Cloud security (Najlepsze rozwiązania > dotyczące zabezpieczeń w chmurze).
Nawiązywanie połączenia przy użyciu zasad dostępu współdzielonego
Nawiąż połączenie z centrum IoT Przy użyciu from_connection_string. Aplikacja wymaga uprawnień połączenia usługi w celu zmodyfikowania żądanych właściwości bliźniaczej reprezentacji urządzenia i wymaga uprawnień do odczytu rejestru w celu wykonywania zapytań dotyczących rejestru tożsamości. Nie ma domyślnych zasad dostępu współdzielonego, które zawierają tylko te dwa uprawnienia, więc należy utworzyć je, jeśli jeszcze nie istnieje. Podaj te zasady dostępu współdzielonego parametry połączenia jako parametr do fromConnectionString
. Aby uzyskać więcej informacji na temat zasad dostępu współdzielonego, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego.
Na przykład:
import sys
from time import sleep
from azure.iot.hub import IoTHubRegistryManager
from azure.iot.hub.models import Twin, TwinProperties, QuerySpecification, QueryResult
# Connect to IoT hub
IOTHUB_CONNECTION_STRING = "{IoT hub service connection string}"
iothub_registry_manager = IoTHubRegistryManager.from_connection_string(IOTHUB_CONNECTION_STRING)
Nawiązywanie połączenia przy użyciu usługi Microsoft Entra
Aplikacja zaplecza korzystająca z usługi Microsoft Entra musi pomyślnie uwierzytelnić się i uzyskać poświadczenia tokenu zabezpieczającego przed nawiązaniem połączenia z usługą IoT Hub. Ten token jest przekazywany do metody połączenia usługi IoT Hub. Aby uzyskać ogólne informacje na temat konfigurowania i używania usługi Microsoft Entra dla usługi IoT Hub, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu identyfikatora Microsoft Entra.
Aby zapoznać się z omówieniem uwierzytelniania zestawu PYTHON SDK, zobacz Uwierzytelnianie aplikacji języka Python w usługach platformy Azure przy użyciu zestawu Azure SDK dla języka Python
Konfigurowanie aplikacji Microsoft Entra
Musisz skonfigurować aplikację Firmy Microsoft Entra skonfigurowaną dla preferowanych poświadczeń uwierzytelniania. Aplikacja zawiera parametry, takie jak klucz tajny klienta, który jest używany przez aplikację zaplecza do uwierzytelniania. Dostępne konfiguracje uwierzytelniania aplikacji to:
- Klucz tajny klienta
- Certyfikat
- Poświadczenia tożsamości federacyjnej
Aplikacje Firmy Microsoft Entra mogą wymagać określonych uprawnień roli w zależności od wykonywanych operacji. Na przykład współautor bliźniaczej reprezentacji usługi IoT Hub jest wymagany do włączenia dostępu do odczytu i zapisu na urządzeniu usługi IoT Hub i bliźniaczych reprezentacjach modułów. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do usługi IoT Hub przy użyciu przypisania roli RBAC platformy Azure.
Aby uzyskać więcej informacji na temat konfigurowania aplikacji Microsoft Entra, zobacz Szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.
Uwierzytelnianie przy użyciu wartości DefaultAzureCredential
Najprostszym sposobem użycia usługi Microsoft Entra do uwierzytelniania aplikacji zaplecza jest użycie wartości DefaultAzureCredential, ale zaleca się użycie innej metody w środowisku produkcyjnym, w tym określonej TokenCredential
lub pared-down ChainedTokenCredential
. Dla uproszczenia w tej sekcji opisano uwierzytelnianie przy użyciu i DefaultAzureCredential
klucz tajny klienta. Aby uzyskać więcej informacji na temat zalet i wad korzystania z programu DefaultAzureCredential
, zobacz Łańcuchy poświadczeń w bibliotece klienta tożsamości platformy Azure dla języka Python.
Ustawienie domyślneAzureCredential obsługuje różne mechanizmy uwierzytelniania i określa odpowiedni typ poświadczeń na podstawie środowiska, w których jest wykonywany. Próbuje użyć wielu typów poświadczeń w kolejności, dopóki nie znajdzie działającego poświadczenia.
Firma Microsoft Entra wymaga tego pakietu importu i odpowiedniej import
instrukcji:
pip install azure-identity
from azure.identity import DefaultAzureCredential
W tym przykładzie klucz tajny klienta rejestracji aplikacji Firmy Microsoft, identyfikator klienta i identyfikator dzierżawy zostały dodane do zmiennych środowiskowych. Te zmienne środowiskowe są używane przez DefaultAzureCredential
program do uwierzytelniania aplikacji. Wynikiem pomyślnego uwierzytelnienia firmy Microsoft Entra jest poświadczenie tokenu zabezpieczającego przekazywane do metody połączenia usługi IoT Hub.
from azure.identity import DefaultAzureCredential
credential = DefaultAzureCredential()
Wynikowy token AccessToken można następnie przekazać w celu from_token_credential
nawiązania połączenia z usługą IoT Hub dla dowolnego klienta zestawu SDK, który akceptuje poświadczenia firmy Microsoft Entra:
- IoTHubRegistryManager w celu utworzenia połączenia usługi z usługą IoT Hub przy użyciu poświadczeń tokenu Entra.
- IoTHubJobManager
- DigitalTwinClient
- IoTHubHttpRuntimeManager
- IoTHubConfigurationManager
from_token_credential
wymaga dwóch parametrów:
- Adres URL usługi platformy Azure — adres URL usługi platformy Azure powinien być w formacie
{Your Entra domain URL}.azure-devices.net
bez prefiksuhttps://
. Na przykładMyAzureDomain.azure-devices.net
. - Token poświadczeń platformy Azure
W tym przykładzie poświadczenia platformy Azure są uzyskiwane przy użyciu polecenia DefaultAzureCredential
. Adres URL i poświadczenia usługi platformy Azure są następnie dostarczane w celu IoTHubRegistryManager.from_token_credential
utworzenia połączenia z usługą IoT Hub.
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)
Przykłady kodu
Aby zapoznać się z roboczymi przykładami uwierzytelniania usługi Entra firmy Microsoft, zobacz Biblioteka Microsoft Authentication Library (MSAL) dla języka Python.
Aktualizowanie tagów bliźniaczych reprezentacji i żądanych właściwości
Tagi bliźniaczej reprezentacji urządzenia i żądane właściwości można zaktualizować z poziomu aplikacji zaplecza w tym samym czasie przy użyciu update_twin.
- Wywołaj get_twin , aby pobrać bieżącą wersję bliźniaczej reprezentacji urządzenia
- Użyj klasy bliźniaczej, aby dodać tagi i właściwości w formacie JSON.
- Wywołaj metodę
update_twin
, aby zastosować poprawkę do bliźniaczej reprezentacji urządzenia. Można również użyć replace_twin , aby zastąpić żądane właściwości i tagi bliźniaczej reprezentacji urządzenia.
Ten przykład aktualizuje region
informacje o tagach i plant
ustawia żądaną power_level
właściwość na 1
wartość .
new_tags = {
'location' : {
'region' : 'US',
'plant' : 'Redmond43'
}
}
DEVICE_ID = "[Device Id]"
twin = iothub_registry_manager.get_twin(DEVICE_ID)
twin_patch = Twin(tags=new_tags, properties= TwinProperties(desired={'power_level' : 1}))
twin = iothub_registry_manager.update_twin(DEVICE_ID, twin_patch, twin.etag)
Tworzenie zapytania bliźniaczej reprezentacji urządzenia
Zapytania dotyczące bliźniaczej reprezentacji urządzenia można wykonywać przy użyciu zapytań bliźniaczych reprezentacji urządzenia. Zapytania bliźniaczych reprezentacji urządzeń to zapytania podobne do języka SQL, które zwracają zestaw wyników bliźniaczych reprezentacji urządzeń.
Aby użyć zapytania bliźniaczej reprezentacji urządzenia:
Użyj obiektu QuerySpecification, aby zdefiniować żądanie zapytania przypominające sql.
Użyj query_iot_hub , aby wysłać zapytanie do usługi IoTHub i pobrać informacje o bliźniaczej reprezentacji urządzenia przy użyciu specyfikacji zapytania przypominającej język SQL.
W tym przykładzie są uruchamiane dwa zapytania. Pierwszy wybiera tylko bliźniacze reprezentacje urządzeń znajdujących się w Redmond43
zakładzie, a drugi uściśli zapytanie, aby wybrać tylko urządzenia połączone za pośrednictwem sieci komórkowej. Wyniki są drukowane po każdym zapytaniu.
query_spec = QuerySpecification(query="SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'")
query_result = iothub_registry_manager.query_iot_hub(query_spec, None, 100)
print("Devices in Redmond43 plant: {}".format(', '.join([twin.device_id for twin in query_result.items])))
print()
query_spec = QuerySpecification(query="SELECT * FROM devices WHERE tags.location.plant = 'Redmond43' AND properties.reported.connectivity = 'cellular'")
query_result = iothub_registry_manager.query_iot_hub(query_spec, None, 100)
print("Devices in Redmond43 plant using cellular network: {}".format(', '.join([twin.device_id for twin in query_result.items])))
print()
Przykład usługi SDK
Zestaw SDK usługi Azure IoT dla języka Python udostępnia działający przykład aplikacji usługi, która obsługuje zadania bliźniaczej reprezentacji urządzenia. Aby uzyskać więcej informacji, zobacz Przykład zapytania Menedżera rejestru.
Omówienie
W tym artykule opisano sposób używania zestawu SDK usługi Azure IoT dla Node.js do tworzenia kodu aplikacji usługi urządzenia i zaplecza dla bliźniaczych reprezentacji urządzeń.
Tworzenie aplikacji urządzenia
Aplikacje urządzeń mogą odczytywać i zapisywać zgłaszane właściwości bliźniaczej reprezentacji bliźniaczej oraz otrzymywać powiadomienia o zmianach właściwości żądanej reprezentacji bliźniaczej, które są ustawiane przez aplikację zaplecza lub usługę IoT Hub.
W tej sekcji opisano sposób użycia pakietu azure-iot-device w zestawie SDK usługi Azure IoT dla Node.js w celu utworzenia aplikacji urządzenia w celu:
- Pobieranie bliźniaczej reprezentacji urządzenia i badanie zgłoszonych właściwości
- Aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
- Otrzymywanie powiadomienia o zmianach żądanych właściwości
Ważne
Ten artykuł zawiera kroki łączenia urządzenia przy użyciu sygnatury dostępu współdzielonego, nazywanej również uwierzytelnianiem klucza symetrycznego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie urządzenia przy użyciu certyfikatów X.509 jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Zabezpieczenia najlepszych rozwiązań > zabezpieczeń Zabezpieczenia zabezpieczeń Zabezpieczenia zabezpieczeń.
Instalowanie pakietów zestawu SDK
Uruchom to polecenie, aby zainstalować zestaw SDK urządzenia azure-iot-device na maszynie dewelopera:
npm install azure-iot-device --save
Pakiet azure-iot-device zawiera obiekty interfejsu z urządzeniami IoT. Klasa Bliźniacze obejmuje obiekty specyficzne dla bliźniaczej reprezentacji. W tej sekcji opisano Client
kod klasy używany do odczytywania i zapisywania danych bliźniaczej reprezentacji urządzenia.
Wybieranie protokołu transportowego
Obiekt Client
obsługuje następujące protokoły:
Amqp
Http
— W przypadku korzystania zHttp
usługiClient
wystąpienie sprawdza komunikaty z usługi IoT Hub rzadko (co najmniej co 25 minut).Mqtt
MqttWs
AmqpWs
Zainstaluj wymagane protokoły transportu na maszynie dewelopera.
Na przykład to polecenie instaluje Mqtt
protokół:
npm install azure-iot-device-mqtt --save
Aby uzyskać więcej informacji na temat różnic między obsługą protokołów MQTT, AMQP i HTTPS, zobacz Wskazówki dotyczące komunikacji między chmurą a urządzeniem i Wybieranie protokołu komunikacyjnego.
Tworzenie modułu klienta
Client
Utwórz moduł przy użyciu zainstalowanego pakietu.
Na przykład:
const Client = require('azure-iot-device').Client;
Tworzenie modułu protokołu
Protocol
Utwórz moduł przy użyciu zainstalowanego pakietu transportowego.
W tym przykładzie przypisano protokół MQTT:
const Protocol = require('azure-iot-device-mqtt').Mqtt;
Dodawanie protokołu parametry połączenia urządzenia i transportu
Wywołaj metodę fromConnectionString, aby podać parametry połączenia urządzenia:
- connStr — parametry połączenia, która hermetyzuje uprawnienia "device connect" dla centrum IoT. Parametry połączenia zawiera nazwę hosta, identyfikator urządzenia i klucz dostępu współużytkowanego w tym formacie: "HostName=<iothub_host_name>; DeviceId=<device_id>; SharedAccessKey=<device_key>".
- transportCtor — protokół transportowy.
W tym przykładzie użyto Mqtt
protokołu transportu:
const deviceConnectionString = "{IoT hub device connection string}"
const Protocol = require('azure-iot-device-mqtt').Mqtt;
let client = Client.fromConnectionString(deviceConnectionString, Protocol);
Otwieranie połączenia z usługą IoT Hub
Użyj metody open, aby otworzyć połączenie między urządzeniem IoT i usługą IoT Hub.
Użyj .catch(err)
polecenia , aby przechwycić błąd i wykonać kod procedury obsługi.
Na przykład:
client.open() //open the connection
.catch((err) => {
console.error('Could not connect: ' + err.message);
});
Pobieranie bliźniaczej reprezentacji urządzenia i badanie zgłoszonych właściwości
Wywołaj metodę getTwin , aby pobrać bieżące informacje o bliźniaczej reprezentacji urządzenia do obiektu bliźniaczej reprezentacji .
Na przykład:
client.getTwin(function(err, twin))
if (err)
console.error('could not get twin');
Aktualizowanie zgłoszonych właściwości bliźniaczej reprezentacji urządzenia
Użyj aktualizacji , aby zaktualizować zgłaszane właściwości urządzenia. Dołącz poprawkę w formacie JSON jako pierwszy parametr i metodę wywołania zwrotnego stanu wykonywania funkcji jako drugi parametr metody .
W tym przykładzie poprawka bliźniaczej reprezentacji urządzenia w formacie JSON jest przechowywana w zmiennej patch
. Poprawka zawiera wartość aktualizacji bliźniaczej reprezentacji connectivity
urządzenia .cellular
Procedura obsługi poprawek i błędów jest przekazywana update
do metody . Jeśli wystąpi błąd, zostanie wyświetlony komunikat o błędzie konsoli.
var patch = {
connectivity: {
type: 'cellular'
}
}
twin.properties.reported.update(patch, function(err)
{
if (err)
{
console.error('could not update twin');
}
else
{
console.log('twin state reported');
process.exit();
}
});
Otrzymywanie powiadomienia o zmianach żądanych właściwości
Utwórz żądany odbiornik zdarzeń aktualizacji właściwości, który jest wykonywany po zmianie żądanej właściwości na urządzeniu, przekazując nazwę metody obsługi wywołania zwrotnego do twin.on.
Odbiornik zdarzeń żądanej właściwości może mieć jedną z następujących form:
- Odbieranie wszystkich poprawek za pomocą pojedynczej procedury obsługi zdarzeń
- Odbieranie zdarzenia, jeśli cokolwiek się zmienia w ramach grupowania właściwości
- Odbieranie zdarzenia dla zmiany pojedynczej właściwości
Odbieranie wszystkich poprawek za pomocą pojedynczej procedury obsługi zdarzeń
Możesz utworzyć odbiornik, aby otrzymać dowolną zmianę żądanej właściwości.
Ten przykładowy kod generuje wszystkie właściwości odebrane z usługi.
twin.on('properties.desired', function (delta) {
console.log('new desired properties received:');
console.log(JSON.stringify(delta));
});
Odbieranie zdarzenia, jeśli cokolwiek się zmienia w ramach grupowania właściwości
Możesz utworzyć odbiornik, aby odebrać zdarzenie, jeśli coś w ramach zmiany grupowania właściwości.
Na przykład:
Właściwości
minTemperature
imaxTemperature
znajdują się w grupie właściwości o nazwieproperties.desired.climate changes
.Aplikacja usługi zaplecza stosuje tę poprawkę do aktualizacji
minTemperature
imaxTemperature
żądanych właściwości:const twinPatch1 = { properties: { desired: { climate: { minTemperature: 68, maxTemperature: 76, }, }, }, };
Ten kod konfiguruje żądany odbiornik zdarzeń zmiany właściwości, który wyzwala wszelkie zmiany w
properties.desired.climate
obrębie grupowania właściwości. Jeśli w tej grupie zostanie zmieniona żądana właściwość, minimalna i maksymalna liczba komunikatów o zmianie temperatury wyświetlanych w konsoli: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); } });
Odbieranie zdarzenia dla zmiany pojedynczej właściwości
Odbiornik można skonfigurować pod kątem zmiany pojedynczej właściwości. W tym przykładzie kod tego zdarzenia jest wykonywany tylko wtedy, gdy fanOn
wartość logiczna jest częścią poprawki. Kod generuje nowy żądany fanOn
stan za każdym razem, gdy usługa go zaktualizuje.
Aplikacja zaplecza stosuje tę żądaną poprawkę właściwości:
const twinPatch2 = { properties: { desired: { climate: { hvac: { systemControl: { fanOn: true, }, }, }, }, }, };
Odbiornik jest wyzwalany tylko wtedy, gdy
fanOn
właściwość ulegnie zmianie:twin.on('properties.desired.climate.hvac.systemControl', function (fanOn) { console.log('setting fan state to ' + fanOn); });
Przykłady zestawu SDK urządzeń
Zestaw SDK usługi Azure IoT dla Node.js zawiera dwa przykłady bliźniaczej reprezentacji urządzenia:
Tworzenie aplikacji zaplecza
Aplikacja zaplecza łączy się z urządzeniem za pośrednictwem usługi IoT Hub i może odczytywać zgłaszane i żądane właściwości urządzenia, zapisywać żądane właściwości urządzenia i uruchamiać zapytania dotyczące urządzeń.
W tej sekcji opisano sposób tworzenia aplikacji zaplecza, która:
- Pobiera i aktualizuje bliźniacze reprezentacje urządzenia
- Tworzy zapytanie bliźniaczej reprezentacji urządzenia
Instalowanie pakietów zestawu SDK usługi
Uruchom to polecenie, aby zainstalować usługę azure-iothub na maszynie deweloperskiej:
npm install azure-iothub --save
Klasa Registry uwidacznia wszystkie metody wymagane do interakcji z bliźniaczymi reprezentacjami urządzeń z aplikacji zaplecza.
Nawiązywanie połączenia z centrum IoT
Usługę zaplecza można połączyć z usługą IoT Hub przy użyciu następujących metod:
- Zasady dostępu współdzielonego
- Microsoft Entra
Ważne
Ten artykuł zawiera kroki nawiązywania połączenia z usługą przy użyciu sygnatury dostępu współdzielonego. Ta metoda uwierzytelniania jest wygodna do testowania i oceny, ale uwierzytelnianie w usłudze przy użyciu identyfikatora Entra firmy Microsoft lub tożsamości zarządzanych jest bardziej bezpieczne. Aby dowiedzieć się więcej, zobacz Security best practices Cloud security (Najlepsze rozwiązania > dotyczące zabezpieczeń w chmurze).
Nawiązywanie połączenia przy użyciu zasad dostępu współdzielonego
Użyj polecenia fromConnectionString , aby nawiązać połączenie z centrum IoT. Aplikacja wymaga uprawnień połączenia usługi w celu zmodyfikowania żądanych właściwości bliźniaczej reprezentacji urządzenia i wymaga uprawnień do odczytu rejestru w celu wykonywania zapytań dotyczących rejestru tożsamości. Nie ma domyślnych zasad dostępu współdzielonego, które zawierają tylko te dwa uprawnienia, więc należy utworzyć je, jeśli jeszcze nie istnieje. Podaj te zasady dostępu współdzielonego parametry połączenia jako parametr do fromConnectionString
. Aby uzyskać więcej informacji na temat zasad dostępu współdzielonego, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu sygnatur dostępu współdzielonego.
'use strict';
var iothub = require('azure-iothub');
var connectionString = '{Shared access policy connection string}';
var registry = iothub.Registry.fromConnectionString(connectionString);
Nawiązywanie połączenia przy użyciu usługi Microsoft Entra
Aplikacja zaplecza korzystająca z usługi Microsoft Entra musi pomyślnie uwierzytelnić się i uzyskać poświadczenia tokenu zabezpieczającego przed nawiązaniem połączenia z usługą IoT Hub. Ten token jest przekazywany do metody połączenia usługi IoT Hub. Aby uzyskać ogólne informacje na temat konfigurowania i używania usługi Microsoft Entra dla usługi IoT Hub, zobacz Kontrola dostępu do usługi IoT Hub przy użyciu identyfikatora Microsoft Entra.
Aby zapoznać się z omówieniem uwierzytelniania zestawu NODE.JS SDK, zobacz:
- Wprowadzenie do uwierzytelniania użytkowników na platformie Azure
- Biblioteka klienta tożsamości platformy Azure dla języka JavaScript
Konfigurowanie aplikacji Microsoft Entra
Musisz skonfigurować aplikację Firmy Microsoft Entra skonfigurowaną dla preferowanych poświadczeń uwierzytelniania. Aplikacja zawiera parametry, takie jak klucz tajny klienta, który jest używany przez aplikację zaplecza do uwierzytelniania. Dostępne konfiguracje uwierzytelniania aplikacji to:
- Klucz tajny klienta
- Certyfikat
- Poświadczenia tożsamości federacyjnej
Aplikacje Firmy Microsoft Entra mogą wymagać określonych uprawnień roli w zależności od wykonywanych operacji. Na przykład współautor bliźniaczej reprezentacji usługi IoT Hub jest wymagany do włączenia dostępu do odczytu i zapisu na urządzeniu usługi IoT Hub i bliźniaczych reprezentacjach modułów. Aby uzyskać więcej informacji, zobacz Zarządzanie dostępem do usługi IoT Hub przy użyciu przypisania roli RBAC platformy Azure.
Aby uzyskać więcej informacji na temat konfigurowania aplikacji Microsoft Entra, zobacz Szybki start: rejestrowanie aplikacji przy użyciu Platforma tożsamości Microsoft.
Uwierzytelnianie przy użyciu wartości DefaultAzureCredential
Najprostszym sposobem użycia usługi Microsoft Entra do uwierzytelniania aplikacji zaplecza jest użycie wartości DefaultAzureCredential, ale zaleca się użycie innej metody w środowisku produkcyjnym, w tym określonej TokenCredential
lub pared-down ChainedTokenCredential
. Dla uproszczenia w tej sekcji opisano uwierzytelnianie przy użyciu i DefaultAzureCredential
klucz tajny klienta.
Aby uzyskać więcej informacji na temat zalet i wad korzystania z usługi DefaultAzureCredential
, zobacz Łańcuchy poświadczeń w bibliotece klienta tożsamości platformy Azure dla języka JavaScript
Ustawienie domyślneAzureCredential obsługuje różne mechanizmy uwierzytelniania i określa odpowiedni typ poświadczeń na podstawie środowiska, w których jest wykonywany. Próbuje użyć wielu typów poświadczeń w kolejności, dopóki nie znajdzie działającego poświadczenia.
Firma Microsoft Entra wymaga tego pakietu:
npm install --save @azure/identity
W tym przykładzie klucz tajny klienta rejestracji aplikacji Firmy Microsoft, identyfikator klienta i identyfikator dzierżawy zostały dodane do zmiennych środowiskowych. Te zmienne środowiskowe są używane przez DefaultAzureCredential
program do uwierzytelniania aplikacji. Wynikiem pomyślnego uwierzytelnienia firmy Microsoft Entra jest poświadczenie tokenu zabezpieczającego przekazywane do metody połączenia usługi IoT Hub.
import { DefaultAzureCredential } from "@azure/identity";
// Azure SDK clients accept the credential as a parameter
const credential = new DefaultAzureCredential();
Wynikowy token poświadczeń można następnie przekazać do elementu fromTokenCredential w celu nawiązania połączenia z usługą IoT Hub dla dowolnego klienta zestawu SDK, który akceptuje poświadczenia firmy Microsoft Entra:
fromTokenCredential
wymaga dwóch parametrów:
- Adres URL usługi platformy Azure — adres URL usługi platformy Azure powinien być w formacie
{Your Entra domain URL}.azure-devices.net
bez prefiksuhttps://
. Na przykładMyAzureDomain.azure-devices.net
. - Token poświadczeń platformy Azure
W tym przykładzie poświadczenia platformy Azure są uzyskiwane przy użyciu polecenia DefaultAzureCredential
. Następnie podano adres URL domeny i poświadczenia platformy Azure w celu Registry.fromTokenCredential
utworzenia połączenia z usługą IoT Hub.
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);
Przykłady kodu
Aby zapoznać się z przykładami pracy uwierzytelniania usługi Microsoft Entra, zobacz Przykłady tożsamości platformy Azure.
Pobieranie i aktualizowanie bliźniaczej reprezentacji urządzenia
Możesz utworzyć poprawkę zawierającą tagi i żądane aktualizacje właściwości dla bliźniaczej reprezentacji urządzenia.
Aby zaktualizować bliźniacze reprezentacje urządzenia:
- Wywołaj metodę getTwin , aby pobrać obiekt bliźniaczej reprezentacji urządzenia.
- Sformatuj poprawkę zawierającą aktualizację bliźniaczej reprezentacji urządzenia. Poprawka jest formatowana w formacie JSON zgodnie z opisem w klasie Twin. Poprawka usługi zaplecza może zawierać aktualizacje tagów i żądanych właściwości. Aby uzyskać więcej informacji o formacie poprawki, zobacz Tagi i format właściwości.
- Wywołaj aktualizację w celu zaktualizowania bliźniaczej reprezentacji urządzenia za pomocą poprawki.
W tym przykładzie bliźniacze reprezentacje urządzenia są pobierane dla myDeviceId
elementu , a następnie poprawka jest stosowana do bliźniaczych reprezentacji zawierających location
aktualizację tagu region: 'US', plant: 'Redmond43'
.
registry.getTwin('myDeviceId', function(err, twin){
if (err) {
console.error(err.constructor.name + ': ' + err.message);
} else {
var patch = {
tags: {
location: {
region: 'US',
plant: 'Redmond43'
}
}
};
twin.update(patch, function(err) {
if (err) {
console.error('Could not update twin: ' + err.constructor.name + ': ' + err.message);
} else {
console.log(twin.deviceId + ' twin updated successfully');
queryTwins();
}
});
}
});
Tworzenie zapytania bliźniaczej reprezentacji urządzenia
Zapytania dotyczące urządzeń przypominających język SQL można tworzyć w celu zbierania informacji z bliźniaczych reprezentacji urządzeń.
Użyj polecenia createQuery , aby utworzyć zapytanie, które można uruchomić w wystąpieniu usługi IoT Hub, aby znaleźć informacje o urządzeniach lub zadaniach.
createQuery
zawiera dwa parametry:
- sqlQuery — zapytanie napisane jako ciąg SQL.
- pageSize — żądana liczba wyników na stronę (opcjonalnie. wartość domyślna: 1000, maksymalna: 10000).
Jeśli parametr pageSize jest określony, obiekt zapytania zawiera właściwość logiczną, którą można sprawdzić i użyć nextAsTwin
metody , aby uzyskać następną hasMoreResults
stronę wyników reprezentacji bliźniaczej tyle razy, ile potrzeba, aby pobrać wszystkie wyniki. Metoda o nazwie next
jest dostępna dla wyników, które nie są bliźniaczymi reprezentacjami urządzeń, na przykład wynikami zapytań agregacji.
To przykładowe zapytanie wybiera tylko bliźniacze reprezentacje urządzeń znajdujące się w Redmond43
zakładzie.
var queryTwins = function() {
var query = registry.createQuery("SELECT * FROM devices WHERE tags.location.plant = 'Redmond43'", 100);
query.nextAsTwin(function(err, results) {
if (err) {
console.error('Failed to fetch the results: ' + err.message);
} else {
console.log("Devices in Redmond43: " + results.map(function(twin) {return twin.deviceId}).join(','));
}
});
To przykładowe zapytanie uściśli pierwsze zapytanie, aby wybrać tylko urządzenia, które są również połączone za pośrednictwem sieci komórkowej.
query = registry.createQuery("SELECT * FROM devices WHERE tags.location.plant = 'Redmond43' AND properties.reported.connectivity.type = 'cellular'", 100);
query.nextAsTwin(function(err, results) {
if (err) {
console.error('Failed to fetch the results: ' + err.message);
} else {
console.log("Devices in Redmond43 using cellular network: " + results.map(function(twin) {return twin.deviceId}).join(','));
}
});
};
Przykład zestawu SDK usługi
Zestaw SDK usługi Azure IoT dla Node.js udostępnia działający przykład aplikacji usługi obsługującej zadania bliźniaczej reprezentacji urządzenia. Aby uzyskać więcej informacji, zobacz Usługa zaplecza bliźniaczej reprezentacji urządzenia — ten projekt służy do wysyłania aktualizacji poprawek bliźniaczej reprezentacji urządzenia dla określonego urządzenia.