Sdílet prostřednictvím


Odesílání a příjem zpráv z cloudu na zařízení

Azure IoT Hub je plně spravovaná služba, která umožňuje obousměrnou komunikaci, včetně zpráv typu cloud-zařízení (C2D) z back-endů řešení do milionů zařízení.

Tento článek popisuje, jak pomocí sad SDK Azure IoT sestavit následující typy aplikací:

  • Zařízení aplikace, které přijímají a zpracovávají zprávy z cloudu do zařízení z fronty zasílání zpráv IoT Hubu.

  • Back-endové aplikace, které odesílají zprávy z cloudu do zařízení prostřednictvím fronty zpráv IoT Hubu.

Tento článek je určený k doplnění spustitelných ukázek sady SDK, na které odkazuje tento článek.

Poznámka:

Funkce popsané v tomto článku jsou k dispozici pouze na úrovni Standard služby IoT Hub. Další informace o úrovních Basic a Standard/Free IoT Hub najdete v tématu Volba správné úrovně a velikosti služby IoT Hub pro vaše řešení.

Přehled

Aby aplikace zařízení přijímala zprávy z cloudu na zařízení, musí se připojit k IoT Hub a nastavit zpracovatel zpráv pro zpracování příchozích zpráv. Sady SDK zařízení Azure IoT Hubu poskytují třídy a metody, které zařízení může použít k příjmu a zpracování zpráv ze služby. Tento článek popisuje klíčové prvky jakékoli aplikace zařízení, která přijímá zprávy, včetně:

  • Deklarace objektu klienta zařízení
  • Připojení ke službě IoT Hub
  • Načtěte zprávy z fronty zpráv IoT Hubu
  • Zpracování zprávy a odeslání potvrzení zpět do IoT Hubu
  • Konfigurace zásady opakování příjmu zpráv

Aby back-endová aplikace odesílala zprávy z cloudu do zařízení, musí se připojit ke službě IoT Hub a odesílat zprávy prostřednictvím fronty zpráv ioT Hubu. Sady SDK služby Azure IoT Hub poskytují třídy a metody, které může aplikace použít k odesílání zpráv do zařízení. Tento článek popisuje klíčové prvky všech aplikací, které odesílají zprávy do zařízení, včetně těchto:

  • Deklarace objektu klienta služby
  • Připojení ke službě IoT Hub
  • Sestavení a odeslání zprávy
  • Přijmout zpětnou vazbu ohledně doručení
  • Konfigurace zásady opakování odesílání zpráv

Vysvětlení fronty zpráv

Abyste porozuměli zasílání zpráv z cloudu do zařízení, je důležité porozumět základům fungování front zpráv zařízení IoT Hubu.

Zprávy z cloudu do zařízení, odeslané ze systémové aplikace do zařízení IoT, jsou směrovány přes IoT Hub. Mezi back-endovou aplikací řešení a cílovým zařízením neexistuje žádná přímá peer-to-peer zpráva komunikace. IoT Hub umístí příchozí zprávy do fronty zpráv připravené ke stažení cílovými zařízeními IoT.

Aby se zajistilo alespoň jedno doručení zpráv, IoT Hub udržuje zprávy typu cloud-na-zařízení ve frontách jednotlivých zařízení. Zařízení musí explicitně potvrdit dokončení zprávy, aby služba IoT Hub odebrala zprávu z fronty. Tento přístup zaručuje odolnost proti chybám připojení a zařízení.

Když IoT Hub vloží zprávu do fronty zpráv zařízení, nastaví stav zprávy na Zařazeno do fronty. Když vlákno zařízení převezme zprávu z fronty, IoT Hub zprávu uzamkne nastavením stavu zprávy na Neviditelné. Tento stav brání dalším vláknům v zařízení ve zpracování stejné zprávy. Když vlákno zařízení úspěšně dokončí zpracování zprávy, upozorní ioT Hub a pak IoT Hub nastaví stav zprávy na Dokončeno.

Aplikace zařízení, která úspěšně přijme a zpracuje zprávu, se označuje jako dokončená. V případě potřeby ale zařízení může také:

  • Zamítnout zprávu, která způsobí, že IoT Hub nastaví stav nedoručené pošty. Zařízení, která se připojují přes protokol MQTT (Message Queuing Telemetry Transport), nemůžou odmítnout zprávy z cloudu do zařízení.
  • Opusťte zprávu, která způsobí, že IoT Hub vloží zprávu zpět do fronty se stavem zprávy nastaveným na Zařazení do fronty. Zařízení, která se připojují přes protokol MQTT, nemohou ignorovat zprávy z cloudu na zařízení.

Další informace o životním cyklu zpráv typu cloud-zařízení a o tom, jak IoT Hub zpracovává zprávy typu cloud-zařízení, najdete v tématu Odesílání zpráv typu cloud-zařízení ze služby IoT Hub.

Vytvoření aplikace zařízení

Tato část popisuje, jak přijímat zprávy z cloudu do zařízení.

Existují dvě možnosti, které může klientská aplikace zařízení použít k příjmu zpráv:

  • Callback: Aplikace zařízení nastaví metodu asynchronního obslužného programu pro zprávy, která se vyvolá okamžitě při doručení zprávy.
  • Dotazování: Aplikace zařízení kontroluje nové zprávy IoT Hubu pomocí smyčky kódu (například smyčky while nebo for). Smyčka se provádí neustále a kontroluje zprávy.

Požadovaný balíček NuGet pro zařízení

Klientské aplikace zařízení napsané v jazyce C# vyžadují balíček NuGet Microsoft.Azure.Devices.Client .

Přidejte tyto using příkazy pro použití knihovny zařízení.

using Microsoft.Azure.Devices.Client;
using Microsoft.Azure.Devices.Shared;

Připojení zařízení ke službě IoT Hub

Aplikace zařízení se může ověřit ve službě IoT Hub pomocí následujících metod:

  • Sdílený přístupový klíč
  • Certifikát X.509

Důležité

Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení pro zabezpečení připojení řešení > IoT.

Ověřování pomocí sdíleného přístupového klíče

Třída DeviceClient zveřejňuje všechny metody potřebné k příjmu zpráv na zařízení.

Zadejte primární připojovací řetězec služby IoT Hub a ID zařízení do DeviceClient pomocí metody CreateFromConnectionString. Kromě požadovaného primárního připojovacího řetězce IoT Hubu lze tuto metodu přetížit, aby zahrnovala následující CreateFromConnectionString parametry:

  • transportType – Přenosový protokol: varianty HTTP verze 1, AMQP nebo MQTT. AMQP je výchozí možnost. Pokud chcete zobrazit všechny dostupné hodnoty, viz TransportType Enum.
  • transportSettings - Rozhraní sloužící k definování různých nastavení specifických pro různé druhy přenosu a pro DeviceClient a ModuleClient. Další informace naleznete v tématu Rozhraní ITransportSettings.
  • ClientOptions - Možnosti, které umožňují konfiguraci instance klienta zařízení nebo modulu během inicializace.

Tento příklad se připojí k zařízení pomocí přenosového Mqtt protokolu.

static string DeviceConnectionString = "{IoT hub device connection string}";
static deviceClient = null;
deviceClient = DeviceClient.CreateFromConnectionString(DeviceConnectionString, 
   TransportType.Mqtt);

Ověřování pomocí certifikátu X.509

Připojení zařízení ke službě IoT Hub pomocí certifikátu X.509:

  1. Pomocí DeviceAuthenticationWithX509Certificate vytvořte objekt, který obsahuje informace o zařízení a certifikátu. DeviceAuthenticationWithX509Certificate je předán jako druhý parametr k DeviceClient.Create (krok 2).

  2. Pomocí DeviceClient.Create připojte zařízení ke službě IoT Hub pomocí certifikátu X.509.

V tomto příkladu jsou informace o zařízení a certifikátu vyplněny v objektu authDeviceAuthenticationWithX509Certificate , který je předán DeviceClient.Create.

Tento příklad ukazuje hodnoty vstupních parametrů certifikátu jako místní proměnné pro přehlednost. V produkčním systému uložte citlivé vstupní parametry do proměnných prostředí nebo do jiného bezpečnějšího umístění úložiště. Použijte Environment.GetEnvironmentVariable("HOSTNAME") například ke čtení proměnné prostředí s názvem hostitele.

RootCertPath = "~/certificates/certs/sensor-thl-001-device.cert.pem";
Intermediate1CertPath = "~/certificates/certs/sensor-thl-001-device.intermediate1.cert.pem";
Intermediate2CertPath = "~/certificates/certs/sensor-thl-001-device.intermediate2.cert.pem";
DevicePfxPath = "~/certificates/certs/sensor-thl-001-device.cert.pfx";
DevicePfxPassword = "1234";
DeviceName = "MyDevice";
HostName = "xxxxx.azure-devices.net";

var chainCerts = new X509Certificate2Collection();
chainCerts.Add(new X509Certificate2(RootCertPath));
chainCerts.Add(new X509Certificate2(Intermediate1CertPath));
chainCerts.Add(new X509Certificate2(Intermediate2CertPath));
using var deviceCert = new X509Certificate2(DevicePfxPath, DevicePfxPassword);
using var auth = new DeviceAuthenticationWithX509Certificate(DeviceName, deviceCert, chainCerts);

using var deviceClient = DeviceClient.Create(
    HostName,
    auth,
    TransportType.Amqp);

Další informace o ověřování certifikátů najdete tady:

Ukázky kódu

Pracovní ukázky ověřování certifikátů X.509 zařízení najdete tady:

Zpětné volání

Pokud chcete přijímat zprávy zpětného volání z cloudu do zařízení v aplikaci zařízení, musí se aplikace připojit ke službě IoT Hub a nastavit naslouchací proces zpětného volání pro zpracování příchozích zpráv. Příchozí zprávy do zařízení se přijímají z fronty zpráv ioT Hubu.

Pomocí zpětného volání aplikace zařízení nastaví metodu obslužné rutiny zpráv pomocí SetReceiveMessageHandlerAsync. Obslužná rutina zprávy je volána, když je přijata zpráva. Vytvoření metody zpětného volání pro příjem zpráv eliminuje potřebu průběžného dotazování na přijaté zprávy.

Zpětné volání je k dispozici pouze pomocí těchto protokolů:

  • Mqtt
  • Mqtt_WebSocket_Only
  • Mqtt_Tcp_Only
  • Amqp
  • Amqp_WebSocket_Only
  • Amqp_Tcp_only

Možnost Http1 protokolu nepodporuje zpětné volání, protože metody SDK by se stejně musely dotazovat na přijaté zprávy, což anuluje princip zpětného volání.

V tomto příkladu SetReceiveMessageHandlerAsync nastaví metodu obslužné rutiny zpětného volání s názvem OnC2dMessageReceivedAsync, která se volá při každém přijetí zprávy.

// Subscribe to receive C2D messages through a callback (which isn't supported over HTTP).
await deviceClient.SetReceiveMessageHandlerAsync(OnC2dMessageReceivedAsync, deviceClient);
Console.WriteLine($"\n{DateTime.Now}> Subscribed to receive C2D messages over callback.");

dotazování

Při dotazování se ke kontrole zpráv používá ReceiveAsync.

Volání na ReceiveAsync může mít tyto podoby:

  • ReceiveAsync() – Než budete pokračovat, počkejte na výchozí časový limit zprávy.
  • ReceiveAsync (Timespan) – Obdrží zprávu z fronty zařízení v rámci specifického časového limitu.
  • ReceiveAsync (CancellationToken) – Přijetí zprávy z fronty zařízení pomocí tokenu zrušení. Při použití tokenu zrušení se výchozí období časového limitu nepoužívá.

Při použití typu přenosu HTTP 1 místo MQTT nebo AMQP, ReceiveAsync metoda vrátí okamžitě. Podporovaný vzor pro zprávy z cloudu na zařízení s protokolem HTTP 1 je pro přerušovaně připojená zařízení, která kontrolují zprávy zřídka (nejméně každých 25 minut). Při odesílání většího množství požadavků protokolu HTTP 1 služba IoT Hub omezuje tyto požadavky. Další informace o rozdílech mezi podporou MQTT, AMQP a HTTP 1 najdete v pokynech ke komunikaci typu Cloud-zařízení a volba komunikačního protokolu.

Metoda CompleteAsync

Jakmile zařízení obdrží zprávu, aplikace zařízení zavolá metodu CompleteAsync , která ioT Hubu upozorní, že se zpráva úspěšně zpracuje a že zprávu lze bezpečně odebrat z fronty zařízení IoT Hubu. Zařízení by mělo tuto metodu volat, když se jeho zpracování úspěšně dokončí bez ohledu na protokol přenosu, který používá.

Opuštění, odmítnutí nebo vypršení časového limitu zprávy

S protokoly AMQP a HTTP verze 1, ale ne protokolem MQTT, může zařízení také:

  • Zprávu zrušíte voláním AbandonAsync. Výsledkem je, že IoT Hub uchovává zprávu ve frontě zařízení pro budoucí spotřebu.
  • Zamítnout zprávu voláním RejectAsync. Tím se trvale odebere zpráva z fronty zařízení.

Pokud se stane něco, co brání zařízení v dokončení, opuštění nebo odmítnutí zprávy, IoT Hub zařadí zprávu znovu do fronty po uplynutí časového limitu. Z tohoto důvodu musí být logika zpracování zpráv v aplikaci zařízení idempotentní, takže přijetí stejné zprávy několikrát způsobí stejný výsledek.

Další informace o životním cyklu zpráv typu cloud-zařízení a o tom, jak IoT Hub zpracovává zprávy typu cloud-zařízení, najdete v tématu Odesílání zpráv typu cloud-zařízení ze služby IoT Hub.

Smyčka anketování

Při dotazování aplikace používá smyčku kódu, která metodu ReceiveAsync opakovaně volá, aby kontrolila nové zprávy, dokud se nezastaví.

Pokud používáte ReceiveAsync s hodnotou časového limitu nebo výchozím časovým limitem, ve smyčce každé volání ReceiveAsync počká na zadanou dobu časového limitu. Pokud ReceiveAsync vyprší časový limit, vrátí se hodnota null a smyčka pokračuje.

Při přijetí zprávy je vrácen objekt Task, který je třeba předat metodě ReceiveAsync. Volání na CompleteAsync oznámí službě IoT Hub, aby odstranila zadanou zprávu z fronty zpráv na základě parametru Task.

V tomto příkladu smyčka volá ReceiveAsync , dokud se neobdrží zpráva nebo se zastaví smyčka dotazování.

static bool stopPolling = false;

while (!stopPolling)
{
   // Check for a message. Wait for the default DeviceClient timeout period.
   using Message receivedMessage = await _deviceClient.ReceiveAsync();

   // Continue if no message was received
   if (receivedMessage == null)
   {
      continue;
   }
   else  // A message was received
   {
      // Print the message received
      Console.WriteLine($"{DateTime.Now}> Polling using ReceiveAsync() - received message with Id={receivedMessage.MessageId}");
      PrintMessage(receivedMessage);

      // Notify IoT Hub that the message was received. IoT Hub will delete the message from the message queue.
      await _deviceClient.CompleteAsync(receivedMessage);
      Console.WriteLine($"{DateTime.Now}> Completed C2D message with Id={receivedMessage.MessageId}.");
   }

   // Check to see if polling loop should end
   stopPolling = ShouldPollingstop ();
}

Zásady opakování pokusu o přijetí zprávy

Zásady opakování zpráv klienta zařízení je možné definovat pomocí DeviceClient.SetRetryPolicy.

Časový limit opakování zprávy je uložen ve vlastnosti DeviceClient.OperationTimeoutInMilliseconds .

Ukázka přijetí zprávy sadou SDK

Sada .NET/C# SDK obsahuje ukázku pro příjem zpráv, která obsahuje metody příjmu zpráv popsané v této části.

Vytvoření back-endové aplikace

Tato část popisuje základní kód pro odeslání zprávy z back-endové aplikace řešení do zařízení IoT pomocí třídy ServiceClient v sadě Azure IoT SDK pro .NET. Jak je popsáno dříve, back-endová aplikace řešení se připojuje ke službě IoT Hub a zprávy se odesílají do IoT Hubu kódovaného pomocí cílového zařízení. IoT Hub ukládá příchozí zprávy do fronty zpráv a zprávy se doručují z fronty zpráv IoT Hubu do cílového zařízení.

Back-endová aplikace řešení může také požadovat a přijímat zpětnou vazbu k doručení zprávy odeslané do služby IoT Hub, která je určená pro doručování zařízení prostřednictvím fronty zpráv.

Přidání služby balíčku NuGet

Aplikace back-endových služeb vyžadují balíček NuGet Microsoft.Azure.Devices .

Připojení ke službě IoT Hub

Back-endovou službu můžete ke službě IoT Hub připojit pomocí následujících metod:

  • Zásady sdíleného přístupu
  • Microsoft Entra

Důležité

Tento článek obsahuje postup připojení ke službě pomocí sdíleného přístupového podpisu. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování ve službě pomocí MICROSOFT Entra ID nebo spravovaných identit je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení zabezpečení řešení > IoT v cloudu.

Připojení pomocí zásad sdíleného přístupu

Připojte back-endovou aplikaci k zařízení pomocí createFromConnectionString. Kromě požadovaného primárního připojovacího řetězce IoT Hubu lze tuto metodu přetížit, aby zahrnovala následující CreateFromConnectionString parametry:

  • transportType - Amqp nebo Amqp_WebSocket_Only.
  • transportSettings – Nastavení proxy serveru AMQP a HTTP pro klienta služby.
  • ServiceClientOptions - Možnosti, které umožňují konfiguraci instance klienta služby během inicializace. Další informace naleznete v tématu ServiceClientOptions.

Tento příklad vytvoří ServiceClient objekt pomocí připojovacího řetězce IoT Hub a výchozího Amqp přenosu.

static string connectionString = "{your IoT hub connection string}";
serviceClient = ServiceClient.CreateFromConnectionString(connectionString);

Připojení pomocí Microsoft Entra

Back-endová aplikace, která používá Microsoft Entra, se musí před připojením ke službě IoT Hub úspěšně ověřit a získat přihlašovací údaje tokenu zabezpečení. Tento token se předá metodě pro připojení k IoT Hubu. Obecné informace o nastavení a používání Microsoft Entra pro IoT Hub naleznete v tématu Řízení přístupu ke službě IoT Hub pomocí Microsoft Entra ID.

Konfigurace aplikace Microsoft Entra

Musíte nastavit aplikaci Microsoft Entra, která je nakonfigurovaná pro vaše upřednostňované přihlašovací údaje ověřování. Aplikace obsahuje parametry, jako je tajný klíč klienta, který používá back-endová aplikace k ověření. Dostupné konfigurace ověřování aplikací:

  • Klientské tajemství
  • Certifikát
  • Údaje o federované identitě

Aplikace Microsoft Entra mohou v závislosti na provedených operacích vyžadovat určitá oprávnění role. K povolení přístupu ke čtení a zápisu k zařízení a modulovým dvojčatům služby IoT Hub je například vyžadován IoT Hub Twin Contributor. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení rolí Azure RBAC.

Další informace o nastavení aplikace Microsoft Entra najdete v tématu Rychlý start: Registrace aplikace na platformě Microsoft Identity Platform.

Ověřování pomocí DefaultAzureCredential

Nejjednodušší způsob, jak použít Microsoft Entra k ověření back-endové aplikace, je použít DefaultAzureCredential, ale v produkčním prostředí se doporučuje zvolit jinou metodu, včetně konkrétního TokenCredential nebo zjednodušeného ChainedTokenCredential. Pro zjednodušení popisuje tato část ověřování pomocí DefaultAzureCredential a tajný klíč klienta. Další informace o výhodách a nevýhodách použití naleznete v pokynech k použití DefaultAzureCredentialpro DefaultAzureCredential.

DefaultAzureCredential podporuje různé mechanismy ověřování a určuje odpovídající typ přihlašovacích údajů na základě prostředí, ve které se provádí. Pokusí se použít více typů přihlašovacích údajů v pořadí, dokud nenajde funkční přihlašovací údaje.

Microsoft Entra vyžaduje tyto balíčky NuGet a odpovídající using příkazy:

  • Azure.Core
  • Azure.Identity
using Azure.Core;
using Azure.Identity;

V tomto příkladu jsou do proměnných prostředí přidány klientský tajný klíč, ID klienta a ID tenanta pro registraci aplikace Microsoft Entra. Tyto proměnné prostředí používá DefaultAzureCredential k autentizaci aplikace. Výsledkem úspěšného ověřování Microsoft Entra je zabezpečený tokenový přihlašovací údaj, který je předán do metody připojení IoT Hubu.

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();

Výsledný tokenCredential se pak dá předat metodě připojení ke službě IoT Hub pro libovolného klienta sady SDK, který přijímá přihlašovací údaje Microsoft Entra:

V tomto příkladu se TokenCredential předává do ServiceClient.Create k vytvoření objektu připojení ServiceClient.

string hostname = "xxxxxxxxxx.azure-devices.net";
using var serviceClient = ServiceClient.Create(hostname, tokenCredential, TransportType.Amqp);

V tomto příkladu se TokenCredential předává do RegistryManager.Create, aby se vytvořil objekt RegistryManager.

string hostname = "xxxxxxxxxx.azure-devices.net";
registryManager = RegistryManager.Create(hostname, tokenCredential);
Ukázka kódu

Pro pracovní příklad ověřování služby Microsoft Entra se podívejte na Ukázku ověřování založeného na rolích.

Odeslání asynchronní zprávy z cloudu na zařízení

K odeslání asynchronní zprávy z aplikace prostřednictvím cloudu (IoT Hub) do zařízení použijte sendAsync . Volání se provádí pomocí protokolu AMQP.

sendAsync používá tyto parametry:

  • deviceID – Textový identifikátor cílového zařízení.
  • message – Zpráva z cloudu do zařízení. Zpráva je typu Zpráva a lze ji odpovídajícím způsobem naformátovat.
  • timeout– Volitelná hodnota časového limitu. Výchozí hodnota je jedna minuta, pokud není zadána.

Tento příklad odešle testovací zprávu cílovému zařízení s hodnotou časového limitu 10 sekund.

string targetDevice = "Device-1";
static readonly TimeSpan operationTimeout = TimeSpan.FromSeconds(10);
var commandMessage = new
Message(Encoding.ASCII.GetBytes("Cloud to device message."));
await serviceClient.SendAsync(targetDevice, commandMessage, operationTimeout);

Přijmout zpětnou vazbu ohledně doručení

Odesílající program může požadovat potvrzení o doručení (nebo vypršení platnosti) ze služby IoT Hub pro každou zprávu typu cloud-zařízení. Tato možnost umožňuje odesílajícímu programu používat logiku informování, opakování nebo kompenzace. Úplný popis operací a vlastností zpětné vazby na zprávu je popsán v Zpětná vazba na zprávu.

Přijímání zpětné vazby z doručení zprávy:

  • Vytvoření objektu feedbackReceiver
  • Odesílání zpráv pomocí parametru Ack
  • Počkejte, až dostanete zpětnou vazbu.

Vytvoření objektu feedbackReceiver

Pro zavolání GetFeedbackReceiver k vytvoření objektu FeedbackReceiver. FeedbackReceiver obsahuje metody, které mohou služby použít k provádění operací příjmu zpětné vazby.

var feedbackReceiver = serviceClient.GetFeedbackReceiver();

Odesílání zpráv pomocí parametru Ack

Každá zpráva musí obsahovat hodnotu vlastnosti Ack potvrzení o doručení, aby bylo možné dostávat zpětnou vazbu o doručení. Vlastnost Ack může být jedna z těchto hodnot:

  • none (výchozí): Nevygeneruje se žádná zpráva zpětné vazby.

  • Positive: Pokud byla zpráva dokončena, obdržíte zprávu s zpětnou vazbou.

  • Negative: obdržet zpětnou vazbu, pokud vypršela platnost zprávy nebo bylo dosaženo maximálního počtu doručení, aniž by ji zařízení dokončilo.

  • Full: zpětná vazba k oběma Positive výsledkům a Negative výsledkům.

V tomto příkladu je vlastnost Ack nastavena na Full, což požaduje zpětnou vazbu ke doručení zprávy, ať už je pozitivní či negativní.

var commandMessage = new
Message(Encoding.ASCII.GetBytes("Cloud to device message."));
commandMessage.Ack = DeliveryAcknowledgement.Full;
await serviceClient.SendAsync(targetDevice, commandMessage);

Počkejte, až dostanete zpětnou vazbu.

Definujte CancellationToken. Pak ve smyčce opakovaně volat ReceiveAsync a kontrolovat potvrzení o doručení. Každé volání ReceiveAsync čeká na dobu časového limitu definovanou pro objekt ServiceClient.

  • ReceiveAsync Pokud vyprší časový limit bez přijetí zprávy, ReceiveAsync vrátí null a smyčka pokračuje.
  • Pokud se přijme zpětnovazební zpráva, vrátí se objekt Task prostřednictvím ReceiveAsync, který by měl být předán metodě CompleteAsync spolu s tokenem zrušení. Volaní na CompleteAsync odstraní zadanou odeslanou zprávu z fronty zpráv na základě parametru Task.
  • V případě potřeby může přijímací kód zavolat AbandonAsync, aby vrátil odeslanou zprávu zpět do fronty.
var feedbackReceiver = serviceClient.GetFeedbackReceiver();
// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
// Call ReceiveAsync, passing the token. Wait for the timeout period.
var feedbackBatch = await feedbackReceiver.ReceiveAsync(token);
if (feedbackBatch == null) continue;

Tento příklad ukazuje metodu, která zahrnuje tyto kroky.

private async static void ReceiveFeedbackAsync()
{
      var feedbackReceiver = serviceClient.GetFeedbackReceiver();

      Console.WriteLine("\nReceiving c2d feedback from service");
      while (true)
      {
         // Check for messages, wait for the timeout period.
         var feedbackBatch = await feedbackReceiver.ReceiveAsync();
         // Continue the loop if null is received after a timeout.
         if (feedbackBatch == null) continue;

         Console.ForegroundColor = ConsoleColor.Yellow;
         Console.WriteLine("Received feedback: {0}",
            string.Join(", ", feedbackBatch.Records.Select(f => f.StatusCode)));
         Console.ResetColor();

         await feedbackReceiver.CompleteAsync(feedbackBatch);
      }
   }

Upozorňujeme, že tento způsob přijímání zpětné vazby je podobný způsobu, jakým se v aplikaci zařízení přijímají zprávy z cloudu do zařízení.

Opětovné připojení klienta služby

Při výskytu výjimky klient služby předá informace volající aplikaci. V tomto okamžiku se doporučuje zkontrolovat podrobnosti o výjimce a provést nezbytná opatření.

Příklad:

  • Pokud se jedná o výjimku sítě, můžete operaci zopakovat.
  • Pokud se jedná o výjimku zabezpečení (neautorizovanou výjimku), zkontrolujte své přihlašovací údaje a ujistěte se, že jsou aktuální.
  • Pokud se jedná o výjimku překročení omezení nebo výjimku překročení kvóty, monitorujte a/nebo upravte frekvenci odesílání požadavků, nebo aktualizujte úroveň škálování instance centra. Podrobnosti najdete v tématu Kvóty a omezování služby IoT Hub.

Zásady opakování odesílání zpráv

Zásady ServiceClient opakování zprávy lze definovat pomocí ServiceClient.SetRetryPolicy.

Ukázková zpráva pro odeslání prostřednictvím SDK

Sada .NET/C# SDK obsahuje ukázku klienta služby, která obsahuje metody odesílání zpráv popsané v této části.

Vytvoření aplikace zařízení

Tato část popisuje, jak přijímat zprávy z cloudu do zařízení pomocí třídy DeviceClient ze sady Azure IoT SDK pro Javu.

Aby zařízení s aplikací založenou na Javě mohlo přijímat zprávy z cloudu do zařízení, musí se připojit ke službě IoT Hub a pak nastavit posluchače pro zpětné volání a obslužnou rutinu zpráv k zpracování příchozích zpráv ze služby IoT Hub.

Import knihoven sady Azure IoT Java SDK

Kód, na který odkazuje tento článek, používá tyto knihovny sady SDK.

import com.microsoft.azure.sdk.iot.device.*;
import com.microsoft.azure.sdk.iot.device.exceptions.IotHubClientException;
import com.microsoft.azure.sdk.iot.device.transport.IotHubConnectionStatus;

Připojení zařízení ke službě IoT Hub

Aplikace zařízení se může ověřit ve službě IoT Hub pomocí následujících metod:

  • Sdílený přístupový klíč
  • Certifikát X.509

Důležité

Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení pro zabezpečení připojení řešení > IoT.

Ověřování pomocí sdíleného přístupového klíče

Vytvoření instance objektu DeviceClient vyžaduje tyto parametry:

  • connString – připojovací řetězec zařízení IoT. Připojovací řetězec je sada párů klíč-hodnota, které jsou oddělené znakem ;, s klíči a hodnotami oddělenými znakem =. Měl by obsahovat hodnoty pro tyto klíče: HostName, DeviceId, and SharedAccessKey.
  • Přenosový protokolDeviceClient Připojení může používat jeden z následujících přenosových protokolů IoTHubClientProtocol . AMQP je nejuniverzálnější, umožňuje často kontrolovat zprávy a umožňuje odmítnutí a zrušení zprávy. MQTT nepodporuje metody zamítnutí nebo opuštění zprávy:
    • AMQPS
    • AMQPS_WS
    • HTTPS
    • MQTT
    • MQTT_WS

Příklad:

static string connectionString = "{IOT hub device connection string}";
static protocol = IotHubClientProtocol.AMQPS;
DeviceClient client = new DeviceClient(connectionString, protocol);

Ověřování pomocí certifikátu X.509

Připojení zařízení ke službě IoT Hub pomocí certifikátu X.509:

  1. Sestavte objekt SSLContext pomocí buildSSLContext.
  2. SSLContext Přidejte informace do objektu ClientOptions.
  3. Zavolejte DeviceClient pomocí ClientOptions informací a vytvořte připojení zařízení k IoT Hubu.

Tento příklad ukazuje hodnoty vstupních parametrů certifikátu jako místní proměnné pro přehlednost. V produkčním systému uložte citlivé vstupní parametry do proměnných prostředí nebo do jiného bezpečnějšího umístění úložiště. Například použijte Environment.GetEnvironmentVariable("PUBLICKEY") ke čtení proměnné prostředí obsahující řetězec certifikátu veřejného klíče.

private static final String publicKeyCertificateString =
        "-----BEGIN CERTIFICATE-----\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "-----END CERTIFICATE-----\n";

//PEM encoded representation of the private key
private static final String privateKeyString =
        "-----BEGIN EC PRIVATE KEY-----\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n" +
        "-----END EC PRIVATE KEY-----\n";

SSLContext sslContext = SSLContextBuilder.buildSSLContext(publicKeyCertificateString, privateKeyString);
ClientOptions clientOptions = ClientOptions.builder().sslContext(sslContext).build();
DeviceClient client = new DeviceClient(connString, protocol, clientOptions);

Další informace o ověřování certifikátů najdete tady:

Ukázky kódu

Pracovní ukázky ověřování certifikátů X.509 zařízení najdete tady:

Nastavení metody zpětného volání zprávy

Použijte metodu setMessageCallback k definování metody obsluhy zpráv, která je informována při přijetí zprávy ze služby IoT Hub.

setMessageCallback zahrnuje tyto parametry:

  • callback – Název metody zpětného volání. Může to být null.
  • context- Volitelný kontext typu object. Použijte null, pokud není zadáno.

V tomto příkladu je metoda jménem callback předána do MessageCallback bez parametru kontextu setMessageCallback.

client.setMessageCallback(new MessageCallback(), null);

Vytvořte obslužnou rutinu zpětného volání zprávy

Obslužná rutina zprávy Callback přijímá a zpracovává příchozí zprávu předanou z fronty zpráv IoT Hubu.

V tomto příkladu obslužná rutina zprávy zpracuje příchozí zprávu a pak vrátí IotHubMessageResult.COMPLETE. Návratová IotHubMessageResult.COMPLETE hodnota oznámí službě IoT Hub, že zpráva byla úspěšně zpracována a že zprávu je možné bezpečně odebrat z fronty zařízení. Zařízení by se mělo vrátit IotHubMessageResult.COMPLETE po úspěšném dokončení zpracování a upozornit IoT Hub, že by se zpráva měla odebrat z fronty zpráv bez ohledu na protokol, který používá.

  protected static class MessageCallback implements com.microsoft.azure.sdk.iot.device.MessageCallback
  {
      public IotHubMessageResult onCloudToDeviceMessageReceived(Message msg, Object context)
      {
          System.out.println(
                  "Received message with content: " + new String(msg.getBytes(), Message.DEFAULT_IOTHUB_MESSAGE_CHARSET));
          // Notify IoT Hub that the message
          return IotHubMessageResult.COMPLETE;
      }
  }

Možnosti opuštění a odmítnutí zprávy

I když by měl být do zařízení úspěšně přijat velký počet příchozích zpráv, IotHubMessageResult.COMPLETEmůže být nutné zprávu opustit nebo odmítnout.

  • S AMQP a HTTPS, ale ne MQTT může aplikace:
    • IotHubMessageResult.ABANDON zpráva. IoT Hub ho znovu odešle a odešle ho později.
    • IotHubMessageResult.REJECT zpráva. IoT Hub zprávu nepřeřadí do fronty a trvale ji odstraní z fronty zpráv.
  • Klienti používající MQTT nebo MQTT_WS nemohou ABANDON nebo REJECT zprávy.

Pokud se stane něco, co brání zařízení v dokončení, opuštění nebo odmítnutí zprávy, IoT Hub zařadí zprávu znovu do fronty po uplynutí časového limitu. Z tohoto důvodu musí být logika zpracování zpráv v aplikaci zařízení idempotentní, takže přijetí stejné zprávy několikrát způsobí stejný výsledek.

Další informace o životním cyklu zpráv typu cloud-zařízení a o tom, jak IoT Hub zpracovává zprávy typu cloud-zařízení, najdete v tématu Odesílání zpráv typu cloud-zařízení ze služby IoT Hub.

Poznámka:

Pokud jako přenos použijete protokol HTTPS místo MQTT nebo AMQP, instance DeviceClient kontroluje zprávy ze služby IoT Hub zřídka (minimálně každých 25 minut). Další informace o rozdílech mezi podporou MQTT, AMQP a HTTPS najdete v pokynech ke komunikaci typu Cloud-zařízení a volba komunikačního protokolu.

Vytvoření metody zpětného volání stavu zprávy

Aplikace může použít registerConnectionStatusChangeCallback k registraci metody zpětného volání, která se má provést při změně stavu připojení zařízení. Tímto způsobem může aplikace rozpoznat přerušené připojení ke zprávám a zkusí se znovu připojit.

V tomto příkladu IotHubConnectionStatusChangeCallbackLogger se zaregistruje jako metoda zpětného volání změny stavu připojení.

client.registerConnectionStatusChangeCallback(new IotHubConnectionStatusChangeCallbackLogger(), new Object());

Zpětné volání se aktivuje a objekt ConnectionStatusChangeContext se předá.

Volání connectionStatusChangeContext.getNewStatus() pro získání aktuálního stavu připojení

IotHubConnectionStatus status = connectionStatusChangeContext.getNewStatus();

Vrácený stav připojení může být jedna z těchto hodnot:

  • IotHubConnectionStatus.DISCONNECTED
  • IotHubConnectionStatus.DISCONNECTED_RETRYING
  • IotHubConnectionStatus.CONNECTED

Zavolejte connectionStatusChangeContext.getNewStatusReason() a získejte důvod změny stavu připojení.

IotHubConnectionStatusChangeReason statusChangeReason = connectionStatusChangeContext.getNewStatusReason();

Voláním connectionStatusChangeContext.getCause() zjistíte důvod změny stavu připojení. getCause() může vrátit null, pokud nejsou k dispozici žádné informace.

Throwable throwable = connectionStatusChangeContext.getCause();
if (throwable != null)
    throwable.printStackTrace();

Podívejte se na ukázku HandleMessages uvedenou v sekci s ukázkami příjmu zpráv SDK tohoto článku pro kompletní vzor, který ukazuje, jak extrahovat metodu zpětného volání při změně stavu připojení, důvod změny stavu zařízení a kontext.

Otevření připojení mezi zařízením a IoT Hubem

Otevřením vytvoříte připojení mezi zařízením a IoT Hubem. Zařízení teď může asynchronně odesílat a přijímat zprávy do a ze služby IoT Hub. Pokud je klient již otevřený, metoda nic nedělá.

client.open(true);

Ukázka přijetí zprávy sadou SDK

HandleMessages: ukázková aplikace pro zařízení, která je součástí sady Microsoft Azure IoT SDK pro Javu, která se připojuje k vašemu IoT hubu a přijímá zprávy z cloudu do zařízení.

Vytvoření back-endové aplikace

Tato část popisuje, jak odeslat zprávu z cloudu na zařízení použitím třídy ServiceClient ze sady Azure IoT SDK pro Javu. Back-endová aplikace řešení se připojuje ke službě IoT Hub a zprávy se odesílají do IoT Hubu kódovaného pomocí cílového zařízení. IoT Hub ukládá příchozí zprávy do fronty zpráv a zprávy se doručují z fronty zpráv IoT Hubu do cílového zařízení.

Back-endová aplikace řešení může také požadovat a přijímat zpětnou vazbu k doručení zprávy odeslané do služby IoT Hub, která je určená pro doručování zařízení prostřednictvím fronty zpráv.

Přidejte příkaz závislostí

Přidejte závislost pro použití balíčku iothub-java-service-client ve vaší aplikaci ke komunikaci se službou IoT Hub:

<dependency>
  <groupId>com.microsoft.azure.sdk.iot</groupId>
  <artifactId>iot-service-client</artifactId>
  <version>1.7.23</version>
</dependency>

Přidejte příkazy importu

Přidejte tyto příkazy importu pro použití sady Azure IoT Java SDK a obslužné rutiny výjimek.

import com.microsoft.azure.sdk.iot.service.*;
import java.io.IOException;
import java.net.URISyntaxException;

Připojení ke službě IoT Hub

Back-endovou službu můžete ke službě IoT Hub připojit pomocí následujících metod:

  • Zásady sdíleného přístupu
  • Microsoft Entra

Důležité

Tento článek obsahuje postup připojení ke službě pomocí sdíleného přístupového podpisu. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování ve službě pomocí MICROSOFT Entra ID nebo spravovaných identit je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení zabezpečení řešení > IoT v cloudu.

Připojení pomocí zásad sdíleného přístupu

Definování protokolu připojení

Pomocí IotHubServiceClientProtocol definujte protokol aplikační vrstvy používaný klientem služby ke komunikaci se službou IoT Hub.

IotHubServiceClientProtocol přijímá pouze výčet AMQPS nebo AMQPS_WS.

IotHubServiceClientProtocol protocol = IotHubServiceClientProtocol.AMQPS;
Vytvoření objektu ServiceClient

Vytvořte objekt ServiceClient a zadejte připojovací řetězec a protokol IoT Hub.

String connectionString = "{yourhubconnectionstring}";
ServiceClient serviceClient (connectionString, protocol);
Otevření připojení mezi aplikací a IoT Hubem

otevřete připojení odesílatele AMQP. Tato metoda vytvoří připojení mezi aplikací a IoT Hubem.

serviceClient.open();

Připojení pomocí Microsoft Entra

Back-endová aplikace, která používá Microsoft Entra, se musí před připojením ke službě IoT Hub úspěšně ověřit a získat přihlašovací údaje tokenu zabezpečení. Tento token se předá metodě pro připojení k IoT Hubu. Obecné informace o nastavení a používání Microsoft Entra pro IoT Hub naleznete v tématu Řízení přístupu ke službě IoT Hub pomocí Microsoft Entra ID.

Přehled ověřování pro Javu SDK najdete v tématu Ověřování Azure s využitím Java a Azure Identity.

Pro zjednodušení se tato část zaměřuje na popis ověřování pomocí tajného klíče klienta.

Konfigurace aplikace Microsoft Entra

Musíte nastavit aplikaci Microsoft Entra, která je nakonfigurovaná pro vaše upřednostňované přihlašovací údaje ověřování. Aplikace obsahuje parametry, jako je tajný klíč klienta, který používá back-endová aplikace k ověření. Dostupné konfigurace ověřování aplikací:

  • Klientské tajemství
  • Certifikát
  • Údaje o federované identitě

Aplikace Microsoft Entra mohou v závislosti na provedených operacích vyžadovat určitá oprávnění role. K povolení přístupu ke čtení a zápisu k zařízení a modulovým dvojčatům služby IoT Hub je například vyžadován IoT Hub Twin Contributor. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení rolí Azure RBAC.

Další informace o nastavení aplikace Microsoft Entra najdete v tématu Rychlý start: Registrace aplikace na platformě Microsoft Identity Platform.

Ověřování pomocí DefaultAzureCredential

Nejjednodušší způsob, jak použít Microsoft Entra k ověření back-endové aplikace, je použít DefaultAzureCredential, ale v produkčním prostředí se doporučuje zvolit jinou metodu, včetně konkrétního TokenCredential nebo zjednodušeného ChainedTokenCredential. Další informace o výhodách a nevýhodách použití DefaultAzureCredentialnajdete v řetězcích přihlašovacích údajů v klientské knihovně Azure Identity pro Javu.

DefaultAzureCredential podporuje různé mechanismy ověřování a určuje odpovídající typ přihlašovacích údajů na základě prostředí, ve které se provádí. Pokusí se použít více typů přihlašovacích údajů v pořadí, dokud nenajde funkční přihlašovací údaje.

Přihlašovací údaje aplikace Microsoft Entra můžete ověřit pomocí defaultAzureCredentialBuilder. Uložte parametry připojení, jako jsou tenantID, clientID, a hodnoty tajného klíče klienta, jako proměnné prostředí. Jakmile je TokenCredential vytvořen, předejte ho jako parametr 'credential' do ServiceClient nebo jiného konstruktoru.

V tomto příkladu DefaultAzureCredentialBuilder se pokusí ověřit připojení ze seznamu popsaného v části DefaultAzureCredential. Výsledkem úspěšného ověření Microsoft Entra je token zabezpečení, který je předán konstruktoru, jako ServiceClient.

TokenCredential defaultAzureCredential = new DefaultAzureCredentialBuilder().build();
Ověřování pomocí ClientSecretCredentialBuilder

Pomocí ClientSecretCredentialBuilder můžete vytvořit přihlašovací údaje pomocí tajných informací klienta. Pokud je tato metoda úspěšná, vrátí tokenCredential , který lze předat ServiceClient nebo jinému tvůrci jako parametr credential.

V tomto příkladu byly hodnoty klientského tajemství, ID klienta a ID tenanta pro registraci aplikace Microsoft Entra přidány do proměnných prostředí. Tyto proměnné prostředí ClientSecretCredentialBuilder se používají k sestavení přihlašovacích údajů.

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();
Jiné třídy ověřování

Sada Java SDK také obsahuje tyto třídy, které ověřují back-endovou aplikaci pomocí Microsoft Entra:

Ukázky kódu

Pracovní ukázky ověřování služby Microsoft Entra najdete v ukázce ověřování na základě rolí.

Otevřít přijímače zpětné vazby pro zpětnou vazbu o doručení zpráv

Pomocí FeedbackReceiver můžete získat zpětnou vazbu o doručení zpráv do IoT Hub. A FeedbackReceiver je specializovaný přijímač, jehož Receive metoda vrací FeedbackBatch místo Message.

V tomto příkladu se vytvoří objekt FeedbackReceiver a zavolá se ten open() příkaz, který bude čekat na zpětnou vazbu.

FeedbackReceiver feedbackReceiver = serviceClient
  .getFeedbackReceiver();
if (feedbackReceiver != null) feedbackReceiver.open();

Přidání vlastností zprávy

Volitelně můžete použít setProperties k přidání vlastností zprávy. Tyto vlastnosti jsou zahrnuty do zprávy odeslané do zařízení a aplikace zařízení je může extrahovat po přijetí.

Map<String, String> propertiesToSend = new HashMap<String, String>();
propertiesToSend.put(messagePropertyKey,messagePropertyKey);
messageToSend.setProperties(propertiesToSend);

Vytvoření a odeslání asynchronní zprávy

Objekt Message ukládá zprávu, která se má odeslat. V tomto příkladu se doručí zpráva z cloudu do zařízení.

Pomocí setDeliveryAcknowledgement můžete požadovat potvrzení o doručení či nedoručení do fronty zpráv IoT Hubu. V tomto příkladu je požadováno potvrzení, které může být Full doručeno nebo nedoručeno.

K odeslání asynchronní zprávy z klienta do zařízení použijte SendAsync . Alternativně můžete použít metodu Send (nesync), ale tato funkce se synchronizuje interně, takže najednou je povolená jenom jedna operace odeslání. Zpráva se doručí z aplikace do IoT Hubu. IoT Hub umístí zprávu do fronty zpráv připravené k doručení do cílového zařízení.

Message messageToSend = new Message("Cloud to device message.");
messageToSend.setDeliveryAcknowledgementFinal(DeliveryAcknowledgement.Full);
serviceClient.sendAsync(deviceId, messageToSend);

Příjem zpětné vazby k doručení zprávy

Po odeslání zprávy z aplikace může aplikace volat příjem s hodnotou časového limitu nebo bez ní. Pokud není zadána hodnota časového limitu, použije se výchozí časový limit. Tím se předá zpět objekt FeedbackBatch , který obsahuje vlastnosti zpětné vazby pro doručení zprávy, které je možné prozkoumat.

Tento příklad vytvoří FeedbackBatch příjemce a zavolá getEnqueuedTimeUtc, aby vytiskl čas zařazení zprávy.

FeedbackBatch feedbackBatch = feedbackReceiver.receive(10000);
if (feedbackBatch != null) {
  System.out.println("Message feedback received, feedback time: "
    + feedbackBatch.getEnqueuedTimeUtc().toString());
}

Ukázky zpráv zaslaných sadou SDK

Existují dva ukázky odesílaných zpráv:

Vytvoření aplikace zařízení

Tato část popisuje, jak přijímat zprávy z cloudu do zařízení.

Třída IoTHubDeviceClient obsahuje metody pro vytvoření synchronního připojení ze zařízení do služby Azure IoT Hub a příjem zpráv ze služby IoT Hub.

Aby bylo možné vytvářet aplikace zařízení, musí být nainstalovaná knihovna azure-iot-device .

pip install azure-iot-device

Aby aplikace zařízení založená na Pythonu přijímala zprávy typu cloud-zařízení, musí se připojit ke službě IoT Hub a pak nastavit obslužnou rutinu zpětného volání pro zpracování příchozích zpráv ze služby IoT Hub.

Příkaz importu zařízení

Přidejte tento kód pro import IoTHubDeviceClient funkcí ze sady AZURE.iot.device SDK.

from azure.iot.device import IoTHubDeviceClient

Připojení zařízení ke službě IoT Hub

Aplikace zařízení se může ověřit ve službě IoT Hub pomocí následujících metod:

  • Sdílený přístupový klíč
  • Certifikát X.509

Důležité

Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení pro zabezpečení připojení řešení > IoT.

Ověřování pomocí sdíleného přístupového klíče

Připojení zařízení ke službě IoT Hub:

  1. Voláním create_from_connection_string přidejte primární připojovací řetězec zařízení.
  2. Zavolejte connect k připojení klienta zařízení.

Příklad:

# Add your IoT hub primary connection string
CONNECTION_STRING = "{Device primary connection string}"
device_client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)

# Connect the client
device_client.connect()

Ověřování pomocí certifikátu X.509

Připojení zařízení ke službě IoT Hub pomocí certifikátu X.509:

  1. Přidání parametrů certifikátu X.509 pomocí create_from_x509_certificate
  2. Vyvolejte connect pro připojení klienta zařízení

Tento příklad ukazuje hodnoty vstupních parametrů certifikátu jako místní proměnné pro přehlednost. V produkčním systému uložte citlivé vstupní parametry do proměnných prostředí nebo do jiného bezpečnějšího umístění úložiště. Použijte os.getenv("HOSTNAME") například ke čtení proměnné prostředí s názvem hostitele.

# The Azure IoT hub name
hostname = "xxxxx.azure-devices.net"

# The device that has been created on the portal using X509 CA signing or self-signing capabilities
device_id = "MyDevice"

# The X.509 certificate file name
cert_file = "~/certificates/certs/sensor-thl-001-device.cert.pfx"
key_file = "~/certificates/certs/sensor-thl-001-device.cert.key"
# The optional certificate pass phrase
pass_phrase = "1234"

x509 = X509(
    cert_file,
    key_file,
    pass_phrase,
)

# The client object is used to interact with your Azure IoT hub.
device_client = IoTHubDeviceClient.create_from_x509_certificate(
    hostname=hostname, device_id=device_id, x509=x509
)

# Connect to IoT Hub
await device_client.connect()

Další informace o ověřování certifikátů najdete tady:

Ukázky kódu

Pracovní ukázky ověřování certifikátů X.509 zařízení najdete v příkladech, jejichž názvy souborů končí na x509, ve scénářích centra Async.

Zpracování opětovného připojení

IoTHubDeviceClient ve výchozím nastavení se pokusí znovu vytvořit přerušené připojení. Chování opětovného IoTHubDeviceClientpřipojení se řídí connection_retry a connection_retry_interval parametry.

Vytvořte obslužnou rutinu zprávy

Vytvořte obslužnou funkci pro zpracování příchozích zpráv do zařízení. To bude přiřazeno on_message_received (další krok) jako obsluha zpráv zpětného volání.

V tomto příkladu je message_handler volána při přijetí zprávy. Vlastnosti zprávy (.items) se vytisknou na konzoli pomocí smyčky.

def message_handler(message):
    global RECEIVED_MESSAGES
    RECEIVED_MESSAGES += 1
    print("")
    print("Message received:")

    # print data from both system and application (custom) properties
    for property in vars(message).items():
        print ("    {}".format(property))

    print("Total calls received: {}".format(RECEIVED_MESSAGES))

Přiřaďte obslužnou rutinu zprávy

Metodu on_message_received použijte k přiřazení metody obslužné rutiny zprávy.

V tomto příkladu je k objektu message_handlerIoTHubDeviceClient připojena metoda obslužné rutiny zpráv client. Objekt client čeká na přijetí zprávy z cloudu do zařízení ze služby IoT Hub. Tento kód počká až 300 sekund (5 minut) na zprávu nebo se ukončí, pokud je stisknutá klávesa klávesnice.

try:
    # Attach the handler to the client
    client.on_message_received = message_handler

    while True:
        time.sleep(300)
except KeyboardInterrupt:
    print("IoT Hub C2D Messaging device sample stopped")
finally:
    # Graceful exit
    print("Shutting down IoT Hub Client")
    client.shutdown()

Ukázka přijetí zprávy sadou SDK

Přijmout zprávu – příjem zpráv typu cloud-to-device (C2D) odesílaných z Azure IoT Hub do zařízení

Vytvoření back-endové aplikace

Tato část popisuje, jak odeslat zprávu z cloudu na zařízení. Back-endová aplikace řešení se připojuje ke službě IoT Hub a zprávy se odesílají do IoT Hubu kódovaného pomocí cílového zařízení. IoT Hub ukládá příchozí zprávy do fronty zpráv a zprávy se doručují z fronty zpráv IoT Hubu do cílového zařízení.

Třída IoTHubRegistryManager zveřejňuje všechny metody potřebné k vytvoření back-endové aplikace pro interakci se zprávami typu cloud-zařízení ze služby. Aby bylo možné vytvářet aplikace back-endové služby, musí být nainstalovaná knihovna azure-iot-hub .

pip install azure-iot-hub

Importujte objekt IoTHubRegistryManager

Přidejte následující import příkaz. IoTHubRegistryManager zahrnuje rozhraní API pro operace Správce registru služby IoT Hub.

from azure.iot.hub import IoTHubRegistryManager

Připojení ke službě IoT Hub

Back-endovou službu můžete ke službě IoT Hub připojit pomocí následujících metod:

  • Zásady sdíleného přístupu
  • Microsoft Entra

Důležité

Tento článek obsahuje postup připojení ke službě pomocí sdíleného přístupového podpisu. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování ve službě pomocí MICROSOFT Entra ID nebo spravovaných identit je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení zabezpečení řešení > IoT v cloudu.

Připojení pomocí zásad sdíleného přístupu

Připojte se ke službě IoT Hub pomocí from_connection_string.

Příklad:

IoTHubConnectionString = "{IoT hub service connection string}"
registry_manager = IoTHubRegistryManager.from_connection_string(IoTHubConnectionString)

Připojení pomocí Microsoft Entra

Back-endová aplikace, která používá Microsoft Entra, se musí před připojením ke službě IoT Hub úspěšně ověřit a získat přihlašovací údaje tokenu zabezpečení. Tento token se předá metodě pro připojení k IoT Hubu. Obecné informace o nastavení a používání Microsoft Entra pro IoT Hub naleznete v tématu Řízení přístupu ke službě IoT Hub pomocí Microsoft Entra ID.

Konfigurace aplikace Microsoft Entra

Musíte nastavit aplikaci Microsoft Entra, která je nakonfigurovaná pro vaše upřednostňované přihlašovací údaje ověřování. Aplikace obsahuje parametry, jako je tajný klíč klienta, který používá back-endová aplikace k ověření. Dostupné konfigurace ověřování aplikací:

  • Klientské tajemství
  • Certifikát
  • Údaje o federované identitě

Aplikace Microsoft Entra mohou v závislosti na provedených operacích vyžadovat určitá oprávnění role. K povolení přístupu ke čtení a zápisu k zařízení a modulovým dvojčatům služby IoT Hub je například vyžadován IoT Hub Twin Contributor. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení rolí Azure RBAC.

Další informace o nastavení aplikace Microsoft Entra najdete v tématu Rychlý start: Registrace aplikace na platformě Microsoft Identity Platform.

Ověřování pomocí DefaultAzureCredential

Nejjednodušší způsob, jak použít Microsoft Entra k ověření back-endové aplikace, je použít DefaultAzureCredential, ale v produkčním prostředí se doporučuje zvolit jinou metodu, včetně konkrétního TokenCredential nebo zjednodušeného ChainedTokenCredential. Pro zjednodušení popisuje tato část ověřování pomocí DefaultAzureCredential a tajný klíč klienta. Další informace o výhodách a nevýhodách použití naleznete v pokynech k použití DefaultAzureCredentialpro DefaultAzureCredential.

DefaultAzureCredential podporuje různé mechanismy ověřování a určuje odpovídající typ přihlašovacích údajů na základě prostředí, ve které se provádí. Pokusí se použít více typů přihlašovacích údajů v pořadí, dokud nenajde funkční přihlašovací údaje.

Microsoft Entra vyžaduje tyto balíčky NuGet a odpovídající using příkazy:

  • Azure.Core
  • Azure.Identity
using Azure.Core;
using Azure.Identity;

V tomto příkladu jsou do proměnných prostředí přidány klientský tajný klíč, ID klienta a ID tenanta pro registraci aplikace Microsoft Entra. Tyto proměnné prostředí používá DefaultAzureCredential k autentizaci aplikace. Výsledkem úspěšného ověřování Microsoft Entra je zabezpečený tokenový přihlašovací údaj, který je předán do metody připojení IoT Hubu.

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();

Výsledný tokenCredential se pak dá předat metodě připojení ke službě IoT Hub pro libovolného klienta sady SDK, který přijímá přihlašovací údaje Microsoft Entra:

V tomto příkladu se TokenCredential předává do ServiceClient.Create k vytvoření objektu připojení ServiceClient.

string hostname = "xxxxxxxxxx.azure-devices.net";
using var serviceClient = ServiceClient.Create(hostname, tokenCredential, TransportType.Amqp);

V tomto příkladu se TokenCredential předává do RegistryManager.Create, aby se vytvořil objekt RegistryManager.

string hostname = "xxxxxxxxxx.azure-devices.net";
registryManager = RegistryManager.Create(hostname, tokenCredential);
Ukázka kódu

Pro pracovní příklad ověřování služby Microsoft Entra se podívejte na Ukázku ověřování založeného na rolích.

Sestavení a odeslání zprávy

Pomocí send_c2d_message odešlete do zařízení zprávu přes cloud (IoT Hub).

send_c2d_message používá tyto parametry:

  • deviceID – Textový identifikátor cílového zařízení.
  • message – Zpráva z cloudu do zařízení. Zpráva je typu str (řetězec).
  • properties - Volitelná kolekce vlastností typu dict. Vlastnosti mohou obsahovat vlastnosti aplikace a systémové vlastnosti. Výchozí hodnota je {}.

Tento příklad odešle testovací zprávu cílovému zařízení.

# define the device ID
deviceID = "Device-1"

# define the message
message = "{\"c2d test message\"}"

# include optional properties
props={}
props.update(messageId = "message1")
props.update(prop1 = "test property-1")
props.update(prop1 = "test property-2")
prop_text = "Test message"
props.update(testProperty = prop_text)

# send the message through the cloud (IoT Hub) to the device
registry_manager.send_c2d_message(deviceID, message, properties=props)

Ukázková zpráva pro odeslání prostřednictvím SDK

Sada Azure IoT SDK pro Python poskytuje funkční ukázku aplikační služby, která ukazuje, jak odesílat zprávu z cloudu do zařízení. Další informace najdete v tématu send_message.py, který ukazuje, jak odeslat zprávu z cloudu na zařízení.

Vytvoření aplikace zařízení

Tato část popisuje, jak přijímat zprávy z cloudu do zařízení pomocí balíčku azure-iot-device v sadě Azure IoT SDK pro Node.js.

Aby aplikace zařízení založená na Node.js mohla přijímat zprávy typu cloud-zařízení, musí se připojit k IoT Hubu a poté nastavit posluchače zpětného volání a zpracovatele zpráv pro zpracování příchozích zpráv z IoT Hubu. Aplikace zařízení by také měla být schopná rozpoznat a zpracovat odpojení, když je přerušeno připojení zpráv z zařízení do IoT Hub.

Nainstalovat balíčky SDK

Balíček azure-iot-device obsahuje objekty, které tvoří rozhraní pro zařízení IoT. Spuštěním tohoto příkazu nainstalujte sadu SDK zařízení azure-iot-device na vývojový počítač:

npm install azure-iot-device --save

Připojení zařízení ke službě IoT Hub

Aplikace zařízení se může ověřit ve službě IoT Hub pomocí následujících metod:

  • Certifikát X.509
  • Sdílený přístupový klíč

Důležité

Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení pro zabezpečení připojení řešení > IoT.

Ověřování pomocí certifikátu X.509

Certifikát X.509 je připojen k přenosu spojení mezi zařízením a IoT Hubem.

Konfigurace připojení typu device-to-IoT Hub pomocí certifikátu X.509:

  1. Voláním zFromConnectionString přidejte připojovací řetězec zařízení nebo modulu identity a typ přenosu do objektu Client. Přidejte x509=true do připojovacího řetězce, abyste označili, že je k DeviceClientOptions přidán certifikát. Příklad:

    • Řetězec připojení zařízení:

      HostName=xxxxx.azure-devices.net;DeviceId=Device-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true

    • Připojovací řetězec modulu identity:

      HostName=xxxxx.azure-devices.net;DeviceId=Device-1;ModuleId=Module-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true

  2. Nakonfigurujte proměnnou JSON s podrobnostmi o certifikátu a předejte ji do DeviceClientOptions.

  3. Vyvolejte setOptions pro přidání certifikátu a klíče X.509 (a volitelně i přístupové heslo) do klientského přenosu.

  4. Voláním otevřete připojení ze zařízení ke službě IoT Hub.

Tento příklad ukazuje informace o konfiguraci certifikátu v rámci proměnné JSON. Konfigurace certifikace clientOptions se předává setOptions a připojení se otevře pomocí 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);

Další informace o ověřování certifikátů najdete tady:

Ukázka kódu

Vzorek ověřování certifikátu X.509 zařízení najdete v tématu Jednoduchá ukázka zařízení X.509.

Ověřování pomocí sdíleného přístupového klíče

Volba přenosového protokolu

Objekt Client podporuje tyto protokoly:

  • Amqp
  • Http– Při použití HttpClient instance kontroluje zprávy ze služby IoT Hub zřídka (minimálně každých 25 minut).
  • Mqtt
  • MqttWs
  • AmqpWs

Nainstalujte na svůj vývojový počítač potřebné přenosové protokoly.

Tento příkaz například nainstaluje Amqp protokol:

npm install azure-iot-device-amqp --save

Další informace o rozdílech mezi podporou MQTT, AMQP a HTTPS najdete v pokynech ke komunikaci typu Cloud-zařízení a volba komunikačního protokolu.

Tento příklad přiřadí protokol AMQP proměnné Protocol . Tato proměnná Protokolu se předává Client.fromConnectionString metodě v části Přidání připojovacího řetězce tohoto článku.

const Protocol = require('azure-iot-device-mqtt').Amqp;
Možnosti dokončování, zamítnutí a opuštění zpráv

V závislosti na zvoleném protokolu je možné použít metody dokončování zpráv, zamítnutí a opuštění.

AMQP a HTTP

Přenosy AMQP a HTTP můžou zprávu dokončit, odmítnout nebo opustit:

  • Dokončeno – K dokončení zprávy je služba, která odeslala zprávu typu cloud-zařízení, upozorněna na přijetí zprávy. IoT Hub odebere zprávu z fronty zpráv. Metoda má formu client.complete(message, callback function).
  • Odmítnout – Pokud je zpráva odmítnuta, služba, která odeslala zprávu z cloudu k zařízení, je upozorněna, že zařízení zprávu nezpracovalo. IoT Hub trvale odebere zprávu z fronty zařízení. Metoda má formu client.reject(message, callback function).
  • Opuštění – Pokud chcete zprávu opustit, IoT Hub se ji okamžitě pokusí znovu odeslat. IoT Hub uchovává zprávu ve frontě zařízení pro budoucí použití. Metoda má formu client.abandon(message, callback function).
MQTT

MQTT nepodporuje funkce dokončení, odmítnutí nebo opuštění zprávy. Místo toho MQTT přijme ve výchozím nastavení zprávu a zpráva se odebere z fronty zpráv ioT Hubu.

Opakované pokusy o doručení

Pokud se stane něco, co brání zařízení v dokončení, opuštění nebo odmítnutí zprávy, IoT Hub zařadí zprávu znovu do fronty po uplynutí časového limitu. Z tohoto důvodu musí být logika zpracování zpráv v aplikaci zařízení idempotentní, takže přijetí stejné zprávy několikrát způsobí stejný výsledek.

Vytvoření objektu klienta

Vytvořte Client objekt pomocí nainstalovaného balíčku.

Příklad:

const Client = require('azure-iot-device').Client;
Vytvoření objektu protokolu

Vytvořte Protocol objekt pomocí nainstalovaného přenosového balíčku.

Tento příklad přiřadí protokol AMQP:

const Protocol = require('azure-iot-device-amqp').Amqp;
Přidejte připojovací řetězec zařízení a přenosový protokol.

Zavolejte fromConnectionString pro poskytnutí parametrů připojení zařízení:

  • connStr - připojovací řetězec zařízení.
  • transportCtor - transportní protokol.

V tomto příkladu se používá přenosový Amqp protokol:

const deviceConnectionString = "{IoT hub device connection string}"
const Protocol = require('azure-iot-device-mqtt').Amqp;
let client = Client.fromConnectionString(deviceConnectionString, Protocol);

Vytvořte obslužnou rutinu pro příchozí zprávy

Zpracovatel zpráv je volán pro každou příchozí zprávu.

Po úspěšném přijetí zprávy, pokud používáte přenos AMQP nebo HTTP, zavolejte metodu client.complete , která informuje IoT Hub, že zprávu lze odebrat z fronty zpráv.

Tato obslužná rutina zprávy například vypíše ID zprávy a text zprávy na konzoli, a potom zavolá client.complete, aby IoT Hub oznámil, že zpráva byla zpracována a lze ji bezpečně odstranit z fronty zařízení. Volání complete není vyžadováno, pokud používáte přenos MQTT a je možné ho vynechat. Vyžaduje se volánícomplete pro přenos protokolu AMQP nebo HTTPS.

function messageHandler(msg) {
  console.log('Id: ' + msg.messageId + ' Body: ' + msg.data);
  client.complete(msg, printResultFor('completed'));
}

Vytvoření obslužné rutiny odpojení připojení

Obslužná rutina odpojení se aktivuje, když dojde k odpojení. Obslužná rutina odpojení je užitečná pro implementaci kódu pro opětovné připojení.

Tento příklad zachytí a zobrazí chybovou zprávu odpojení na konzoli.

function disconnectHandler() {
  clearInterval(sendInterval);
  sendInterval = null;
  client.open().catch((err) => {
    console.error(err.message);
  });
}

Přidání naslouchacích událostí

Tyto posluchače událostí můžete zadat pomocí metody .on.

  • Obsluha připojení
  • Zpracovatel chyb
  • Obslužná rutina odpojení
  • Obsluha zpráv

Tento příklad zahrnuje obslužné rutiny zpráv a odpojení definované dříve.

client.on('connect', connectHandler);
client.on('error', errorHandler);
client.on('disconnect', disconnectHandler);
client.on('message', messageHandler);

Otevření připojení ke službě IoT Hub

Pomocí otevřené metody otevřete připojení mezi zařízením IoT a IoT Hubem. Použijte .catch(err) k zachycení chyby a zavolání kódu obslužné rutiny.

Příklad:

client.open()
.catch((err) => {
  console.error('Could not connect: ' + err.message);
});

Ukázky zařízení sady SDK

Sada Azure IoT SDK pro Node.js poskytuje funkční ukázku aplikace zařízení, která zpracovává příjem zpráv. Další informace naleznete v tématu:

simple_sample_device – zařízení aplikace, která se připojuje k vašemu IoT centru a přijímá zprávy z cloudu do zařízení.

Vytvoření back-endové aplikace

Tato část popisuje, jak odeslat zprávu z cloudu na zařízení. Jak je popsáno dříve, back-endová aplikace řešení se připojuje ke službě IoT Hub a zprávy se odesílají do IoT Hubu kódovaného pomocí cílového zařízení. IoT Hub ukládá příchozí zprávy do fronty zpráv a zprávy se doručují z fronty zpráv IoT Hubu do cílového zařízení.

Back-endová aplikace řešení může také požadovat a přijímat zpětnou vazbu k doručení zprávy odeslané do služby IoT Hub, která je určená pro doručování zařízení prostřednictvím fronty zpráv.

Nainstalujte balíček služby SDK

Balíček azure-iothub obsahuje objekty, které jsou rozhraní se službou IoT Hub. Tento článek popisuje Client kód třídy, který odesílá zprávu z aplikace do zařízení prostřednictvím IoT Hubu.

Spuštěním tohoto příkazu nainstalujte azure-iothub na vývojový počítač:

npm install azure-iothub --save

Načtení modulů klienta a zpráv

Deklarujte Client objekt pomocí Client třídy z azure-iothub balíčku.

Deklarujte Message objekt pomocí Message třídy z azure-iot-common balíčku.

'use strict';
var Client = require('azure-iothub').Client;
var Message = require('azure-iot-common').Message;

Připojení ke službě IoT Hub

Back-endovou službu můžete ke službě IoT Hub připojit pomocí následujících metod:

  • Zásady sdíleného přístupu
  • Microsoft Entra

Důležité

Tento článek obsahuje postup připojení ke službě pomocí sdíleného přístupového podpisu. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování ve službě pomocí MICROSOFT Entra ID nebo spravovaných identit je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy zabezpečení zabezpečení řešení > IoT v cloudu.

Připojení pomocí zásad sdíleného přístupu

Použijte fromConnectionString pro připojení ke službě IoT Hub.

V tomto příkladu se objekt serviceClient vytvoří s přenosovým typem Amqp.

var connectionString = '{IoT hub device connection string}';
var serviceClient = Client.fromConnectionString(connectionString,`Amqp`);
Otevřete připojení klienta

Voláním Clientotevřené metody otevřete připojení mezi aplikací a IoT Hubem.

open lze volat s nebo bez určení funkce zpětného volání, která je vyvolána po dokončení operace open.

V tomto příkladu metoda open obsahuje volitelnou err funkci zpětného volání otevřeného připojení. Pokud dojde k otevřené chybě, vrátí se objekt chyby. Pokud je otevřené připojení úspěšné, vrátí se hodnota zpětného null volání.

serviceClient.open(function (err)
if (err)
  console.error('Could not connect: ' + err.message);

Připojení pomocí Microsoft Entra

Back-endová aplikace, která používá Microsoft Entra, se musí před připojením ke službě IoT Hub úspěšně ověřit a získat přihlašovací údaje tokenu zabezpečení. Tento token se předá metodě pro připojení k IoT Hubu. Obecné informace o nastavení a používání Microsoft Entra pro IoT Hub naleznete v tématu Řízení přístupu ke službě IoT Hub pomocí Microsoft Entra ID.

Přehled ověřování Node.js SDK najdete v těchto tématech:

Konfigurace aplikace Microsoft Entra

Musíte nastavit aplikaci Microsoft Entra, která je nakonfigurovaná pro vaše upřednostňované přihlašovací údaje ověřování. Aplikace obsahuje parametry, jako je tajný klíč klienta, který používá back-endová aplikace k ověření. Dostupné konfigurace ověřování aplikací:

  • Klientské tajemství
  • Certifikát
  • Údaje o federované identitě

Aplikace Microsoft Entra mohou v závislosti na provedených operacích vyžadovat určitá oprávnění role. K povolení přístupu ke čtení a zápisu k zařízení a modulovým dvojčatům služby IoT Hub je například vyžadován IoT Hub Twin Contributor. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení rolí Azure RBAC.

Další informace o nastavení aplikace Microsoft Entra najdete v tématu Rychlý start: Registrace aplikace na platformě Microsoft Identity Platform.

Ověřování pomocí DefaultAzureCredential

Nejjednodušší způsob, jak použít Microsoft Entra k ověření back-endové aplikace, je použít DefaultAzureCredential, ale v produkčním prostředí se doporučuje zvolit jinou metodu, včetně konkrétního TokenCredential nebo zjednodušeného ChainedTokenCredential. Pro zjednodušení popisuje tato část ověřování pomocí DefaultAzureCredential a tajný klíč klienta. Další informace o výhodách a nevýhodách použití DefaultAzureCredentialnajdete v řetězcích přihlašovacích údajů v klientské knihovně Azure Identity pro JavaScript.

DefaultAzureCredential podporuje různé mechanismy ověřování a určuje odpovídající typ přihlašovacích údajů na základě prostředí, ve které se provádí. Pokusí se použít více typů přihlašovacích údajů v pořadí, dokud nenajde funkční přihlašovací údaje.

Microsoft Entra vyžaduje tento balíček:

npm install --save @azure/identity

V tomto příkladu byly do proměnných prostředí přidány klientské tajemství, ID klienta a ID tenanta pro registraci aplikace Microsoft Entra. Tyto proměnné prostředí používá DefaultAzureCredential k autentizaci aplikace. Výsledkem úspěšného ověřování Microsoft Entra je zabezpečený tokenový přihlašovací údaj, který je předán do metody připojení IoT Hubu.

import { DefaultAzureCredential } from "@azure/identity";

// Azure SDK clients accept the credential as a parameter
const credential = new DefaultAzureCredential();

Výsledný token přihlašovacích údajů může být následně předán funkci fromTokenCredential, aby se připojil k IoT Hub pro libovolného klienta sady SDK, který akceptuje přihlašovací údaje Microsoft Entra:

fromTokenCredential vyžaduje dva parametry:

  • Adresa URL služby Azure – Adresa URL služby Azure by měla být ve formátu {Your Entra domain URL}.azure-devices.net bez předpony https:// . Například MyAzureDomain.azure-devices.net.
  • Token přihlašovacích údajů Azure

V tomto příkladu se přihlašovací údaje Azure získávají pomocí DefaultAzureCredential. Adresa URL domény Azure a přihlašovací údaje se pak zadají do Registry.fromTokenCredential, aby se vytvořilo připojení ke službě 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);
Ukázky kódu

Pracovní ukázky ověřování služby Microsoft Entra najdete v příkladech identit Azure.

Vytvoření zprávy

Objekt zprávy obsahuje asynchronní zprávu z cloudu do zařízení. Funkce zpráv funguje stejně jako funkce AMQP, MQTT a HTTP.

Objekt zprávy podporuje několik vlastností, včetně těchto vlastností. Podívejte se na vlastnosti zprávy pro úplný seznam.

  • ack - Zpětná vazba k doručení. Popsáno v další části.
  • properties – Mapa obsahující řetězcové klíče a hodnoty pro ukládání vlastních vlastností zprávy.
  • messageId – používá se ke korelaci obousměrné komunikace.

Po vytvoření instance objektu zprávy přidejte text zprávy. V tomto příkladu je přidána zpráva 'Cloud to device message.'.

var message = new Message('Cloud to device message.');
message.ack = 'full';
message.messageId = "My Message ID";

Potvrzení doručení

Odesílající program může požadovat potvrzení o doručení (nebo vypršení platnosti) ze služby IoT Hub pro každou zprávu typu cloud-zařízení. Tato možnost umožňuje odesílajícímu programu používat logiku informování, opakování nebo kompenzace. Úplný popis operací a vlastností zpětné vazby na zprávu je popsán v Zpětná vazba na zprávu.

Každá zpráva, která má přijímat zpětnou vazbu, musí obsahovat hodnotu pro vlastnost potvrzení doručení ack. Vlastnost ack může být jedna z těchto hodnot:

  • none (výchozí): Nevygeneruje se žádná zpráva zpětné vazby.

  • sent: Pokud byla zpráva dokončena, obdržíte zprávu s zpětnou vazbou.

  • : Obdržíte zpětnou zprávu, pokud platnost zprávy vypršela (nebo byl dosažen maximální počet doručení) bez dokončení zprávy zařízením.

  • full: Zpětná vazba pro odeslané i neodesílané výsledky.

V tomto příkladu je vlastnost ack nastavena na full, aby požadovala zpětnou vazbu o doručení jak odeslaných, tak neodeslaných zpráv pro jednotlivou zprávu.

message.ack = 'full';

Funkce zpětného volání příjemce zpětné vazby zprávy je propojena s Client použitím getFeedbackReceiver.

Příjemce zpětné vazby zprávy obdrží dva argumenty:

  • Objekt chyby (může mít hodnotu null)
  • AmqpReceiver – Generuje události, když klient obdrží nové zprávy zpětné vazby.

Tato ukázková funkce obdrží a vytiskne zprávu o doručení zpětné vazby do konzoly.

function receiveFeedback(err, receiver){
  receiver.on('message', function (msg) {
    console.log('Feedback message:')
    console.log(msg.getData().toString('utf-8'));
  });
}

Tento kód propojí funkci zpětného receiveFeedback volání s objektem služby Client pomocí getFeedbackReceiver.

serviceClient.getFeedbackReceiver(receiveFeedback);

Definujte obslužnou rutinu pro zpracování výsledků dokončení zprávy

Funkce zpětného volání při dokončení odesílání zprávy se volá po odeslání každé zprávy.

Tato ukázková funkce vytiskne výsledky operace zpráv send do konzoly. V tomto příkladu je funkce printResultFor zadána jako parametr pro funkci send, která je popsaná v další části.

function printResultFor(op) {
  return function printResult(err, res) {
    if (err) console.log(op + ' error: ' + err.toString());
    if (res) console.log(op + ' status: ' + res.constructor.name);
  };
}

Odeslání zprávy

Pomocí funkce send odešlete asynchronní zprávu z cloudu do zařízení do aplikace v zařízení prostřednictvím IoT Hub.

send podporuje tyto parametry:

  • deviceID – ID zařízení cílového zařízení.
  • message – text zprávy, která se má odeslat do zařízení.
  • done – volitelná funkce, která se má volat při dokončení operace. Funkce "Done" je volána s dvěma argumenty:
    • Objekt chyby (může mít hodnotu null).
    • Objekt odpovědi specifický pro přenos, který je užitečný pro protokolování nebo ladění.

Tento kód volá send, aby odeslal zprávu z cloudu do zařízení do aplikace zařízení prostřednictvím IoT Hubu. Funkce printResultFor zpětného volání definovaná v předchozí části obdrží informace o potvrzení doručení.

var targetDevice = '{device ID}';
serviceClient.send(targetDevice, message, printResultFor('send'));

Tento příklad ukazuje, jak odeslat zprávu do zařízení a zpracovat tuto zprávu zpětné vazby, když zařízení potvrdí zprávu z cloudu do zařízení.

serviceClient.open(function (err) {
  if (err) {
    console.error('Could not connect: ' + err.message);
  } else {
    console.log('Service client connected');
    serviceClient.getFeedbackReceiver(receiveFeedback);
    var message = new Message('Cloud to device message.');
    message.ack = 'full';
    message.messageId = "My Message ID";
    console.log('Sending message: ' + message.getData());
    serviceClient.send(targetDevice, message, printResultFor('send'));
  }
});

Ukázková zpráva pro odeslání prostřednictvím SDK

Sada Azure IoT SDK pro Node.js poskytuje funkční ukázky aplikace služby, která zpracovává úlohy odesílání zpráv. Další informace naleznete v tématu:

send_c2d_message.js – Odesílání zpráv C2D do zařízení prostřednictvím IoT Hubu

Zásady opětovného připojení

Tento článek neuvádí zásadu opakování zpráv pro zařízení pro připojení ke službě IoT Hub nebo externí aplikaci pro připojení ke službě IoT Hub. V produkčním kódu byste měli implementovat zásady opakování připojení, jak je popsáno v části Správa opětovného připojení zařízení, abyste vytvořili odolné aplikace.

Doba uchovávání zpráv, pokusy o opakování a maximální počet doručení

Jak je popsáno v tématu Odesílání zpráv typu cloud-zařízení ze služby IoT Hub, můžete zobrazit a nakonfigurovat výchozí hodnoty pro následující hodnoty zpráv pomocí možností konfigurace služby IoT Hub na portálu nebo Azure CLI. Tyto možnosti konfigurace můžou ovlivnit doručování zpráv a zpětnou vazbu.

  • Výchozí hodnota TTL (doba trvání) – doba, po kterou je zpráva dostupná pro zařízení, aby ji spotřebovalo, než služba IoT Hub vypršela.
  • Doba uchovávání zpětné vazby – doba, po kterou služba IoT Hub uchovává zpětnou vazbu k vypršení platnosti nebo doručování zpráv z cloudu do zařízení.
  • Počet pokusů, kolikrát se IoT Hub snaží doručit zprávu z cloudu do zařízení.