Aracılığıyla paylaş


Cihaz yönetimini kullanmaya başlama (Java)

Arka uç uygulamaları, cihazlarda cihaz yönetimi eylemlerini uzaktan başlatmak ve izlemek için cihaz ikizleri ve doğrudan yöntemler gibi Azure IoT Hub temel öğelerini kullanabilir. Bu makalede bir arka uç uygulamasının ve cihaz uygulamasının IoT Hub'ı kullanarak uzak cihaz yeniden başlatmayı başlatmak ve izlemek için birlikte nasıl çalışabileceği gösterilir.

Not

Bu makalede açıklanan özellikler yalnızca IoT Hub'ın standart 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.

Buluttaki bir arka uç uygulamasından cihaz yönetimi eylemlerini (yeniden başlatma, fabrika sıfırlama ve üretici yazılımı güncelleştirmesi gibi) başlatmak için doğrudan bir yöntem kullanın. Cihaz aşağıdakiler için sorumludur:

  • IoT Hub'dan gönderilen yöntem isteğini işleme.

  • Cihazda ilgili cihaza özgü eylemi başlatma.

  • IoT Hub'a bildirilen özellikler aracılığıyla durum güncelleştirmeleri sağlama.

Cihaz yönetimi eylemlerinizin ilerleme durumunu raporlamak üzere cihaz ikizi sorguları çalıştırmak için bulutta bir arka uç uygulaması kullanabilirsiniz.

Bu makalede şunların nasıl oluşturulacağı gösterilmektedir:

  • simulated-device: Cihazı yeniden başlatan ve son yeniden başlatma zamanını bildiren doğrudan bir yönteme sahip simülasyon cihazı uygulaması. Doğrudan yöntemler buluttan çağrılır.

  • trigger-reboot: IoT hub'ınız aracılığıyla sanal cihaz uygulamasında doğrudan yöntemi çağıran bir Java uygulaması. Yanıtı görüntüler ve bildirilen özellikleri güncelleştirir.

Not

Cihazlarda çalıştırılacak uygulamalar oluşturmak için kullanabileceğiniz SDK'lar ve çözüm arka ucunuz hakkında bilgi için bkz . Azure IoT SDK'ları.

Önkoşullar

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

  • IoT hub'ınıza kayıtlı bir cihaz. IoT hub'ınızda bir cihaz yoksa Cihazı kaydetme bölümünde yer alan adımları izleyin.

  • Java SE Geliştirme Seti 8. 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 (MQTT) Bağlanma.

Doğrudan yöntemle cihaz uygulaması oluşturma

Bu bölümde, bir cihazın simülasyonunu sağlayan bir Java konsol uygulaması oluşturacaksınız. Uygulama, IoT hub'ınızdan doğrudan yeniden başlatma yöntemi çağrısını dinler ve bu çağrıyı hemen yanıtlar. Ardından uygulama, tetikleyici yeniden başlatma arka uç uygulamasına yeniden başlatma işleminin tamamlandığını bildirmek üzere bildirilen bir özelliği kullanmadan önce yeniden başlatma işleminin benzetimini yapmak için bir süre uyku moduna alır.

  1. dm-get-started klasöründe, komut isteminizde aşağıdaki komutu kullanarak simulated-device adlı bir Maven projesi oluşturun:

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

  3. Bir metin düzenleyicisi kullanarak simulated-device klasöründeki pom.xml dosyasını açın ve bağımlılıklar düğümüne aşağıdaki bağımlılığı ekleyin. Bu bağımlılık, IoT hub'ınızla iletişim kurmak için uygulamanızda iot-service-client paketini kullanmanıza olanak tanır:

    <dependency>
      <groupId>com.microsoft.azure.sdk.iot</groupId>
      <artifactId>iot-device-client</artifactId>
      <version>1.17.5</version>
    </dependency>
    

    Not

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

  4. Bağımlılıklar düğümüne aşağıdaki bağımlılığı ekleyin. Bu bağımlılık, günlüğe kaydetmeyi uygulamak için cihaz istemci SDK'sı tarafından kullanılan Apache SLF4J günlüğe kaydetme cephesi için bir NOP yapılandırıyor. Bu yapılandırma isteğe bağlıdır, ancak bunu atlarsanız, uygulamayı çalıştırdığınızda konsolda bir uyarı görebilirsiniz. Cihaz istemci SDK'sında günlüğe kaydetme hakkında daha fazla bilgi için bkz. Java benioku dosyası için Azure IoT cihaz SDK'sı Örnekleri'nde günlüğe kaydetme.

    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.7.28</version>
    </dependency>
    
  5. Bağımlılıklar düğümünden sonra aşağıdaki derleme düğümünü ekleyin. Bu yapılandırma Maven'a uygulamayı derlemek için Java 1.8'i kullanma talimatını verdi:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.3</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </build>
    
  6. Pom.xml dosyasını kaydedin ve kapatın.

  7. Metin düzenleyicisi kullanarak simulated-device\src\main\java\com\mycompany\app\App.java kaynak dosyasını açın.

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

    import com.microsoft.azure.sdk.iot.device.*;
    import com.microsoft.azure.sdk.iot.device.DeviceTwin.*;
    
    import java.io.IOException;
    import java.net.URISyntaxException;
    import java.time.LocalDateTime;
    import java.util.Scanner;
    import java.util.Set;
    import java.util.HashSet;
    
  9. Aşağıdaki sınıf düzeyi değişkenleri App sınıfına ekleyin. değerini IoT Hub'a bir cihaz kaydettiğinizde gördüğünüz cihaz bağlantı dizesi ile değiştirin{yourdeviceconnectionstring}:

    private static final int METHOD_SUCCESS = 200;
    private static final int METHOD_NOT_DEFINED = 404;
    
    private static IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
    private static String connString = "{yourdeviceconnectionstring}";
    private static DeviceClient client;
    
  10. Doğrudan yöntem durum olayları için bir geri çağırma işleyicisi uygulamak için aşağıdaki iç içe geçmiş sınıfı Uygulama sınıfına ekleyin:

    protected static class DirectMethodStatusCallback implements IotHubEventCallback
    {
      public void execute(IotHubStatusCode status, Object context)
      {
        System.out.println("IoT Hub responded to device method operation with status " + status.name());
      }
    }
    
  11. Cihaz ikizi durum olayları için bir geri çağırma işleyicisi uygulamak için Aşağıdaki iç içe sınıfı Uygulama sınıfına ekleyin:

    protected static class DeviceTwinStatusCallback implements IotHubEventCallback
    {
        public void execute(IotHubStatusCode status, Object context)
        {
            System.out.println("IoT Hub responded to device twin operation with status " + status.name());
        }
    }
    
  12. Özellik olayları için geri çağırma işleyicisi uygulamak için Aşağıdaki iç içe sınıfı Uygulama sınıfına ekleyin:

    protected static class PropertyCallback implements PropertyCallBack<String, String>
    {
      public void PropertyCall(String propertyKey, String propertyValue, Object context)
      {
        System.out.println("PropertyKey:     " + propertyKey);
        System.out.println("PropertyKvalue:  " + propertyKey);
      }
    }
    
  13. Cihaz yeniden başlatma benzetimini yapmak üzere bir iş parçacığı uygulamak için aşağıdaki iç içe sınıfı Uygulama sınıfına ekleyin. İş parçacığı beş saniye boyunca uyku moduna geçer ve lastReboot bildirilen özelliğini ayarlar:

    protected static class RebootDeviceThread implements Runnable {
      public void run() {
        try {
          System.out.println("Rebooting...");
          Thread.sleep(5000);
          Property property = new Property("lastReboot", LocalDateTime.now());
          Set<Property> properties = new HashSet<Property>();
          properties.add(property);
          client.sendReportedProperties(properties);
          System.out.println("Rebooted");
        }
        catch (Exception ex) {
          System.out.println("Exception in reboot thread: " + ex.getMessage());
        }
      }
    }
    
  14. Cihazda doğrudan yöntemi uygulamak için aşağıdaki iç içe geçmiş sınıfı Uygulama sınıfına ekleyin. Simülasyon uygulaması doğrudan yeniden başlatma yöntemine bir çağrı aldığında, çağırana bir bildirim döndürür ve yeniden başlatmayı işlemek için bir iş parçacığı başlatır:

    protected static class DirectMethodCallback implements com.microsoft.azure.sdk.iot.device.DeviceTwin.DeviceMethodCallback
    {
      @Override
      public DeviceMethodData call(String methodName, Object methodData, Object context)
      {
        DeviceMethodData deviceMethodData;
        switch (methodName)
        {
          case "reboot" :
          {
            int status = METHOD_SUCCESS;
            System.out.println("Received reboot request");
            deviceMethodData = new DeviceMethodData(status, "Started reboot");
            RebootDeviceThread rebootThread = new RebootDeviceThread();
            Thread t = new Thread(rebootThread);
            t.start();
            break;
          }
          default:
          {
            int status = METHOD_NOT_DEFINED;
            deviceMethodData = new DeviceMethodData(status, "Not defined direct method " + methodName);
          }
        }
        return deviceMethodData;
      }
    }
    
  15. Aşağıdaki özel durumları atmak için ana yöntemin imzasını değiştirin:

    public static void main(String[] args) throws IOException, URISyntaxException
    
  16. DeviceClient örneği oluşturmak için main yöntemindeki kodu aşağıdaki kodla değiştirin:

    System.out.println("Starting device client sample...");
    client = new DeviceClient(connString, protocol);
    
  17. Doğrudan yöntem çağrılarını dinlemeye başlamak için aşağıdaki kodu main yöntemine ekleyin:

    try
    {
      client.open();
      client.subscribeToDeviceMethod(new DirectMethodCallback(), null, new DirectMethodStatusCallback(), null);
      client.startDeviceTwin(new DeviceTwinStatusCallback(), null, new PropertyCallback(), null);
      System.out.println("Subscribed to direct methods and polling for reported properties. Waiting...");
    }
    catch (Exception e)
    {
      System.out.println("On exception, shutting down \n" + " Cause: " + e.getCause() + " \n" +  e.getMessage());
      client.close();
      System.out.println("Shutting down...");
    }
    
  18. Cihaz simülatörünü kapatmak için aşağıdaki kodu main yöntemine ekleyin:

    System.out.println("Press any key to exit...");
    Scanner scanner = new Scanner(System.in);
    scanner.nextLine();
    scanner.close();
    client.close();
    System.out.println("Shutting down...");
    
  19. simulated-device\src\main\java\com\mycompany\app\App.java dosyasını kaydedin ve kapatın.

  20. Simulated-device uygulamasını oluşturun ve hataları düzeltin. Komut isteminizde simulated-device klasörüne gidin ve aşağıdaki komutu çalıştırın:

    mvn clean package -DskipTests
    

IoT hub'ını bağlantı dizesi alma

Bu makalede, bir cihazda doğrudan yöntem çağıran bir arka uç hizmeti oluşturacaksınız. IoT Hub aracılığıyla bir cihazda doğrudan yöntem çağırmak 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 ilkesi için IoT Hub bağlantı dizesi almak için şu adımları izleyin:

  1. Azure portalında Kaynak 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ı dizesi kopyalayın ve değeri kaydedin.

Azure portalında IoT Hub'ınızdan bağlantı dizesi almayı gösteren ekran görüntüsü.

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

Yeniden başlatmayı tetikleyen bir hizmet uygulaması oluşturma

Bu bölümde, aşağıdakilere sahip bir Java konsol uygulaması oluşturacaksınız:

  1. Simülasyon cihazı uygulamasında yeniden başlatma doğrudan yöntemini çağırır.

  2. Yanıtı görüntüler.

  3. Yeniden başlatmanın ne zaman tamamlandığına karar vermek için cihazdan gönderilen bildirilen özellikleri yoklar.

Bu konsol uygulaması, doğrudan yöntemi çağırmak ve bildirilen özellikleri okumak için IoT Hub'ınıza bağlanır.

  1. dm-get-started adlı boş bir klasör oluşturun.

  2. dm-get-started klasöründe, komut isteminizde aşağıdaki komutu kullanarak trigger-reboot adlı bir Maven projesi oluşturun:

    mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=trigger-reboot -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    
  3. Komut isteminizde trigger-reboot klasörüne gidin.

  4. Metin düzenleyicisi kullanarak trigger-reboot klasöründeki pom.xml dosyasını açın ve bağımlılıklar düğümüne aşağıdaki bağımlılığı ekleyin. Bu bağımlılık, IoT hub'ınızla iletişim kurmak için uygulamanızda iot-service-client paketini kullanmanıza olanak tanır:

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

    Not

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

  5. Bağımlılıklar düğümünden sonra aşağıdaki derleme düğümünü ekleyin. Bu yapılandırma Maven'a uygulamayı derlemek için Java 1.8'i kullanma talimatını verdi:

    <build>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.3</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
          </configuration>
        </plugin>
      </plugins>
    </build>
    
  6. Pom.xml dosyasını kaydedin ve kapatın.

  7. Metin düzenleyicisi kullanarak trigger-reboot\src\main\java\com\mycompany\app\App.java kaynak dosyasını açın.

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

    import com.microsoft.azure.sdk.iot.service.devicetwin.DeviceMethod;
    import com.microsoft.azure.sdk.iot.service.devicetwin.MethodResult;
    import com.microsoft.azure.sdk.iot.service.exceptions.IotHubException;
    import com.microsoft.azure.sdk.iot.service.devicetwin.DeviceTwin;
    import com.microsoft.azure.sdk.iot.service.devicetwin.DeviceTwinDevice;
    
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.Executors;
    import java.util.concurrent.ExecutorService;
    
  9. Aşağıdaki sınıf düzeyi değişkenleri App sınıfına ekleyin. değerini, Daha önce IoT hub'ını alma bağlantı dizesi kopyaladığınız IoT Hub bağlantı dizesi ile değiştirin{youriothubconnectionstring}:

    public static final String iotHubConnectionString = "{youriothubconnectionstring}";
    public static final String deviceId = "myDeviceId";
    
    private static final String methodName = "reboot";
    private static final Long responseTimeout = TimeUnit.SECONDS.toSeconds(30);
    private static final Long connectTimeout = TimeUnit.SECONDS.toSeconds(5);
    
  10. Cihaz ikizinden bildirilen özellikleri her 10 saniyede bir okuyan bir iş parçacığı uygulamak için, Uygulama sınıfına aşağıdaki iç içe sınıfı ekleyin:

    private static class ShowReportedProperties implements Runnable {
      public void run() {
        try {
          DeviceTwin deviceTwins = DeviceTwin.createFromConnectionString(iotHubConnectionString);
          DeviceTwinDevice twinDevice = new DeviceTwinDevice(deviceId);
          while (true) {
            System.out.println("Get reported properties from device twin");
            deviceTwins.getTwin(twinDevice);
            System.out.println(twinDevice.reportedPropertiesToString());
            Thread.sleep(10000);
          }
        } catch (Exception ex) {
          System.out.println("Exception reading reported properties: " + ex.getMessage());
        }
      }
    }
    
  11. Aşağıdaki özel durumu atmak için ana yöntemin imzasını değiştirin:

    public static void main(String[] args) throws IOException
    
  12. Simülasyon cihazında doğrudan yeniden başlatma yöntemini çağırmak için main yöntemindeki kodu aşağıdaki kodla değiştirin:

    System.out.println("Starting sample...");
    DeviceMethod methodClient = DeviceMethod.createFromConnectionString(iotHubConnectionString);
    
    try
    {
      System.out.println("Invoke reboot direct method");
      MethodResult result = methodClient.invoke(deviceId, methodName, responseTimeout, connectTimeout, null);
    
      if(result == null)
      {
        throw new IOException("Invoke direct method reboot returns null");
      }
      System.out.println("Invoked reboot on device");
      System.out.println("Status for device:   " + result.getStatus());
      System.out.println("Message from device: " + result.getPayload());
    }
    catch (IotHubException e)
    {
        System.out.println(e.getMessage());
    }
    
  13. Bildirilen özellikleri simülasyon cihazından yoklama iş parçacığını başlatmak için aşağıdaki kodu main yöntemine ekleyin:

    ShowReportedProperties showReportedProperties = new ShowReportedProperties();
    ExecutorService executor = Executors.newFixedThreadPool(1);
    executor.execute(showReportedProperties);
    
  14. Uygulamayı durdurmanızı sağlamak için aşağıdaki kodu main yöntemine ekleyin:

    System.out.println("Press ENTER to exit.");
    System.in.read();
    executor.shutdownNow();
    System.out.println("Shutting down sample...");
    
  15. trigger-reboot\src\main\java\com\mycompany\app\App.java dosyasını kaydedin ve kapatın.

  16. Tetikleyici yeniden başlatma arka uç uygulamasını oluşturun ve hataları düzeltin. Komut isteminizde trigger-reboot klasörüne gidin ve aşağıdaki komutu çalıştırın:

    mvn clean package -DskipTests
    

Uygulamaları çalıştırma

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

  1. Simulated-device klasöründeki bir komut isteminde, IoT hub'ınızdan yeniden başlatma yöntemi çağrılarını dinlemeye başlamak için aşağıdaki komutu çalıştırın:

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

    Yeniden başlatma doğrudan yöntem çağrılarını dinlemek için Java IoT Hub sanal cihaz uygulaması

  2. Trigger-reboot klasöründeki bir komut isteminde, IoT hub'ınızdan sanal cihazınızda yeniden başlatma yöntemini çağırmak için aşağıdaki komutu çalıştırın:

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

    Yeniden başlatma doğrudan yöntemini çağırmak için Java IoT Hub hizmet uygulaması

  3. Simülasyon cihazı yeniden başlatma doğrudan yöntem çağrısına yanıt verir:

    Java IoT Hub sanal cihaz uygulaması doğrudan yöntem çağrısına yanıt verir

Cihaz yönetimi eylemlerini özelleştirme ve genişletme

IoT çözümleriniz tanımlı cihaz yönetimi desenleri kümesini genişletebilir veya cihaz ikizi ve buluttan cihaza yöntemi temel öğelerini kullanarak özel desenleri etkinleştirebilir. Cihaz yönetimi eylemlerine diğer örnekler arasında fabrika sıfırlaması, üretici yazılımı güncelleştirmesi, yazılım güncelleştirmesi, güç yönetimi, ağ ve bağlantı yönetimi ve veri şifreleme sayılabilir.

Cihaz bakım pencereleri

Genellikle, cihazları kesintileri ve kapalı kalma süresini en aza indiren bir zamanda eylem gerçekleştirecek şekilde yapılandırırsınız. Cihaz bakım pencereleri, bir cihazın yapılandırmasını güncelleştirme zamanını tanımlamak için yaygın olarak kullanılan bir desendir. Arka uç çözümleriniz, cihazınızda bakım penceresi sağlayan bir ilke tanımlamak ve etkinleştirmek için cihaz ikizinin istenen özelliklerini kullanabilir. Cihaz bakım penceresi ilkesini aldığında, ilkenin durumunu bildirmek için cihaz ikizinin bildirilen özelliğini kullanabilir. Arka uç uygulaması daha sonra cihaz ikizi sorgularını kullanarak cihazların ve her ilkenin uyumluluğunu kanıtlayabilir.

Sonraki adımlar

Bu makalede, bir cihazda uzaktan yeniden başlatma tetikleme için doğrudan bir yöntem kullandınız. Bildirilen özellikleri kullanarak cihazdan son yeniden başlatma zamanını bildirdiniz ve cihazın buluttan son yeniden başlatma zamanını bulmak için cihaz ikizini sorguladıysanız.

ToToTo, Raspberry Pi 3 B+ Başvuru Görüntüsünü kullanarak Azure IoT Hub için Cihaz Güncelleştirmesi makalesinde IoT Hub'ı ve uçtan uca görüntü tabanlı güncelleştirme gibi cihaz yönetimi desenlerini kullanmaya devam etmek için.

IoT çözümünüzü genişletmeyi ve yöntem çağrılarını birden çok cihazda zamanlamayı öğrenmek için bkz . İşleri zamanlama ve yayınlama.