Felhőből eszközre irányuló üzenetek küldése IoT Hub (.NET) használatával

Azure IoT Hub egy teljes körűen felügyelt szolgáltatás, amely megbízható és biztonságos kétirányú kommunikációt tesz lehetővé több millió eszköz és egy megoldás háttérrendszere között.

Ez a cikk a következőkhöz nyújt útmutatást:

  • Felhőből eszközre (C2D) irányuló üzenetek küldése a megoldás háttérrendszeréből egyetlen eszközre a IoT Hub

  • Felhőből eszközre irányuló üzenetek fogadása egy eszközön

  • Visszajelzés kérése a megoldás háttérrendszeréből az eszközre küldött üzenetekről IoT Hub

Megjegyzés

A cikkben ismertetett funkciók csak a IoT Hub standard szintjén érhetők el. Az alapszintű és standard/ingyenes IoT Hub szintekkel kapcsolatos további információkért lásd: A megoldáshoz megfelelő IoT Hub szint kiválasztása.

A cikk végén két .NET-konzolalkalmazást fog futtatni.

  • MessageReceiveSample: a .NET-hez készült Microsoft Azure IoT SDK részét képező eszközalkalmazás, amely csatlakozik az IoT Hubhoz, és fogadja a felhőből az eszközre irányuló üzeneteket.

  • SendCloudToDevice: olyan szolgáltatásalkalmazás, amely felhőből eszközre irányuló üzenetet küld az eszközalkalmazásnak IoT Hub keresztül, majd megkapja a kézbesítési visszaigazolást.

Megjegyzés

IoT Hub számos eszközplatformhoz és nyelvhez (C, Java, Python és JavaScript) támogatja az SDK-t az Azure IoT eszközoldali SDK-kon keresztül.

A felhőből az eszközre irányuló üzenetekről további információt a D2C és a C2D Messaging with IoT Hub című témakörben talál.

Előfeltételek

  • Azure-előfizetés. Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot.

  • Egy IoT Hub az Azure-előfizetésben. Ha még nem rendelkezik központokkal, kövesse az IoT Hub létrehozása című cikk lépéseit.

  • Az IoT Hubban regisztrált eszköz. Ha még nem regisztrált eszközt, regisztráljon egyet a Azure Portal.

  • Ez a cikk a C#-hoz készült Azure IoT SDK mintakódját használja.

    • Töltse le vagy klónozza az SDK-adattárat a GitHubról a fejlesztői gépre.
    • Győződjön meg arról, hogy a .NET Core 3.0.0-s vagy újabb verziója telepítve van a fejlesztői gépen. Ellenőrizze a verziót a .NET futtatásával dotnet --version és letöltésével , ha szükséges.
  • Győződjön meg arról, hogy a 8883-as port nyitva van a tűzfalon. A cikkben szereplő eszközminta MQTT protokollt használ, amely a 8883-es porton keresztül kommunikál. Ez a port bizonyos vállalati és oktatási hálózati környezetekben blokkolható. További információkért és a probléma megoldásának módjaiért lásd: Csatlakozás IoT Hub (MQTT)-hez.

  • A Visual Studióval.

Az eszköz kapcsolati sztringjének beszerzése

Ebben a cikkben egy eszköz szimulálására szolgáló mintaalkalmazást futtat, amely a IoT Hub keresztül küldött felhőből az eszközre irányuló üzeneteket fogadja. A Microsoft Azure IoT SDK for .NET-hez mellékelt MessageReceiveSample mintaalkalmazás csatlakozik az IoT Hubhoz, és szimulált eszközként működik. A minta a regisztrált eszköz elsődleges kapcsolati sztring használja az IoT Hubon.

Az IoT Hubon regisztrált eszköz elsődleges kapcsolati sztring az alábbi lépésekkel szerezheti be:

  1. A Azure Portal válassza az Erőforráscsoportok lehetőséget. Válassza ki azt az erőforráscsoportot, ahol a központ található, majd válassza ki a központot az erőforrások listájából.

  2. Az IoT Hub bal oldali paneljén, a Eszközkezelés alatt válassza az Eszközök lehetőséget.

  3. Az eszközök listájából válassza ki a megfelelő eszközt.

  4. Másolja ki az Elsődleges kapcsolati sztring, és mentse az értéket.

    Képernyőkép az IoT Hubban regisztrált eszköz elsődleges kapcsolati sztring lekéréséről a Azure Portal.

Üzenetek fogadása az eszközalkalmazásban

Ebben a szakaszban futtassa a MessageReceiveSample mintaeszközalkalmazást az IoT Hubon keresztül küldött C2D-üzenetek fogadásához. Nyisson meg egy új parancssort, és keresse meg az azure-iot-sdk-csharp\iothub\device\samples\getting started\MessageReceiveSample mappát abban a mappában, amelyben kibontotta az Azure IoT C# SDK-t. Futtassa az alábbi parancsokat, és cserélje le a {Your device connection string} helyőrző értéket az IoT Hub regisztrált eszközéről másolt eszközre kapcsolati sztring.

dotnet restore
dotnet run --c "{Your device connection string}"

A következő kimenet a mintaeszköz-alkalmazásból származik, miután sikeresen elindult, és csatlakozott az IoT Hubhoz:

5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
     
5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.

A mintaeszközalkalmazás a ReceiveAsync és a CompleteAsync metódussal kérdezi le az üzeneteket. A ReceiveC2dMessagesPollingAndCompleteAsync metódus a metódust ReceiveAsync használja, amely aszinkron módon visszaadja a kapott üzenetet, amikor az eszköz megkapja az üzenetet. ReceiveAsyncnull értéket ad vissza egy meghatározott időtúllépési időszak után. Ebben a példában a rendszer az alapértelmezett egyperces értéket használja. Amikor az eszköz null értéket kap, továbbra is várnia kell az új üzenetekre. Ez a követelmény az oka annak, hogy a mintaalkalmazás a következő kódblokkot tartalmazza a ReceiveC2dMessagesPollingAndCompleteAsync metódusban:

   if (receivedMessage == null)
   {
      continue;
   }

A metódus hívása értesíti IoT HubCompleteAsync, hogy az üzenet feldolgozása sikeresen megtörtént, és hogy az üzenet biztonságosan eltávolítható az eszközsorból. Az eszköznek ezt a metódust kell meghívnia, amikor a feldolgozás sikeresen befejeződik, függetlenül attól, hogy milyen protokollt használ.

Az AMQP- és HTTPS-protokollokkal, de az MQTT protokolllal nem, az eszköz a következőket is megteheti:

  • Hagyjon fel egy üzenetet, ami azt eredményezi, hogy IoT Hub megőrzi az üzenetet az eszköz várólistájában későbbi felhasználás céljából.
  • Üzenet elutasítása, amely véglegesen eltávolítja az üzenetet az eszközsorból.

Ha olyan esemény történik, amely megakadályozza, hogy az eszköz befejezi, megszakítsa vagy elutasítsa az üzenetet, IoT Hub egy meghatározott időtúllépési időszak után újra várólistára küldi az üzenetet kézbesítésre. Ezért az eszközalkalmazás üzenetfeldolgozási logikájának idempotensnek kell lennie, hogy ugyanazt az üzenetet többször megkapva ugyanazt az eredményt kapja.

A felhőből az eszközre irányuló üzenetéletciklusról és arról, hogy IoT Hub hogyan dolgozza fel a felhőből az eszközre irányuló üzeneteket, olvassa el A felhőből az eszközre irányuló üzenetek küldése IoT Hubról című témakört.

Megjegyzés

Ha az MQTT vagy AMQP helyett HTTPS-t használ átvitelként, a ReceiveAsync metódus azonnal visszatér. A HTTPS-t használó, felhőből az eszközre irányuló üzenetek támogatott mintája időszakosan csatlakoztatott eszközök, amelyek ritkán (legalább 25 percenként) ellenőrzik az üzeneteket. Ha több HTTPS-t ad ki, az IoT Hub a kérések szabályozását eredményezi. Az MQTT, az AMQP és a HTTPS-támogatás közötti különbségekről további információt a Felhőalapú kommunikáció útmutatója és a Kommunikációs protokoll kiválasztása című témakörben talál.

Az IoT Hub kapcsolati sztring lekérése

Ebben a cikkben egy háttérszolgáltatást hoz létre, amellyel felhőből eszközre irányuló üzeneteket küldhet a IoT Hub keresztül. A felhőből az eszközre irányuló üzenetek küldéséhez a szolgáltatásnak rendelkeznie kell a szolgáltatás csatlakoztatási engedélyével. Alapértelmezés szerint minden IoT Hub egy szolgáltatás nevű megosztott hozzáférési szabályzattal jön létre, amely ezt az engedélyt biztosítja.

A szolgáltatásszabályzathoz tartozó IoT Hub kapcsolati sztring az alábbi lépésekkel szerezheti be:

  1. A Azure Portal válassza az Erőforráscsoportok lehetőséget. Válassza ki azt az erőforráscsoportot, ahol a központ található, majd válassza ki a központot az erőforrások listájából.

  2. Az IoT Hub bal oldali paneljén válassza a Megosztott hozzáférési szabályzatok lehetőséget.

  3. A szabályzatok listájából válassza ki a szolgáltatásházirendet.

  4. Másolja ki az Elsődleges kapcsolati sztring, és mentse az értéket.

Képernyőkép a kapcsolati sztring a Azure Portal IoT Hub való lekéréséről.

A IoT Hub megosztott hozzáférési szabályzatokkal és engedélyekkel kapcsolatos további információkért lásd: Hozzáférés-vezérlés és engedélyek.

Üzenet küldése felhőből eszközre

Ebben a szakaszban egy .NET-konzolalkalmazást hoz létre, amely felhőből eszközre irányuló üzeneteket küld a szimulált eszközalkalmazásnak. Szüksége lesz az eszköz azonosítójára és az IoT Hub kapcsolati sztring.

  1. A Visual Studióban válassza azÚj>projektfájlja> lehetőséget. Az Új projekt létrehozása területen válassza a Konzolalkalmazás (.NET-keretrendszer), majd a Tovább lehetőséget.

  2. Nevezze el a projektnek a SendCloudToDevice nevet, majd válassza a Tovább gombot.

    Képernyőkép az

  3. Fogadja el a .NET-keretrendszer legújabb verzióját. A projekt létrehozásához válassza a Létrehozás lehetőséget.

  4. A Megoldáskezelő kattintson a jobb gombbal az új projektre, majd válassza a Manage NuGet Packages (NuGet-csomagok kezelése) lehetőséget.

  5. A NuGet-csomagok kezelése területen válassza a Tallózás lehetőséget, majd keresse meg és válassza a Microsoft.Azure.Devices elemet. Válassza a Telepítés gombot.

    Ez a lépés letölti, telepíti és hozzáadja az Azure IoT service SDK NuGet-csomagra mutató hivatkozást.

  6. Adja hozzá a következő using utasítást a Program.cs fájl elejéhez.

    using Microsoft.Azure.Devices;
    
  7. Adja hozzá a Program osztályhoz a következő mezőket: Cserélje le a {iot hub connection string} helyőrző értéket az IoT Hubra, kapcsolati sztring korábban már feljegyzett az IoT Hub kapcsolati sztring lekérése című témakörben. Cserélje le a {device id} helyőrző értékét az IoT Hub regisztrált eszközének eszközazonosítójára.

    static ServiceClient serviceClient;
    static string connectionString = "{iot hub connection string}";
    static string targetDevice = "{device id}";
    
  8. Adja hozzá a következő metódust a Program osztályhoz, hogy üzenetet küldjön az eszközére.

    private async static Task SendCloudToDeviceMessageAsync()
    {
         var commandMessage = new
          Message(Encoding.ASCII.GetBytes("Cloud to device message."));
         await serviceClient.SendAsync(targetDevice, commandMessage);
    }
    
  9. Végül adja hozzá a következő sorokat a Main metódushoz.

    Console.WriteLine("Send Cloud-to-Device message\n");
    serviceClient = ServiceClient.CreateFromConnectionString(connectionString);
    
    Console.WriteLine("Press any key to send a C2D message.");
    Console.ReadLine();
    SendCloudToDeviceMessageAsync().Wait();
    Console.ReadLine();
    
  10. Nyomja le az F5 billentyűt a mintaszolgáltatás-alkalmazás elindításához. Válassza a SendCloudToDevice ablakot, és nyomja le az Enter billentyűt. Meg kell jelennie a mintaeszköz-alkalmazás által fogadott üzenetnek, ahogy az alábbi kimeneti példában is látható.

    5/22/2023 11:13:18 AM> Press Control+C at any time to quit the sample.
    
    5/22/2023 11:13:18 AM> Device waiting for C2D messages from the hub...
    5/22/2023 11:13:18 AM> Use the Azure Portal IoT hub blade or Azure IoT Explorer to send a message to this device.
    5/22/2023 11:13:18 AM> Trying to receive C2D messages by polling using the ReceiveAsync() method. Press 'n' to move to the next phase.
    5/22/2023 11:15:18 AM> Polling using ReceiveAsync() - received message with Id=
    5/22/2023 11:15:18 AM> Received message: [Cloud to device message.]
            Content type:
    
    5/22/2023 11:15:18 AM> Completed C2D message with Id=.
    

Visszajelzés küldése a kézbesítésről

Minden felhőből eszközre irányuló üzenethez kérhet kézbesítési (vagy lejárati) visszaigazolást IoT Hub. Ez a beállítás lehetővé teszi, hogy a megoldás háttérrendszere egyszerűen informálja, újrapróbálkoztassa vagy kompenzációs logikáját. További információ a felhőből az eszközre irányuló visszajelzésekről: D2C és C2D Messaging with IoT Hub.

Ebben a szakaszban módosítja a SendCloudToDevice mintaszolgáltatás-alkalmazást, hogy visszajelzést kérjen, és megkapja azt az IoT Hubról.

  1. A Visual Studióban a SendCloudToDevice projektben adja hozzá a következő metódust a Program osztályhoz.

    private async static void ReceiveFeedbackAsync()
    {
         var feedbackReceiver = serviceClient.GetFeedbackReceiver();
    
         Console.WriteLine("\nReceiving c2d feedback from service");
         while (true)
         {
             var feedbackBatch = await feedbackReceiver.ReceiveAsync();
             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);
         }
     }
    

    Vegye figyelembe, hogy ez a fogadási minta ugyanaz, mint amellyel a felhőből az eszközre irányuló üzeneteket fogadhatja az eszközalkalmazásból.

  2. Adja hozzá a következő sort a Main metódusban, közvetlenül utána serviceClient = ServiceClient.CreateFromConnectionString(connectionString).

    ReceiveFeedbackAsync();
    
  3. Ha visszajelzést szeretne kérni a felhőből az eszközre irányuló üzenet kézbesítéséről, meg kell adnia egy tulajdonságot a SendCloudToDeviceMessageAsync metódusban. Adja hozzá a következő sort közvetlenül a var commandMessage = new Message(...); sor után.

    commandMessage.Ack = DeliveryAcknowledgement.Full;
    
  4. Győződjön meg arról, hogy a mintaeszköz-alkalmazás fut, majd futtassa a mintaszolgáltatás-alkalmazást az F5 billentyű lenyomásával. Válassza a SendCloudToDevice konzolablakot, és nyomja le az Enter billentyűt. Látnia kell, hogy az üzenet a mintaeszköz-alkalmazástól érkezik, és néhány másodperc múlva a SendCloudToDevice alkalmazás megkapja a visszajelzési üzenetet. Az alábbi kimenet a mintaszolgáltatás-alkalmazás által kapott visszajelzési üzenetet jeleníti meg:

    Send Cloud-to-Device message
    
    
    Receiving c2d feedback from service
    Press any key to send a C2D message.
    
    Received feedback: Success
    

Megjegyzés

Az egyszerűség kedvéért ez a cikk nem implementál újrapróbálkozési szabályzatot. Az éles kódban újrapróbálkozási szabályzatokat kell implementálnia, például exponenciális visszalépést az átmeneti hibakezelésben javasolt módon.

Következő lépések

Ebben a cikkben megtanulta, hogyan küldhet és fogadhat felhőből eszközre irányuló üzeneteket.