Aracılığıyla paylaş


IoT Hub modül kimliği ve modül ikizi (Python) ile çalışmaya başlama

Modül kimlikleri ve modül ikizleri , Azure IoT Hub cihaz kimliklerine ve cihaz ikizlerine benzer, ancak daha ayrıntılı bir ayrıntı sağlar. Azure IoT Hub cihaz kimlikleri ve cihaz ikizleri bir arka uç uygulamasının bir cihazı yapılandırmasına ve cihazın koşullarına görünürlük sağlamasına olanak tanırken modül kimlikleri ve modül ikizleri bir cihazın tek tek bileşenleri için bu özellikleri sağlar. İşletim sistemi cihazları veya üretici yazılımı cihazları gibi birden çok bileşeni olan yetenekli cihazlarda, her bileşen için yalıtılmış yapılandırma ve koşullar sağlar.

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.

Bu makalenin sonunda üç Python uygulamasına sahipsiniz:

  • CreateModule: Cihaz ve modül istemcilerinizi bağlamak için bir cihaz kimliği, modül kimliği ve ilişkili güvenlik anahtarları oluşturur.

  • UpdateModuleTwinDesiredProperties: Güncelleştirilmiş modül ikizini, istenen özellikleri IoT Hub'ınıza gönderir.

  • ReceiveModuleTwinDesiredPropertiesPatch: modül ikizini alır, cihazınızda istenen özellikler düzeltme eki.

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

  • Etkin bir Azure hesabı. (Hesabınız yoksa, yalnızca birkaç dakika içinde ücretsiz bir hesap oluşturabilirsiniz.)

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

  • Python sürüm 3.7 veya üzeri önerilir. Kurulumunuzun gereksinimine uygun olarak 32 bit veya 64 bit yüklemeyi kullanmaya dikkat edin. Yükleme sırasında istendiğinde, platforma özgü ortam değişkeninize Python’u eklediğinizden emin olun.

Modül kimlik doğrulaması

Modül kimliklerinin kimliğini doğrulamak için simetrik anahtarları veya X.509 sertifikalarını kullanabilirsiniz. X.509 sertifika kimlik doğrulaması için modülün sertifikasının gibi CN=<deviceid>/<moduleid>biçimlendirilmiş ortak adı (CN) olmalıdır. Örneğin:

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

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

Bu makalede, kimlik kayıt defterine bir cihaz ekleyen ve ardından bu cihaza bir modül ekleyen bir arka uç hizmeti oluşturacaksınız. Bu hizmet, kayıt defteri yazma iznini (kayıt defteri okumayı da içerir) gerektirir. Ayrıca yeni oluşturulan modülün modül ikizine istenen özellikleri ekleyen bir hizmet oluşturursunuz. Bu hizmetin hizmet bağlama iznine ihtiyacı var. Bu izinleri tek tek veren varsayılan paylaşılan erişim ilkeleri olsa da, bu bölümde bu izinlerin ikisini de içeren özel bir paylaşılan erişim ilkesi oluşturursunuz.

Hizmet bağlama ve kayıt defteri yazma 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ündeki menüden Paylaşılan erişim ilkesi ekle'yi seçin.

  4. Paylaşılan erişim ilkesi ekle'nin altında, ilkeniz için serviceAndRegistryReadWrite gibi açıklayıcı bir ad girin. İzinler'in altında Kayıt Defteri Yazma ve Hizmet Bağlama'yı ve ardından Ekle'yi seçin. (Kayıt Defteri Yazma'yi seçtiğinizde Kayıt Defteri Okuma izni otomatik olarak eklenir.)

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

  5. İlke listesinden yeni ilkenizi seçin.

  6. Paylaşılan erişim anahtarları'nın altında Birincil bağlantı dizesi kopyala 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.

Önemli

Bu makale, paylaşılan erişim imzası kullanarak hizmete bağlanma adımlarını içerir. Bu kimlik doğrulama yöntemi test ve değerlendirme için uygundur, ancak Microsoft Entra ID veya yönetilen kimliklerle bir hizmette kimlik doğrulaması yapmak daha güvenli bir yaklaşımdır. Daha fazla bilgi edinmek için bkz . En iyi güvenlik yöntemleri > Bulut güvenliği.

IoT Hub'da cihaz kimliği ve modül kimliği oluşturma

Bu bölümde, IoT hub'ınızdaki kimlik kayıt defterinde cihaz kimliği ve modül kimliği oluşturan bir Python hizmet uygulaması oluşturacaksınız. Cihaz veya modül, kimlik kayıt defterinde bir girdisi olmadığı sürece IoT hub'ına bağlanamaz. Daha fazla bilgi için bkz . IoT hub'ınızdaki kimlik kayıt defterini anlama. Bu konsol uygulamasını çalıştırdığınızda, hem cihaz hem de modül için benzersiz bir kimlik ve anahtar oluşturur. Kimlik ve anahtar büyük/küçük harfe duyarlıdır. Cihazınız ve modülünüz, IoT Hub’ına cihazdan buluta iletileri gönderdiğinde kendisini tanımlamak için bu değerleri kullanır.

Önemli

Bu makale, simetrik anahtar kimlik doğrulaması olarak da adlandırılan paylaşılan erişim imzasını kullanarak bir cihazı bağlama adımlarını içerir. Bu kimlik doğrulama yöntemi test ve değerlendirme için uygundur, ancak X.509 sertifikalarını kullanarak bir cihazın kimliğini doğrulamak daha güvenli bir yaklaşımdır. Daha fazla bilgi edinmek için bkz . En iyi güvenlik yöntemleri > Bağlantı güvenliği.

  1. Komut isteminizde aşağıdaki komutu çalıştırarak azure-iot-hub paketini yükleyin:

    pip install azure-iot-hub
    
  2. Komut isteminizde aşağıdaki komutu çalıştırarak msrest paketini yükleyin. HTTPOperationError özel durumlarını yakalamak için bu pakete ihtiyacınız var.

    pip install msrest
    
  3. Metin düzenleyicisi kullanarak çalışma dizininizde CreateModule.py adlı bir dosya oluşturun.

  4. Python dosyanıza aşağıdaki kodu ekleyin. YourIoTHubConnectionString değerini IoT hub bağlantı dizesi alma bölümünde kopyaladığınız bağlantı dizesi değiştirin.

    import sys
    from msrest.exceptions import HttpOperationError
    from azure.iot.hub import IoTHubRegistryManager
    
    CONNECTION_STRING = "YourIotHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        try:
            # CreateDevice - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            device_state = "enabled"
            new_device = iothub_registry_manager.create_device_with_sas(
                DEVICE_ID, primary_key, secondary_key, device_state
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the device already exists.
                new_device = iothub_registry_manager.get_device(DEVICE_ID)
            else:
                raise
    
        print("device <" + DEVICE_ID +
              "> has primary key = " + new_device.authentication.symmetric_key.primary_key)
    
        try:
            # CreateModule - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            managed_by = ""
            new_module = iothub_registry_manager.create_module_with_sas(
                DEVICE_ID, MODULE_ID, managed_by, primary_key, secondary_key
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the module already exists.
                new_module = iothub_registry_manager.get_module(DEVICE_ID, MODULE_ID)
            else:
                raise
    
        print("device/module <" + DEVICE_ID + "/" + MODULE_ID +
              "> has primary key = " + new_module.authentication.symmetric_key.primary_key)
    
    except Exception as ex:
        print("Unexpected error {0}".format(ex))
    except KeyboardInterrupt:
        print("IoTHubRegistryManager sample stopped")
    
  5. Komut isteminizde aşağıdaki komutu çalıştırın:

    python CreateModule.py
    

Bu uygulama myFirstDevice kimliğine sahip bir cihaz kimliği ve myFirstDevice cihazı altında myFirstModule kimliğine sahip bir modül kimliği oluşturur. (Cihaz veya modül kimliği kimlik kayıt defterinde zaten varsa, kod yalnızca mevcut cihaz veya modül bilgilerini alır.) Uygulama, her kimliğin kimliğini ve birincil anahtarını görüntüler.

Not

IoT Hub kimlik kayıt defteri yalnızca IoT hub'ına güvenli erişim sağlamak amacıyla cihaz ve modül kimliklerini depolar. Kimlik kayıt defteri, cihaz kimliklerini ve anahtarlarını güvenlik kimlik bilgileri olarak kullanmak için depolar. Kimlik kayıt defterinin her cihaz için depoladığı etkin/devre dışı bayrağını kullanarak, ilgili cihaza erişimi devre dışı bırakabilirsiniz. Uygulamanızın cihaza özgü diğer meta verileri depolaması gerekiyorsa uygulamaya özgü bir depo kullanması gerekir. Modül kimlikleri için etkin/devre dışı bayrağı yoktur. Daha fazla bilgi için bkz . IoT hub'ınızdaki kimlik kayıt defterini anlama.

Python hizmet SDK'sını kullanarak modül ikizini güncelleştirme

Bu bölümde, modül ikizi istenen özelliklerini güncelleştiren bir Python hizmet uygulaması oluşturacaksınız.

  1. Komut isteminizde aşağıdaki komutu çalıştırarak azure-iot-hub paketini yükleyin. Önceki bölümde azure-iot-hub paketini yüklediyseniz bu adımı atlayabilirsiniz.

    pip install azure-iot-hub
    
  2. Metin düzenleyicisi kullanarak çalışma dizininizde UpdateModuleTwinDesiredProperties.py adlı bir dosya oluşturun.

  3. Python dosyanıza aşağıdaki kodu ekleyin. YourIoTHubConnectionString değerini IoT hub bağlantı dizesi alma bölümünde kopyaladığınız bağlantı dizesi değiştirin.

    import sys
    from azure.iot.hub import IoTHubRegistryManager
    from azure.iot.hub.models import Twin, TwinProperties
    
    CONNECTION_STRING = "YourIoTHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        module_twin = iothub_registry_manager.get_module_twin(DEVICE_ID, MODULE_ID)
        print ( "" )
        print ( "Module twin properties before update    :" )
        print ( "{0}".format(module_twin.properties) )
    
        # Update twin
        twin_patch = Twin()
        twin_patch.properties = TwinProperties(desired={"telemetryInterval": 122})
        updated_module_twin = iothub_registry_manager.update_module_twin(
            DEVICE_ID, MODULE_ID, twin_patch, module_twin.etag
        )
        print ( "" )
        print ( "Module twin properties after update     :" )
        print ( "{0}".format(updated_module_twin.properties) )
    
    except Exception as ex:
        print ( "Unexpected error {0}".format(ex) )
    except KeyboardInterrupt:
        print ( "IoTHubRegistryManager sample stopped" )
    

Cihaz tarafında güncelleştirmeleri alma

Bu bölümde, cihazınızda modül ikizi istenen özellikler güncelleştirmesini almak için bir Python uygulaması oluşturacaksınız.

  1. Modülünüzü bağlantı dizesi alın. Azure portalında IoT Hub'ınıza gidin ve sol bölmede Cihazlar'ı seçin. Cihaz listesinden myFirstDevice öğesini seçin ve açın. Modül kimlikleri'nin altında myFirstModule öğesini seçin. Bağlantı dizesi (birincil anahtar) için kopyalama simgesini seçin. Aşağıdaki adımda bu bağlantı dizesi gerekir.

    Azure portalında Modül Kimliği Ayrıntıları sayfasının ekran görüntüsü.

  2. Komut isteminizde aşağıdaki komutu çalıştırarak azure-iot-device paketini yükleyin:

    pip install azure-iot-device
    
  3. Metin düzenleyicisi kullanarak çalışma dizininizde ReceiveModuleTwinDesiredPropertiesPatch.py adlı bir dosya oluşturun.

  4. Python dosyanıza aşağıdaki kodu ekleyin. YourModuleConnectionString değerini 1. adımda kopyaladığınız modül bağlantı dizesi değiştirin.

    import time
    from azure.iot.device import IoTHubModuleClient
    
    CONNECTION_STRING = "YourModuleConnectionString"
    
    
    def twin_patch_handler(twin_patch):
        print("")
        print("Twin desired properties patch received:")
        print(twin_patch)
    
    
    def main():
        print ("Starting the IoT Hub Python sample...")
        client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for commands, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_twin_desired_properties_patch_received = twin_patch_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoTHubModuleClient sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    if __name__ == '__main__':
        main()
    

Uygulamaları çalıştırma

Bu bölümde ReceiveModuleTwinDesiredPropertiesPatch cihaz uygulamasını çalıştıracak ve ardından modülünüzün istenen özelliklerini güncelleştirmek için UpdateModuleTwinDesiredProperties hizmet uygulamasını çalıştıracaksınız.

  1. Bir komut istemi açın ve cihaz uygulamasını çalıştırın:

    python ReceiveModuleTwinDesiredPropertiesPatch.py
    

    Cihaz uygulaması ilk çıkışı

  2. Ayrı bir komut istemi açın ve hizmet uygulamasını çalıştırın:

    python UpdateModuleTwinDesiredProperties.py
    

    TelemetryInterval desired özelliğinin hizmet uygulaması çıkışınızdaki güncelleştirilmiş modül ikizinde göründüğüne dikkat edin:

    Hizmet uygulaması çıkışı

    Aynı özellik, cihaz uygulama çıkışınızda alınan istenen özellikler düzeltme ekinde görünür:

    Cihaz uygulaması çıkışı istenen özellikler düzeltme ekini gösteriyor

Sonraki adımlar

IoT Hub’ı kullanmaya başlamak ve diğer IoT senaryolarını keşfetmek için bkz: