IoT Hub (Java) ile buluttan cihaza iletiler gönderme

Azure IoT Hub, milyonlarca cihaz ve bir çözüm arka ucu arasında güvenilir ve güvenli çift yönlü iletişimin etkinleştirilmesine yardımcı olan tam olarak yönetilen bir hizmettir.

Bu makale, şunları nasıl yapacağınızı gösterir:

  • IoT Hub aracılığıyla çözüm arka ucunuzdan tek bir cihaza buluttan cihaza (C2D) iletiler gönderme

  • Cihazda buluttan cihaza iletileri alma

  • IoT Hub'den bir cihaza gönderilen iletiler için çözüm arka ucunuzdan teslim bildirimi (geri bildirim) isteyin

Not

Bu makalede açıklanan özellikler yalnızca standart IoT Hub katmanında kullanılabilir. Temel ve standart/ücretsiz IoT Hub katmanları hakkında daha fazla bilgi için bkz. Çözümünüz için doğru IoT Hub katmanını seçme.

Bu makalenin sonunda iki Java konsol uygulaması çalıştıracaksınız:

  • HandleMessages: IoT hub'ınıza bağlanan ve buluttan cihaza iletiler alan Java için Microsoft Azure IoT SDK'sına dahil edilen örnek bir cihaz uygulaması.

  • SendCloudToDevice: IoT Hub aracılığıyla cihaz uygulamasına buluttan cihaza bir ileti gönderir ve ardından teslim bildirimini alır.

Not

IoT Hub, Azure IoT cihaz SDK'ları aracılığıyla birçok cihaz platformu ve dili (C, Java, Python ve JavaScript) için SDK desteğine sahiptir.

Buluttan cihaza iletiler hakkında daha fazla bilgi edinmek için bkz. IoT hub'ından buluttan cihaza iletiler gönderme.

Önkoşullar

  • Azure aboneliği. Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

  • Azure aboneliğinizde bir IoT hub'ı. Henüz bir hub'ına sahip değilseniz IoT hub'ı oluşturma bölümündeki adımları izleyebilirsiniz.

  • IoT hub'ınıza kayıtlı bir cihaz. Henüz bir cihaz kaydetmediyseniz Azure portal bir cihaz kaydedin.

  • Bu makalede Java için Azure IoT SDK'sından alınan örnek kod kullanılmıştır.

    • SDK deposunu GitHub'dan geliştirme makinenize indirin veya kopyalayın.
    • Geliştirme makinenizde Java SE Development Kit 8'in yüklü olduğundan emin olun. JDK 8 indirmelerine ulaşmak için Uzun süreli destek bölümünde Java 8'i seçtiğinizden emin olun.
  • Maven 3

  • Güvenlik duvarınızda 8883 numaralı bağlantı noktasının açık olduğundan emin olun. Bu makaledeki cihaz örneği, 8883 numaralı bağlantı noktası üzerinden iletişim kuran MQTT protokollerini kullanır. Bu bağlantı noktası bazı kurumsal ve eğitim ağ ortamlarında engellenebilir. Bu sorunu çözmenin daha fazla bilgi ve yolları için bkz. IoT Hub 'a bağlanma (MQTT).

Cihaz bağlantı dizesini alma

Bu makalede, IoT Hub aracılığıyla gönderilen buluttan cihaza iletileri alan bir cihazın benzetimini yapan örnek bir uygulama çalıştıracaksınız. Java için Microsoft Azure IoT SDK'sına dahil edilen HandleMessages örnek uygulaması, IoT hub'ınıza bağlanır ve simülasyon cihazınız olarak görev yapar. Örnek, IoT hub'ınızdaki kayıtlı cihazın birincil bağlantı dizesini kullanır.

IoT hub'ınıza kayıtlı bir cihazın birincil bağlantı dizesini almak için şu adımları izleyin:

  1. Azure portalKaynak grupları'nı seçin. Hub'ınızın bulunduğu kaynak grubunu seçin ve ardından kaynak listesinden hub'ınızı seçin.

  2. IoT hub'ınızın sol tarafındaki bölmede, Cihaz Yönetimi altında Cihazlar'ı seçin.

  3. Cihaz listesinden uygun cihazı seçin.

  4. Birincil bağlantı dizesini kopyalayın ve değeri kaydedin.

    Azure portal IoT hub'ınıza kayıtlı bir cihaz için birincil bağlantı dizesinin nasıl alındığını gösteren ekran görüntüsü.

Cihaz uygulamasında ileti alma

Bu bölümde, IoT hub'ınız aracılığıyla gönderilen C2D iletilerini almak için HandleMessages örnek cihaz uygulamasını çalıştırın. Yeni bir komut istemi açın ve Azure IoT Java SDK'sını genişlettiğiniz klasörün altındaki azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages klasörüne gidin. Yer tutucu değerini IoT hub'ınızdaki kayıtlı cihazdan kopyaladığınız cihaz bağlantı dizesiyle değiştirerek {Your device connection string} aşağıdaki komutları çalıştırın.

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

Aşağıdaki çıkış, başarılı bir şekilde başlatıldıktan ve IoT hub'ınıza bağlandıktan sonra örnek cihaz uygulamasından alınmaktadır:

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

execute sınıfındaki AppMessageCallback yöntemi döndürürIotHubMessageResult.COMPLETE. Bu durum, IoT Hub iletinin başarıyla işlendiğini ve iletinin cihaz kuyruğundan güvenli bir şekilde kaldırılabildiğini bildirir. Cihaz, kullandığı protokolden bağımsız olarak işlemi başarıyla tamamlandığında bu değeri döndürmelidir.

AMQP ve HTTPS ile ancak MQTT ile değil, cihaz şunları da yapabilir:

  • bir iletiden vazgeçin, bu da IoT Hub gelecekte kullanılmak üzere cihaz kuyruğunda tutulmasına neden olur.
  • İletiyi reddederek iletiyi cihaz kuyruğundan kalıcı olarak kaldırır.

Cihazın iletiyi tamamlamasını, bırakmasını veya reddetmesini engelleyen bir şey olursa, IoT Hub sabit bir zaman aşımı süresinden sonra iletiyi teslim için yeniden kuyruğa alır. Bu nedenle, aynı iletiyi birden çok kez almak aynı sonucu vermesi için cihaz uygulamasındaki ileti işleme mantığının bir kez etkili olması gerekir.

Buluttan cihaza ileti yaşam döngüsü ve IoT Hub buluttan cihaza iletileri nasıl işlediği hakkında daha fazla bilgi için bkz. IoT hub'ından buluttan cihaza iletiler gönderme.

Not

Aktarım olarak MQTT veya AMQP yerine HTTPS kullanırsanız, DeviceClient örneği IoT Hub gelen iletileri seyrek denetler (en az 25 dakikada bir). MQTT, AMQP ve HTTPS desteği arasındaki farklar hakkında daha fazla bilgi için bkz. Buluttan cihaza iletişim kılavuzu ve İletişim protokolü seçme.

IoT hub bağlantı dizesini alma

Bu makalede, IoT Hub aracılığıyla buluttan cihaza iletiler göndermek için bir arka uç hizmeti oluşturacaksınız. Buluttan cihaza iletiler göndermek için hizmetinizin hizmet bağlama iznine sahip olması gerekir. Varsayılan olarak, her IoT Hub bu izni veren hizmet adlı bir paylaşılan erişim ilkesiyle oluşturulur.

Hizmet ilkesinin IoT Hub bağlantı dizesini almak için şu adımları izleyin:

  1. Azure portalKaynak grupları'nı seçin. Hub'ınızın bulunduğu kaynak grubunu seçin ve ardından kaynak listesinden hub'ınızı seçin.

  2. IoT hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.

  3. İlke listesinden hizmet ilkesini seçin.

  4. Birincil bağlantı dizesini kopyalayın ve değeri kaydedin.

Azure portal bağlantı dizesini IoT Hub almayı gösteren ekran görüntüsü.

Paylaşılan erişim ilkeleri ve izinleri IoT Hub hakkında daha fazla bilgi için bkz. Erişim denetimi ve izinler.

Buluttan cihaza ileti gönderme

Bu bölümde, sanal cihaz uygulamasına buluttan cihaza iletiler gönderen bir Java konsol uygulaması oluşturacaksınız. Cihazınızdan cihaz kimliğine ve IoT hub bağlantı dizenize ihtiyacınız vardır.

  1. Komut isteminizde aşağıdaki komutu kullanarak send-c2d-messages adlı bir Maven projesi oluşturun. Bu komutun tek, uzun bir komut olduğuna dikkat edin:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=send-c2d-messages -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  2. Komut isteminizde yeni send-c2d-messages klasörüne gidin.

  3. Metin düzenleyicisi kullanarak send-c2d-messages klasöründeki pom.xml dosyasını açın ve bağımlılıklar düğümüne aşağıdaki bağımlılığı ekleyin. Bağımlılığı eklemek, IoT hub hizmetinizle iletişim kurmak için uygulamanızda iothub-java-service-client paketini kullanmanıza olanak tanır:

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

    Not

    Maven arama kullanarak en yeni iot-service-client sürümünü kontrol edebilirsiniz.

  4. pom.xml dosyasını kaydedin ve kapatın.

  5. Metin düzenleyicisi kullanarak send-c2d-messages\src\main\java\com\mycompany\app\App.java dosyasını açın.

  6. Aşağıdaki içeri aktarma deyimlerini dosyaya ekleyin:

    import com.microsoft.azure.sdk.iot.service.*;
    import java.io.IOException;
    import java.net.URISyntaxException;
    
  7. Uygulama sınıfına aşağıdaki sınıf düzeyi değişkenleri ekleyin ve {yourhubconnectionstring} ve {yourdeviceid} değerlerini daha önce not ettiğiniz değerlerle değiştirin:

    private static final String connectionString = "{yourhubconnectionstring}";
    private static final String deviceId = "{yourdeviceid}";
    private static final IotHubServiceClientProtocol protocol =    
        IotHubServiceClientProtocol.AMQPS;
    
  8. main yöntemini aşağıdaki kodla değiştirin. Bu kod IoT hub'ınıza bağlanır, cihazınıza bir ileti gönderir ve ardından cihazın iletiyi alıp işlediğine ilişkin bir bildirim bekler:

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

    Not

    Kolaylık olması için bu makalede yeniden deneme ilkesi uygulanmaz. Üretim kodunda, Geçici Hata İşleme makalesinde önerilen yeniden deneme ilkelerini (üstel geri alma gibi) uygulamanız gerekir.

  9. Maven kullanarak send-c2d-messages uygulamasını oluşturmak için simulated-device klasöründeki komut isteminde aşağıdaki komutu yürütebilirsiniz:

    mvn clean package -DskipTests
    

Uygulamaları çalıştırma

Artık uygulamaları çalıştırmaya hazırsınız.

  1. azure-iot-sdk-java\iothub\device\iot-device-samples\handle-messages klasöründeki bir komut isteminde aşağıdaki komutları çalıştırın ve yer tutucu değerini IoT hub'ınızdaki kayıtlı cihazdan kopyaladığınız cihaz bağlantı dizesiyle değiştirin{Your device connection string}. Bu adım, IoT hub'ınıza telemetri gönderen ve hub'ınızdan gönderilen buluttan cihaza iletileri dinleyen örnek cihaz uygulamasını başlatır:

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

    Konsol penceresinde çalışan örnek cihaz uygulamasının ekran görüntüsü.

  2. Send-c2d-messages klasöründeki bir komut isteminde aşağıdaki komutu çalıştırarak buluttan cihaza ileti gönderin ve geri bildirim bildirimini bekleyin:

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

    Konsol penceresinde çalışan örnek hizmet uygulamasının ekran görüntüsü.

Sonraki adımlar

Makalede, buluttan cihaza iletileri göndermeyi ve almayı öğrendiniz.