Share via


Felhőből eszközre irányuló üzenetek küldése IoT Hub (Java) 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 Java-konzolalkalmazást futtat:

  • HandleMessages: a Java-hoz készült Microsoft Azure IoT SDK részét képező mintaeszköz-alkalmazás, amely csatlakozik az IoT Hubhoz, és fogadja a felhőből az eszközre irányuló üzeneteket.

  • SendCloudToDevice: egy felhőből eszközre irányuló üzenetet küld az eszközalkalmazásnak a 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.

Ha többet szeretne megtudni a felhőből az eszközre irányuló üzenetekről, olvassa el A felhőből az eszközre irányuló üzenetek küldése IoT Hubról című témakört.

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 Javá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 Java SE Development Kit 8 telepítve van a fejlesztői gépen. A JDK 8 letöltéséhez válassza a Java 8lehetőséget a Hosszú távú támogatás területen.
  • Maven 3

  • 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.

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 Java részét képező HandleMessages 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 HandleMessages 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-java\iothub\device\iot-device-samples\handle-messages mappát abban a mappában, amelyben kibontotta az Azure IoT Java 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.

mvn clean package -DskipTests
java -jar ./target/handle-messages-1.0.0-with-deps.jar "{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.
     
Starting...
Beginning setup.
Successfully read input parameters.
Using communication protocol MQTT.
2023-05-23 09:51:06,062 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2023-05-23 09:51:06,187 DEBUG (main) [com.microsoft.azure.sdk.iot.device.ClientConfiguration] - Device configured to use software based SAS authentication provider
2023-05-23 09:51:06,187 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true
2023-05-23 09:51:06,202 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.1.5
Successfully created an IoT Hub client.
Successfully set message callback.
2023-05-23 09:51:06,205 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection...
2023-05-23 09:51:06,218 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet...
2023-05-23 09:51:07,308 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged
2023-05-23 09:51:07,308 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/US60536-device/messages/devicebound/#
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/US60536-device/messages/devicebound/# was acknowledged
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully
2023-05-23 09:51:07,388 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established
2023-05-23 09:51:07,404 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK
2023-05-23 09:51:07,404 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads
2023-05-23 09:51:07,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details

CONNECTION STATUS UPDATE: CONNECTED
CONNECTION STATUS REASON: CONNECTION_OK
CONNECTION STATUS THROWABLE: null

The connection was successfully established. Can send messages.
2023-05-23 09:51:07,408 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully
2023-05-23 09:51:07,408 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully
Opened connection to IoT Hub. Messages sent to this device will now be received.
Press any key to exit...

A execute osztály metódusa a AppMessageCallback értéket adja IotHubMessageResult.COMPLETEvissza. Ez az állapot értesíti IoT Hub, hogy az üzenet feldolgozása sikeresen megtörtént, és az üzenet biztonságosan eltávolítható az eszközsorból. Az eszköznek ezt az értéket kell visszaadnia, ha a feldolgozás sikeresen befejeződik, függetlenül attól, hogy milyen protokollt használ.

Az AMQP és a HTTPS használatával, de az MQTT-vel 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 DeviceClient-példány ritkán (legalább 25 percenként) ellenőrzi IoT Hub üzeneteket. 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 Java-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. Hozzon létre egy send-c2d-messages nevű Maven-projektet a parancssorban található alábbi paranccsal. Vegye figyelembe, hogy ez a parancs egyetlen hosszú parancs:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. A parancssorban lépjen az új send-c2d-messages mappára.

  3. Egy szövegszerkesztővel nyissa meg a pom.xml fájlt a send-c2d-messages mappában, és adja hozzá a következő függőséget a dependencies csomóponthoz. A függőség hozzáadása lehetővé teszi az iothub-java-service-client csomag használatát az alkalmazásban az IoT Hub-szolgáltatással való kommunikációhoz:

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

    Megjegyzés

    Az iot-service-client legújabb verzióját a Maven keresési funkciójával tekintheti meg.

  4. Mentse és zárja be a pom.xml fájlt.

  5. Szövegszerkesztővel nyissa meg a send-c2d-messages\src\main\java\com\mycompany\app\App.java fájlt.

  6. Adja hozzá a következő importálási utasításokat a fájlhoz:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. Adja hozzá a következő osztályszintű változókat az App osztályhoz, és cserélje le a {yourhubconnectionstring} és a {yourdeviceid} értéket a korábban feljegyzett értékekre:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol =    
        IotHubServiceClientProtocol.AMQPS;
    
  8. Cserélje le a metódust a következő kódra. Ez a kód csatlakozik az IoT Hubhoz, üzenetet küld az eszköznek, majd megvárja annak nyugtázását, hogy az eszköz megkapta és feldolgozta az üzenetet:

    public static void main(String[] args) throws IOException,
        URISyntaxException, Exception {
      ServiceClient serviceClient = ServiceClient.createFromConnectionString(
        connectionString, protocol);
    
      if (serviceClient != null) {
        serviceClient.open();
        FeedbackReceiver feedbackReceiver = serviceClient
          .getFeedbackReceiver();
        if (feedbackReceiver != null) feedbackReceiver.open();
    
        Message messageToSend = new Message("Cloud to device message.");
        messageToSend.setDeliveryAcknowledgement(DeliveryAcknowledgement.Full);
    
        serviceClient.send(deviceId, messageToSend);
        System.out.println("Message sent to device");
    
        FeedbackBatch feedbackBatch = feedbackReceiver.receive(10000);
        if (feedbackBatch != null) {
          System.out.println("Message feedback received, feedback time: "
            + feedbackBatch.getEnqueuedTimeUtc().toString());
        }
    
        if (feedbackReceiver != null) feedbackReceiver.close();
        serviceClient.close();
      }
    }
    

    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 (például exponenciális visszalépést) kell implementálnia az Átmeneti hibakezelés című cikkben leírtak szerint.

  9. A send-c2d-messages alkalmazás Maven használatával történő létrehozásához hajtsa végre a következő parancsot a parancssorban a simulated-device mappában:

    mvn clean package -DskipTests
    

Az alkalmazások futtatása

Most már készen áll az alkalmazások futtatására.

  1. Az azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages mappában található parancssorban futtassa a következő parancsokat, és cserélje le a {Your device connection string} helyőrző értéket arra az eszközre, kapcsolati sztring az IoT Hub regisztrált eszközéről másolt. Ez a lépés elindítja a mintaeszköz-alkalmazást, amely telemetriát küld az IoT Hubnak, és figyeli a központról küldött felhőből az eszközre irányuló üzeneteket:

    java -jar ./target/handle-messages-1.0.0-with-deps.jar "{Your device connection string}"
    

    Képernyőkép a konzolablakban futó mintaeszköz-alkalmazásról.

  2. A send-c2d-messages mappában lévő parancssorban futtassa a következő parancsot egy felhőből az eszközre irányuló üzenet küldéséhez, és várja meg a visszajelzés nyugtázását:

    mvn exec:java -Dexec.mainClass="com.mycompany.app.App"
    

    Képernyőkép a konzolablakban futó mintaszolgáltatás-alkalmazásról.

Következő lépések

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