Share via


Cihaz ikizlerini kullanmaya başlama (Java)

Cihaz ikizleri; meta veriler, yapılandırmalar ve koşullar gibi cihaz durumu bilgilerini depolayan JSON belgelerdir. IoT Hub, ona bağlanan her cihaz için bir cihaz ikizi kalıcı hale getirmekte.

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.

Cihaz ikizlerini kullanarak:

  • Çözüm arka ucunuzdan cihaz meta verilerini depolayın.

  • Kullanılabilir özellikler ve koşullar gibi geçerli durum bilgilerini (örneğin, kullanılan bağlantı yöntemi) cihaz uygulamanızdan bildirin.

  • Cihaz uygulaması ve arka uç uygulaması arasında üretici yazılımı ve yapılandırma güncelleştirmeleri gibi uzun süre çalışan iş akışlarının durumunu eşitleyin.

  • Cihaz meta verilerinizi, yapılandırmanızı veya durumunuzu sorgular.

Cihaz ikizleri eşitleme ve cihaz yapılandırmalarını ve koşullarını sorgulamak için tasarlanmıştır. Cihaz ikizlerinin ne zaman kullanılacağı da dahil olmak üzere cihaz ikizleri hakkında daha fazla bilgi için bkz . Cihaz ikizlerini anlama.

IoT hub'ları, aşağıdaki öğeleri içeren cihaz ikizlerini depolar:

  • Etiketler' e tıklayın. Cihaz meta verilerine yalnızca çözüm arka ucu tarafından erişilebilir.

  • İstenen özellikler. Çözüm arka ucu tarafından değiştirilebilir ve cihaz uygulaması tarafından gözlemlenebilir JSON nesneleri.

  • Bildirilen özellikler. Cihaz uygulaması tarafından değiştirilebilir ve çözüm arka ucu tarafından okunabilir JSON nesneleri.

Etiketler ve özellikler dizi içeremez, ancak iç içe nesneler içerebilir.

Aşağıdaki çizimde cihaz ikizi kuruluşu gösterilmektedir:

Cihaz ikizi kavram diyagramının ekran görüntüsü.

Ayrıca, çözüm arka ucu yukarıdaki tüm verilere göre cihaz ikizlerini sorgulayabilir. Cihaz ikizleri hakkında daha fazla bilgi için bkz . Cihaz ikizlerini anlama. Sorgulama hakkında daha fazla bilgi için bkz . IoT Hub sorgu dili.

Bu makalede aşağıdaki işlemler hakkında bilgi edinirsiniz:

  • Bağlantı kanalını cihaz ikizinde bildirilen bir özellik olarak raporlamak için sanal bir cihaz uygulaması kullanın.

  • Daha önce oluşturulan etiketlerdeki ve özelliklerdeki filtreleri kullanarak arka uç uygulamanızdaki cihazları sorgular.

Bu makalede iki Java konsol uygulaması oluşturacaksınız:

  • add-tags-query: Etiket ekleyen ve cihaz ikizlerini sorgulayan bir arka uç uygulaması.
  • simulated-device: IoT hub'ınıza bağlanan ve bağlantı durumunu bildiren bir sanal cihaz uygulaması.

Not

Hem cihaz hem de arka uç uygulamaları oluşturmak için kullanılabilen SDK araçları hakkında daha fazla bilgi için bkz . Azure IoT SDK'ları .

Önkoşullar

  • Bir IoT hub'ı. CLI veya Azure portalı ile bir tane oluşturun.

  • Kayıtlı bir cihaz. Azure portalında bir tane kaydedin.

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

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

Bu makalede, bir cihaz ikizine istenen özellikleri ekleyen bir arka uç hizmeti oluşturacak ve ardından kimlik kayıt defterini sorgulayarak uygun şekilde güncelleştirilmiş bildirilen özelliklere sahip tüm cihazları bulacaksınız. Hizmetinizin bir cihaz ikizinin istenen özelliklerini değiştirmek için hizmet bağlantı iznine ve kimlik kayıt defterini sorgulamak için kayıt defteri okuma iznine ihtiyacı var. Yalnızca bu iki izni içeren varsayılan paylaşılan erişim ilkesi yoktur, bu nedenle bir tane oluşturmanız gerekir.

Hizmet bağlama ve kayıt defteri okuma izinleri veren bir paylaşılan erişim ilkesi oluşturmak ve bu ilke için bir 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. Hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.

  3. İlke listesinin üst kısmındaki menüden Paylaşılan ilke erişim ilkesi ekle'yi seçin.

  4. Sağdaki Paylaşılan erişim ilkesi ekle bölmesinde, ilkeniz için serviceAndRegistryRead gibi açıklayıcı bir ad girin. İzinler'in altında Kayıt Defteri Okuma ve Hizmet Bağlan'ni ve ardından Ekle'yi seçin.

    Yeni bir paylaşılan erişim ilkesinin nasıl ekleneceğini gösteren ekran görüntüsü.

  5. İlke listesinden yeni ilkenizi seçin.

  6. Birincil bağlantı dizesi için kopyalama simgesini seçin ve değeri kaydedin.

    bağlantı dizesi nasıl alındığını 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.

Bildirilen özellikleri güncelleştiren bir cihaz uygulaması oluşturma

Bu bölümde, hub'ınıza myDeviceId olarak bağlanan bir Java konsol uygulaması oluşturacak ve ardından cihaz ikizinizin bildirilen özelliklerini güncelleştirerek bir hücresel ağ kullanarak bağlandığını doğrulaacaksınız.

  1. iot-java-twin-getstarted 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. 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ıkları ekleyin. Bu bağımlılık, IoT hub'ınızla iletişim kurmak için uygulamanızdaki iot-device-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 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.util.Scanner;
    
  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 String connString = "{yourdeviceconnectionstring}";
    private static IotHubClientProtocol protocol = IotHubClientProtocol.MQTT;
    private static String deviceId = "myDeviceId";
    

    Bu örnek uygulama, bir DeviceClient nesnesi örneğini oluşturduğunda prokotol değişkenini kullanır.

  10. İkiz güncelleştirmeleri hakkındaki bilgileri yazdırmak için Uygulama sınıfına aşağıdaki yöntemi ekleyin:

    protected static class DeviceTwinStatusCallBack implements IotHubEventCallback {
        @Override
        public void execute(IotHubStatusCode status, Object context) {
          System.out.println("IoT Hub responded to device twin operation with status " + status.name());
        }
      }
    
  11. main yöntemindeki kodu aşağıdaki kodla değiştirin:

    • IoT Hub ile iletişim kurmak için bir cihaz istemcisi oluşturun.

    • Cihaz ikizi özelliklerini depolamak için bir Device nesnesi oluşturun.

    DeviceClient client = new DeviceClient(connString, protocol);
    
    // Create a Device object to store the device twin properties
    Device dataCollector = new Device() {
      // Print details when a property value changes
      @Override
      public void PropertyCall(String propertyKey, Object propertyValue, Object context) {
        System.out.println(propertyKey + " changed to " + propertyValue);
      }
    };
    
  12. Aşağıdaki kodu main yöntemine ekleyerek bir connectivityType bildirilen özelliği oluşturun ve IoT Hub'a gönderin:

    try {
      // Open the DeviceClient and start the device twin services.
      client.open();
      client.startDeviceTwin(new DeviceTwinStatusCallBack(), null, dataCollector, null);
    
      // Create a reported property and send it to your IoT hub.
      dataCollector.setReportedProp(new Property("connectivityType", "cellular"));
      client.sendReportedProperties(dataCollector.getReportedProp());
    }
    catch (Exception e) {
      System.out.println("On exception, shutting down \n" + " Cause: " + e.getCause() + " \n" + e.getMessage());
      dataCollector.clean();
      client.closeNow();
      System.out.println("Shutting down...");
    }
    
  13. Aşağıdaki kodu main yönteminin sonuna ekleyin. Enter anahtarı beklenildiğinde IoT Hub'ın cihaz ikizi işlemlerinin durumunu bildirmesi için zaman gerekir.

    System.out.println("Press any key to exit...");
    
    Scanner scanner = new Scanner(System.in);
    scanner.nextLine();
    
    dataCollector.clean();
    client.close();
    
  14. main yönteminin imzasını, aşağıda gösterilen özel durumları içerecek şekilde değiştirin:

    public static void main(String[] args) throws URISyntaxException, IOException
    
  15. simulated-device\src\main\java\com\mycompany\app\App.java dosyasını kaydedin ve kapatın.

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

İstenen özellikleri ve sorgu ikizlerini güncelleştiren bir hizmet uygulaması oluşturma

Bu bölümde, myDeviceId ile ilişkilendirilmiş IoT Hub'daki cihaz ikizine etiket olarak konum meta verilerini ekleyen bir Java uygulaması oluşturacaksınız. Uygulama, ABD'de bulunan cihazlar için IoT hub'ını sorgular ve ardından hücresel ağ bağlantısı bildiren cihazları sorgular.

  1. Geliştirme makinenizde iot-java-twin-getstarted adlı boş bir klasör oluşturun.

  2. iot-java-twin-getstarted klasöründe, komut isteminizde aşağıdaki komutu kullanarak add-tags-query adlı bir Maven projesi oluşturun:

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

  4. Metin düzenleyicisi kullanarak add-tags-query 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 kullanma talimatını vemektedir.

    <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 add-tags-query\src\main\java\com\mycompany\app\App.java dosyasını açın.

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

    import com.microsoft.azure.sdk.iot.service.devicetwin.*;
    import com.microsoft.azure.sdk.iot.service.exceptions.IotHubException;
    
    import java.io.IOException;
    import java.util.HashSet;
    import java.util.Set;
    
  9. Aşağıdaki sınıf düzeyi değişkenleri App sınıfına ekleyin. değerini, IoT hub'ını alma bağlantı dizesi'nde 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";
    
    public static final String region = "US";
    public static final String plant = "Redmond43";
    
  10. Ana yöntem imzasını aşağıdaki throws yan tümceyi içerecek şekilde güncelleştirin:

    public static void main( String[] args ) throws IOException
    
  11. Main yöntemindeki kodu aşağıdaki kodla değiştirerek DeviceTwin ve DeviceTwinDevice nesnelerini oluşturun. DeviceTwin nesnesi, IoT hub'ınız ile iletişimi işler. DeviceTwinDevice nesnesi, cihaz ikizini özellikleri ve etiketleriyle temsil eder:

    // Get the DeviceTwin and DeviceTwinDevice objects
    DeviceTwin twinClient = DeviceTwin.createFromConnectionString(iotHubConnectionString);
    DeviceTwinDevice device = new DeviceTwinDevice(deviceId);
    
  12. try/catch Aşağıdaki bloğu main yöntemine ekleyin:

    try {
      // Code goes here
    } catch (IotHubException e) {
      System.out.println(e.getMessage());
    } catch (IOException e) {
      System.out.println(e.getMessage());
    }
    
  13. Bölge ve cihaz ikizi etiketlerini cihaz ikizinize güncelleştirmek için blokta try aşağıdaki kodu ekleyin:

    // Get the device twin from IoT Hub
    System.out.println("Device twin before update:");
    twinClient.getTwin(device);
    System.out.println(device);
    
    // Update device twin tags if they are different
    // from the existing values
    String currentTags = device.tagsToString();
    if ((!currentTags.contains("region=" + region) && !currentTags.contains("plant=" + plant))) {
      // Create the tags and attach them to the DeviceTwinDevice object
      Set<Pair> tags = new HashSet<Pair>();
      tags.add(new Pair("region", region));
      tags.add(new Pair("plant", plant));
      device.setTags(tags);
    
      // Update the device twin in IoT Hub
      System.out.println("Updating device twin");
      twinClient.updateTwin(device);
    }
    
    // Retrieve the device twin with the tag values from IoT Hub
    System.out.println("Device twin after update:");
    twinClient.getTwin(device);
    System.out.println(device);
    
  14. IoT hub'ında cihaz ikizlerini sorgulamak için try , önceki adımda eklediğiniz koddan sonra aşağıdaki kodu bloğuna ekleyin. Kod iki sorgu çalıştırır. Her sorgu en fazla 100 cihaz döndürür.

    // Query the device twins in IoT Hub
    System.out.println("Devices in Redmond:");
    
    // Construct the query
    SqlQuery sqlQuery = SqlQuery.createSqlQuery("*", SqlQuery.FromType.DEVICES, "tags.plant='Redmond43'", null);
    
    // Run the query, returning a maximum of 100 devices
    Query twinQuery = twinClient.queryTwin(sqlQuery.getQuery(), 100);
    while (twinClient.hasNextDeviceTwin(twinQuery)) {
      DeviceTwinDevice d = twinClient.getNextDeviceTwin(twinQuery);
      System.out.println(d.getDeviceId());
    }
    
    System.out.println("Devices in Redmond using a cellular network:");
    
    // Construct the query
    sqlQuery = SqlQuery.createSqlQuery("*", SqlQuery.FromType.DEVICES, "tags.plant='Redmond43' AND properties.reported.connectivityType = 'cellular'", null);
    
    // Run the query, returning a maximum of 100 devices
    twinQuery = twinClient.queryTwin(sqlQuery.getQuery(), 3);
    while (twinClient.hasNextDeviceTwin(twinQuery)) {
      DeviceTwinDevice d = twinClient.getNextDeviceTwin(twinQuery);
      System.out.println(d.getDeviceId());
    }
    
  15. add-tags-query\src\main\java\com\mycompany\app\App.java dosyasını kaydedin ve kapatın

  16. add-tags-query uygulamasını oluşturun ve hataları düzeltin. Komut isteminizde add-tags-query klasörüne gidin ve aşağıdaki komutu çalıştırın:

    mvn clean package -DskipTests
    

Uygulamaları çalıştırma

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

  1. add-tags-query klasöründeki bir komut isteminde, add-tags-query hizmet uygulamasını çalıştırmak için aşağıdaki komutu çalıştırın:

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

    Etiket ekleme sorgu hizmeti uygulamasını çalıştırmak için komutun çıkışını gösteren ekran görüntüsü.

    Cihaz ikizine eklenen tesis ve bölge etiketlerini görebilirsiniz. İlk sorgu cihazınızı döndürür, ancak ikincisi döndürmez.

  2. simulated-device klasöründeki bir komut isteminde, device twin'e connectivityType bildirilen özelliğini eklemek için aşağıdaki komutu çalıştırın:

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

    Cihaz istemcisi bağlantı türü bildirilen özelliğini ekler

  3. add-tags-query klasöründeki bir komut isteminde, add-tags-query hizmet uygulamasını ikinci kez çalıştırmak için aşağıdaki komutu çalıştırın:

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

    Etiket değerlerini güncelleştirmek ve cihaz sorgularını çalıştırmak için Java IoT Hub hizmet uygulaması

    Cihazınız ioT Hub'a connectivityType özelliğini gönderdiğine göre, ikinci sorgu cihazınızı döndürür.

Bu makalede şunları yapacaksınız:

  • Arka uç uygulamasından etiket olarak cihaz meta verileri eklendi
  • Cihaz ikizinde bildirilen cihaz bağlantı bilgileri
  • SQL benzeri IoT Hub sorgu dilini kullanarak cihaz ikizi bilgilerini sorguladık

Sonraki adımlar

Şunlar hakkında bilgi edinmek için: