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í:

  • Aplikace zařízení, které přijímají a zpracovávají zprávy typu cloud-zařízení z fronty zasílání zpráv ioT Hubu.

  • Back-endové aplikace, které odesílají zprávy typu cloud-zařízení do jednoho zařízení prostřednictvím fronty zasílání 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 Služby IoT Hub úrovně Basic a Standard/Free najdete v tématu Volba správné úrovně IoT Hubu pro vaše řešení.

Přehled

Aby aplikace zařízení přijímala zprávy typu cloud-zařízení, musí se připojit ke službě IoT Hub a pak nastavit obslužnou rutinu 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čtení zpráv 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říjem zpětné vazby k 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 typu cloud-zařízení, je důležité pochopit některé základní informace o tom, jak fungují fronty zpráv zařízení ioT Hubu.

Zprávy typu cloud-zařízení odeslané z back-endové aplikace řešení do zařízení IoT se směrují přes IoT Hub. Mezi back-endovou aplikací řešení a cílovým zařízením neexistuje žádná přímá komunikace mezi dvěma účastníky. 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-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 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 říká, že má zprávu dokončit . 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ých zpráv. Zařízení, která se připojují přes protokol MQTT (Message Queuing Telemetry Transport), nemůžou odmítnout zprávy typu cloud-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 opustit zprávy typu cloud-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 typu cloud-zařízení.

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

  • Zpětné volání: Aplikace zařízení nastaví asynchronní metodu obslužné rutiny zpráv, která se volá 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čky). Smyčka se provádí nepřetržitě a kontroluje zprávy.

Požadovaný balíček NuGet 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 Zabezpečení osvědčených postupů > zabezpečení připojení.

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 parametry připojení.

Pomocí metody CreateFromConnectionString zadejte primární připojovací řetězec a ID DeviceClient zařízení služby IoT Hub. Kromě požadované primární připojovací řetězec IoT Hubu CreateFromConnectionString je možné tuto metodu přetížit, aby zahrnovala tyto volitelné 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, přečtěte si téma TransportType – výčet.
  • transportSettings - Rozhraní sloužící k definování různých nastavení specifických pro přenos a DeviceClient ModuleClient. Další informace naleznete v tématu ITransportSettings Rozhraní.
  • 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 ( 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 auth DeviceAuthenticationWithX509Certificate , 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ě. Slouží Environment.GetEnvironmentVariable("HOSTNAME") například ke čtení proměnné prostředí názvu 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, pak se přijme 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 SADY SDK by se přesto potřebovaly dotazovat na přijaté zprávy, což porazí 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.");

cyklické dotazování

Při dotazování se kontroluje zprávy pomocí funkce ReceiveAsync .

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

  • ReceiveAsync() – Než budete pokračovat, počkejte na výchozí časový limit zprávy.
  • ReceiveAsync (Timespan) – Obdrží zprávu z fronty zařízení pomocí určitého časového limitu.
  • ReceiveAsync (CancellationToken) – Přijme zprávu 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 vrátí metoda okamžitě. Podporovaný vzor zpráv typu cloud-zařízení s protokolem HTTP 1 je přerušovaně připojených zařízení, která kontrolují zprávy zřídka (minimálně každých 25 minut). Při vydávání dalších protokolů HTTP 1 dochází k omezování požadavků ve službě IoT Hub. 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 opustíte voláním AbandonAsync. Výsledkem je zachování zprávy ve frontě zařízení pro budoucí spotřebu ve službě IoT Hub.
  • 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 dotazová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, null vrátí se hodnota a smyčka bude pokračovat.

Při přijetí zprávy se vrátí objekt Task, který by měl být předán completeAsync.ReceiveAsync Volání, které CompleteAsync službě IoT Hub oznámí odstranění zadané zprávy 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í příjmu zpráv

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 zprávy příjmu sady 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í balíčku NuGet služby

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í cloudu.

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

Zadejte připojovací řetězec

Připojte back-endovou aplikaci k zařízení pomocí createFromConnectionString. Kromě požadované primární připojovací řetězec IoT Hubu CreateFromConnectionString je možné tuto metodu přetížit, aby zahrnovala tyto volitelné 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í služby IoT Hub připojovací řetězec 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ě připojení 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í:

  • Tajný klíč klienta
  • Certifikát
  • Přihlašovací údaje federované identity

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 dvojčatům modulů služby IoT Hub je například potřeba přispěvatel dvojčete služby IoT Hub. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení role 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 doporučuje se použít jinou metodu v produkčním prostředí, včetně konkrétní TokenCredential nebo pared-down 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 se do proměnných prostředí přidá tajný klíč klienta registrace aplikace Microsoft Entra, ID klienta a ID tenanta. Tyto proměnné prostředí se používají DefaultAzureCredential k ověření aplikace. Výsledkem úspěšného ověřování Microsoft Entra je přihlašovací údaje tokenu zabezpečení předávané metodě 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 TokenCredential se předá objekt ServiceClient.Create připojení ServiceClient 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 TokenCredential se předá k RegistryManager.Create vytvoření objektu RegistryManager .

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

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

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 – Identifikátor řetězce cílového zařízení.
  • message – Zpráva typu cloud-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říjem zpětné vazby k 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 zpráv jsou popsány v části Váš názor na zprávu.

Příjem zpětné vazby k 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

Volání GetFeedbackReceiver vytvořit FeedbackReceiver objektu. 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 k 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: Pokud vypršela platnost zprávy (nebo byl dosažen maximální počet doručení), aniž by zařízení dokončilo zprávu.

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

V tomto příkladu Ack je vlastnost nastavena na Full, vyžaduje pozitivní i negativní zpětnou vazbu k doručení jedné zprávy.

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 zavolejte ReceiveAsync opakovaně a kontrolujte zprávy zpětné vazby k doručení. Každé volání, které ReceiveAsync počká na dobu časového limitu definované pro ServiceClient objekt.

  • ReceiveAsync Pokud vyprší časový limit bez přijetí zprávy, ReceiveAsync vrátí se null a smyčka bude pokračovat.
  • Pokud se přijme zpráva zpětné vazby, vrátí ReceiveAsync se objekt Task, který by se měl předat CompleteAsync spolu s tokenem zrušení. Volání, které CompleteAsync odstraní zadanou odeslanou zprávu z fronty zpráv na základě parametru Task .
  • V případě potřeby může přijmout kód volat AbandonAsync , aby odeslal 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 timout 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);
      }
   }

Všimněte si, že tento vzor příjmu zpětné vazby je podobný vzoru používanému k přijímání zpráv typu cloud-zařízení v aplikaci 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 překročení kvóty, monitorování nebo úpravu frekvence odesílání požadavků nebo aktualizaci jednotky š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ázka zprávy pro odeslání sady 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 typu cloud-zařízení pomocí třídy DeviceClient ze sady Azure IoT SDK pro Javu.

Aby aplikace zařízení založená na Javě přijímala zprávy typu cloud-zařízení, musí se připojit ke službě IoT Hub a pak nastavit naslouchací proces zpětného volání a obslužnou rutinu zpráv pro 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 Zabezpečení osvědčených postupů > zabezpečení připojení.

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. Pomocí informací zavolejte DeviceClient ClientOptions a vytvořte připojení typu device-to-IoT Hub.

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ě. Slouží Environment.GetEnvironmentVariable("PUBLICKEY") například ke čtení proměnné prostředí řetězce 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

Pomocí setMessageCallback metoda definovat metodu obslužné rutiny zprávy, která je upozorně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 callback je setMessageCallbackpředána metoda s názvem MessageCallback bez parametru kontextu .

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

Vytvoření obslužné rutiny zpětného volání zprávy

Obslužná rutina zprávy zpětného volání 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 odebere 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řipojení ke zprávě mimo provoz a pokusit 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 předá ConnectionStatusChangeContext objekt.

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 části s ukázkou zprávy v tomto článku o úplné ukázce, která ukazuje, jak extrahovat stav změny stavu změny stavu připojení metody zpětného volání, důvod, proč se stav zařízení změnil, 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 zprávy příjmu sady SDK

HandleMessages: ukázková aplikace zařízení, která je součástí sady Microsoft Azure IoT SDK pro Javu, která se připojuje k centru IoT a přijímá zprávy typu cloud-zařízení.

Vytvoření back-endové aplikace

Tato část popisuje, jak odeslat zprávu typu cloud-zařízení pomocí 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řidání příkazu 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řidání příkazů 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í 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 výčt.

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

Vytvořte objekt ServiceClient a zadejte připojovací řetězec a protokol iot Hubu.

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ě připojení 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í v sadě Java SDK najdete v tématu Ověřování Azure s využitím Javy a identity Azure.

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í:

  • Tajný klíč klienta
  • Certifikát
  • Přihlašovací údaje federované identity

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 dvojčatům modulů služby IoT Hub je například potřeba přispěvatel dvojčete služby IoT Hub. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení role 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 doporučuje se použít jinou metodu v produkčním prostředí, včetně konkrétní TokenCredential nebo pared-down 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 id tenanta tajného klíče klienta, ID klienta a hodnoty tajných kódů klienta, jako jsou proměnné prostředí. Po vytvoření ho TokenCredential předejte ServiceClient nebo jinému tvůrci jako parametr credential.

V tomto příkladu DefaultAzureCredentialBuilder se pokusí ověřit připojení ze seznamu popsaného v části DefaultAzureCredential. Výsledkem úspěšného ověřování Microsoft Entra je přihlašovací údaje tokenu zabezpečení předávané konstruktoru, jako je 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 do proměnných prostředí přidány hodnoty klienta registrace aplikace Microsoft Entra, ID klienta a ID tenanta. Tyto proměnné prostředí se používají ClientSecretCredentialBuilder 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ření příjemce zpětné vazby pro odeslání zprávy

Pomocí feedbackReceiveru FeedbackReceiver můžete do ioT Hubu odeslat zpětnou vazbu do služby IoT Hub. A FeedbackReceiver je specializovaný přijímač, jehož Receive metoda vrací FeedbackBatch místo Message.

V tomto příkladu FeedbackReceiver se objekt vytvoří a zavolá se 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 Typu cloud-zařízení.

Pomocí setDeliveryAcknowledgement můžete požadovat doručení nebo nedoručení do fronty zpráv ioT Hubu. V tomto příkladu je Fullžádost o potvrzení doručena nebo nedoručována.

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 s hodnotou časového limitu nebo bez této zprávy. 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 volání getEnqueuedTimeUtc, tisk zprávy vyčtený čas.

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

Ukázky zpráv odesílané 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 typu cloud-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 Zabezpečení osvědčených postupů > zabezpečení připojení.

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. Voláním připojení připojte 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. Volání připojení 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ě. Slouží os.getenv("HOSTNAME") například ke čtení proměnné prostředí názvu 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čí 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 IoTHubDeviceClient připojení se řídí connection_retry a connection_retry_interval parametry.

Vytvoření obslužné rutiny zprávy

Vytvořte funkci obslužné rutiny zprávy pro zpracování příchozích zpráv do zařízení. To se přiřadí on_message_received (další krok) jako obslužná rutina zprávy zpětného volání.

V tomto příkladu message_handler je volána při přijetí zprávy. Vlastnosti zprávy (.items) se vytisknou do konzoly 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řazení obslužné rutiny zprávy

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

V tomto příkladu je k objektu IoTHubDeviceClient client připojena metoda message_handler obslužné rutiny zprávy. Objekt client čeká na přijetí zprávy typu cloud-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 zprávy příjmu sady SDK

Přijmout zprávu – příjem zpráv typu cloud-zařízení (C2D) odesílaných ze služby Azure IoT Hub do zařízení

Vytvoření back-endové aplikace

Tato část popisuje, jak odeslat zprávu typu cloud-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

Import objektu 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í 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ě připojení 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í:

  • Tajný klíč klienta
  • Certifikát
  • Přihlašovací údaje federované identity

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 dvojčatům modulů služby IoT Hub je například potřeba přispěvatel dvojčete služby IoT Hub. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení role 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 doporučuje se použít jinou metodu v produkčním prostředí, včetně konkrétní TokenCredential nebo pared-down 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 se do proměnných prostředí přidá tajný klíč klienta registrace aplikace Microsoft Entra, ID klienta a ID tenanta. Tyto proměnné prostředí se používají DefaultAzureCredential k ověření aplikace. Výsledkem úspěšného ověřování Microsoft Entra je přihlašovací údaje tokenu zabezpečení předávané metodě 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 TokenCredential se předá objekt ServiceClient.Create připojení ServiceClient 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 TokenCredential se předá k RegistryManager.Create vytvoření objektu RegistryManager .

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

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

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 – Identifikátor řetězce cílového zařízení.
  • message – Zpráva typu cloud-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ázka zprávy pro odeslání sady SDK

Sada Azure IoT SDK pro Python poskytuje funkční ukázku aplikace služby, která ukazuje, jak odeslat zprávu typu cloud-zařízení. Další informace najdete v tématu send_message.py ukazuje, jak odeslat zprávu typu cloud-zařízení.

Vytvoření aplikace zařízení

Tato část popisuje, jak přijímat zprávy typu cloud-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 přijímala zprávy typu cloud-zařízení, musí se připojit ke službě IoT Hub a pak nastavit naslouchací proces zpětného volání a obslužnou rutinu zpráv pro zpracování příchozích zpráv ze služby IoT Hub. Aplikace zařízení by také měla být schopná rozpoznat a zpracovat odpojení v případě, že dojde k přerušení připojení zpráv typu zařízení-ioT Hub.

Instalace balíčků SADY SDK

Balíček zařízení azure-iot-device obsahuje objekty, které jsou rozhraní se zařízeními 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 Zabezpečení osvědčených postupů > zabezpečení připojení.

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

Certifikát X.509 je připojený k přenosu připojení typu device-to-IoT Hub.

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

  1. Voláním zConnectionString přidejte typ připojovací řetězec a přenosu zařízení. Přidejte x509=true do zařízení připojovací řetězec označující, že se do DeviceClientOptionszařízení přidá certifikát . Například: HostName=xxxxx.azure-devices.net;DeviceId=Device-1;SharedAccessKey=xxxxxxxxxxxxx;x509=true.
  2. Nakonfigurujte proměnnou JSON s podrobnostmi o certifikátu a předejte ji do DeviceClientOptions.
  3. Volání setOptions pro přidání certifikátu a klíče X.509 (a volitelně i přístupového hesla) do přenosu klienta.
  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 options certifikace se předá setOptions a připojení se otevře pomocí open.

var options = {
   cert: myX509Certificate,
   key: myX509Key,
   passphrase: passphrase,
   http: {
     receivePolicy: {
       interval: 10
     }
   }
 }
 client.setOptions(options, callback);
 client.open(connectCallback);

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

Ukázka kódu

Funkční ukázka ověřování certifikátu X.509 zařízení najdete v tématu Jednoduché ukázkové 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í řetězec 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 chcete odmítnout zprávu, služba, která odeslala zprávu typu cloud-zařízení, je upozorněna, že zařízení zprávu nezpracová. 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í spotřebu. 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

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řidání připojovací řetězec zařízení a přenosového protokolu

Volání zConnectionString pro zadání parametrů připojení zařízení:

  • connStr - zařízení připojovací řetězec.
  • 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ření obslužné rutiny příchozí zprávy

Obslužná rutina zprávy se volá 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 vytiskne ID zprávy a text zprávy do konzoly a potom zavolá client.complete , aby ioT Hub oznámila, že zprávu zpracovala a že se dá bezpečně odebrat z fronty zařízení. Volání complete není vyžadováno, pokud používáte přenos MQTT a je možné ho vynechat. Pro přenos protokolu AMQP nebo HTTPS se vyžaduje volánícomplete .

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 volá při odpojení připojení. 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í ke konzole.

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

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

Tyto naslouchací procesy událostí můžete zadat pomocí metody .on .

  • Obslužná rutina připojení
  • Obslužná rutina chyby
  • Obslužná rutina odpojení
  • Obslužná rutina zprávy

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. Slouží .catch(err) k zachycení kódu obslužné rutiny chyby a volání.

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 – aplikace zařízení, která se připojuje k centru IoT a přijímá zprávy typu cloud-zařízení.

Vytvoření back-endové aplikace

Tato část popisuje, jak odeslat zprávu typu cloud-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.

Instalace balíčku sady SDK služby

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í 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 serviceClient se objekt vytvoří s typem Amqp přenosu.

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

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

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

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ě připojení 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í:

  • Tajný klíč klienta
  • Certifikát
  • Přihlašovací údaje federované identity

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 dvojčatům modulů služby IoT Hub je například potřeba přispěvatel dvojčete služby IoT Hub. Další informace najdete v tématu Správa přístupu ke službě IoT Hub pomocí přiřazení role 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 doporučuje se použít jinou metodu v produkčním prostředí, včetně konkrétní TokenCredential nebo pared-down 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 se do proměnných prostředí přidal tajný klíč klienta registrace aplikace Microsoft Entra, ID klienta a ID tenanta. Tyto proměnné prostředí se používají DefaultAzureCredential k ověření aplikace. Výsledkem úspěšného ověřování Microsoft Entra je přihlašovací údaje tokenu zabezpečení předávané metodě 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ů se pak dá předat zTokenCredential pro připojení ke službě IoT Hub pro libovolného klienta sady SDK, který přijímá 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í k Registry.fromTokenCredential vytvoření 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 typu cloud-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 'Cloud to device message.' se přidá zpráva.

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 zpráv jsou popsány v části Váš názor na zprávu.

Každá zpráva, která má přijímat zpětnou vazbu zprávy, musí obsahovat hodnotu pro potvrzení doručení ack vlastnost. 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.

  • : Pokud vypršela platnost zprávy (nebo byl dosažen maximální počet doručení), aniž by zařízení dokončilo zprávu.

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

V tomto příkladu ack je vlastnost nastavena na full, požadovat odeslání i neodeslanou zpětnou vazbu k doručení zprávy pro jednu 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í zpětné vazby s objektem služby Client pomocí getFeedbackReceiver.

serviceClient.getFeedbackReceiver(receiveFeedback);

Definování obslužné rutiny výsledků dokončování zpráv

Funkce zpětného volání pro odeslá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 printResultFor je funkce zadána jako parametr send funkce 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 odeslání odešlete asynchronní zprávu typu cloud-zařízení do aplikace zařízení prostřednictvím IoT Hubu.

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. Hotovo se volá se 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 odeslání zprávy typu cloud-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 zprávu zpětné vazby, když zařízení potvrdí zprávu typu cloud-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ázka zprávy pro odeslání sady 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í 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í.
  • Kolikrát se IoT Hub pokusí do zařízení doručit zprávu typu cloud-zařízení.