Aracılığıyla paylaş


İşleri zamanlama ve yayınlama (Python)

Milyonlarca cihazı güncelleştiren işleri zamanlamak ve izlemek için Azure IoT Hub'ı kullanın. İşleri kullanarak:

  • İstenen özellikleri güncelleştirme
  • Etiketleri güncelleştirme
  • Doğrudan yöntemleri çağırma

Kavramsal olarak, bir iş bu eylemlerden birini sarmalar ve yürütmenin ilerleme durumunu cihaz ikizi sorgusu tarafından tanımlanan bir cihaz kümesine göre izler. Örneğin bir arka uç uygulaması, bir cihaz ikizi sorgusu tarafından belirtilen ve gelecekteki bir zamanda zamanlanan 10.000 cihazda yeniden başlatma yöntemini çağırmak için bir iş kullanabilir. Bu uygulama daha sonra bu cihazların her biri yeniden başlatma yöntemini alıp yürütürken ilerleme durumunu izleyebilir.

Bu özelliklerin her biri hakkında daha fazla bilgiyi şu makalelerde bulabilirsiniz:

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 makalede iki Python uygulaması oluşturma gösterilmektedir:

  • simDevice.py, arka uç uygulaması tarafından çağrılabilen lockDoor adlı doğrudan bir yöntem uygulayan python sanal cihaz uygulaması.

  • İki iş oluşturan scheduleJobService.py bir Python konsol uygulaması. Bir iş lockDoor doğrudan yöntemini çağırır ve başka bir iş de istenen özellik güncelleştirmelerini birden çok cihaza gönderir.

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.

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

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

Sanal cihaz uygulaması oluşturma

Bu bölümde, bulut tarafından çağrılan ve simülasyon lockDoor yöntemini tetikleyen doğrudan bir yönteme yanıt veren bir Python konsol uygulaması oluşturacaksınız.

Ö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-device paketini yükleyin:

    pip install azure-iot-device
    
  2. Metin düzenleyicisi kullanarak çalışma dizininizde yeni bir simDevice.py dosyası oluşturun.

  3. simDevice.py dosyasının başlangıcına aşağıdaki import deyimleri ve değişkenleri ekleyin. değerini yukarıda oluşturduğunuz cihazın bağlantı dizesi ile değiştirindeviceConnectionString:

    import time
    from azure.iot.device import IoTHubDeviceClient, MethodResponse
    
    CONNECTION_STRING = "{deviceConnectionString}"
    
  4. Bir istemcinin örneğini oluşturacak ve lockDoor yöntemine yanıt verecek şekilde yapılandıracak ve cihaz ikizi güncelleştirmelerini alacak şekilde yapılandıracak aşağıdaki işlevi tanımlayın:

    def create_client():
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        # Define behavior for responding to the lockDoor direct method
        def method_request_handler(method_request):
            if method_request.name == "lockDoor":
                print("Locking Door!")
    
                resp_status = 200
                resp_payload = {"Response": "lockDoor called successfully"}
                method_response = MethodResponse.create_from_method_request(
                    method_request=method_request,
                    status=resp_status,
                    payload=resp_payload
                )
                client.send_method_response(method_response)
    
        # Define behavior for receiving a twin patch
        def twin_patch_handler(twin_patch):
            print("")
            print("Twin desired properties patch received:")
            print(twin_patch)
    
        # Set the handlers on the client
        try:
            print("Beginning to listen for 'lockDoor' direct method invocations...")
            client.on_method_request_received = method_request_handler
            print("Beginning to listen for updates to the Twin desired properties...")
            client.on_twin_desired_properties_patch_received = twin_patch_handler
        except:
            # If something goes wrong while setting the handlers, clean up the client
            client.shutdown()
            raise
    
  5. Örneği çalıştırmak için aşağıdaki kodu ekleyin:

    def main():
        print ("Starting the IoT Hub Python jobs sample...")
        client = create_client()
    
        print ("IoTHubDeviceClient waiting for commands, press Ctrl-C to exit")
        try:
            while True:
                time.sleep(100)
        except KeyboardInterrupt:
            print("IoTHubDeviceClient sample stopped!")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    
    if __name__ == '__main__':
        main()
    
  6. simDevice.py dosyasını kaydedin ve kapatın.

Not

İşleri basit tutmak 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.

IoT Hub bağlantı dizesi alma

Bu makalede, bir cihazda doğrudan yöntem çağıran ve cihaz ikizini güncelleştiren bir arka uç hizmeti oluşturacaksınız. Hizmet, bir cihazda doğrudan yöntem çağırmak için hizmet bağlanma iznine ihtiyaç duyar. Hizmet ayrıca kimlik kayıt defterini okumak ve yazmak için kayıt defteri okuma ve kayıt defteri yazma izinlerine de ihtiyaç duyar. Yalnızca bu izinleri içeren varsayılan paylaşılan erişim ilkesi yoktur, bu nedenle bir tane oluşturmanız gerekir.

Hizmet bağlama, kayıt defteri okuma 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 IoT hub'ınızı açın. IoT hub'ınıza almanın en kolay yolu Kaynak grupları'nı seçmek, IoT hub'ınızın bulunduğu kaynak grubunu seçmek ve ardından kaynak listesinden IoT hub'ınızı seçmektir.

  2. IoT 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 erişim ilkesi ekle'yi seçin.

  4. Paylaşılan erişim ilkesi ekle bölmesinde, ilkeniz için açıklayıcı bir ad girin; örneğin: serviceAndRegistryReadWrite. İzinler'in altında Kayıt Defteri Yazma ve Hizmet Bağlantısı'nı (Kayıt Defteri Yazma'yı seçtiğinizde Kayıt Defteri Okuma otomatik olarak seçilir) ve ardından Ekle'yi seçin.

    Azure portalının IoT Hub'ına yeni erişim ilkesi ekleme işleminin ekran görüntüsü.

  5. Paylaşılan erişim ilkeleri sayfasına geri dönüp ilke listesinden yeni ilkenizi seçin.

  6. Görüntülenen yeni bölmede Birincil bağlantı dizesi için kopyala simgesini seçin ve değeri kaydedin.

    Azure portalının IoT Hub'ında bir erişim ilkesinden birincil bağlantı dizesi alma işleminin 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.

Doğrudan yöntem çağırmak ve cihaz ikizlerinin özelliklerini güncelleştirmek için işleri zamanlama

Bu bölümde, doğrudan bir yöntem kullanarak bir cihazda uzaktan lockDoor başlatan ve ayrıca cihaz ikizinin istenen özelliklerini güncelleştiren bir Python konsol uygulaması oluşturacaksınız.

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

    pip install azure-iot-hub
    
  2. Metin düzenleyicisi kullanarak çalışma dizininizde yeni bir scheduleJobService.py dosyası oluşturun.

  3. scheduleJobService.py dosyasının başlangıcına aşağıdaki import deyimleri ve değişkenleri ekleyin. Yer tutucuyu {IoTHubConnectionString} Daha önce IoT hub'ını alma bağlantı dizesi'nde kopyaladığınız IoT hub'ı bağlantı dizesi ile değiştirin. Yer tutucuyu {deviceId} kayıtlı cihazınızdaki cihaz kimliği (ad) ile değiştirin:

    import os
    import sys
    import datetime
    import time
    import threading
    import uuid
    import msrest
    
    from azure.iot.hub import IoTHubJobManager, IoTHubRegistryManager
    from azure.iot.hub.models import JobProperties, JobRequest, Twin, TwinProperties, CloudToDeviceMethod
    
    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
    METHOD_NAME = "lockDoor"
    METHOD_PAYLOAD = "{\"lockTime\":\"10m\"}"
    UPDATE_PATCH = {"building":43,"floor":3}
    TIMEOUT = 60
    WAIT_COUNT = 5
    
    # Create IoTHubJobManager
    iothub_job_manager = IoTHubJobManager.from_connection_string(CONNECTION_STRING)
    
    
  4. Doğrudan yöntemi ve cihaz ikizini çağıran işleri çalıştırmak için aşağıdaki yöntemleri ekleyin:

    def device_method_job(job_id, device_id, execution_time):
        print ( "" )
        print ( "Scheduling job: " + str(job_id) )
    
        job_request = JobRequest()
        job_request.job_id = job_id
        job_request.type = "scheduleDeviceMethod"
        job_request.start_time = datetime.datetime.utcnow().isoformat()
        job_request.cloud_to_device_method = CloudToDeviceMethod(method_name=METHOD_NAME, payload=METHOD_PAYLOAD)
        job_request.max_execution_time_in_seconds = execution_time
        job_request.query_condition = "DeviceId in ['{}']".format(device_id)
    
        new_job_response = iothub_job_manager.create_scheduled_job(job_id, job_request)
    
    def device_twin_job(job_id, device_id, execution_time):
        print ( "" )
        print ( "Scheduling job " + str(job_id) )
    
        job_request = JobRequest()
        job_request.job_id = job_id
        job_request.type = "scheduleUpdateTwin"
        job_request.start_time = datetime.datetime.utcnow().isoformat()
        job_request.update_twin = Twin(etag="*", properties=TwinProperties(desired=UPDATE_PATCH))
        job_request.max_execution_time_in_seconds = execution_time
        job_request.query_condition = "DeviceId in ['{}']".format(device_id)
    
        new_job_response = iothub_job_manager.create_scheduled_job(job_id, job_request)
    
    
  5. İşleri zamanlamak ve iş durumunu güncelleştirmek için aşağıdaki kodu ekleyin. Ayrıca yordamı da main ekleyin:

    def iothub_jobs_sample_run():
        try:
            method_job_id = uuid.uuid4()
            device_method_job(method_job_id, DEVICE_ID, TIMEOUT)
    
            print ( "" )
            print ( "Direct method called with Job Id: " + str(method_job_id) )
    
            twin_job_id = uuid.uuid4()
            device_twin_job(twin_job_id, DEVICE_ID, TIMEOUT)
    
            print ( "" )
            print ( "Device twin called with Job Id: " + str(twin_job_id) )
    
            while True:
                print ( "" )
    
                method_job_status = iothub_job_manager.get_scheduled_job(method_job_id)
                print ( "...job " + str(method_job_id) + " " + method_job_status.status )
    
                twin_job_status = iothub_job_manager.get_scheduled_job(twin_job_id)
                print ( "...job " + str(twin_job_id) + " " + twin_job_status.status )
    
                print ( "Job status posted, press Ctrl-C to exit" )
                time.sleep(WAIT_COUNT)
    
        except msrest.exceptions.HttpOperationError as ex:
            print ( "" )
            print ( "Http error {}".format(ex.response.text) )
            return
        except Exception as ex:
            print ( "" )
            print ( "Unexpected error {}".format(ex) )
            return
        except KeyboardInterrupt:
            print ( "" )
            print ( "IoTHubService sample stopped" )
    
    if __name__ == '__main__':
        print ( "Starting the IoT Hub jobs Python sample..." )
        print ( "    Connection string = {0}".format(CONNECTION_STRING) )
        print ( "    Device ID         = {0}".format(DEVICE_ID) )
    
        iothub_jobs_sample_run()
    
  6. scheduleJobService.py dosyasını kaydedin ve kapatın.

Uygulamaları çalıştırma

Şimdi uygulamaları çalıştırmaya hazırsınız.

  1. Çalışma dizininizdeki komut isteminde, yeniden başlatma doğrudan yöntemini dinlemeye başlamak için aşağıdaki komutu çalıştırın:

    python simDevice.py
    
  2. Çalışma dizininizdeki başka bir komut isteminde aşağıdaki komutu çalıştırarak işleri tetikleyip kapıyı kilitleyin ve ikizini güncelleştirin:

    python scheduleJobService.py
    
  3. Doğrudan yönteme cihaz yanıtlarını ve cihaz ikizlerinin konsolda güncelleştirildiğini görürsünüz.

    IoT Hub İşi örnek 1 -- cihaz çıkışı

    IoT Hub İşi örnek 2-- cihaz çıkışı

Sonraki adımlar

Bu makalede, doğrudan bir yöntem çalıştırmak ve cihaz ikizinin özelliklerini güncelleştirmek için işleri zamanladıysanız.

IoT Hub ve cihaz yönetimi desenlerini keşfetmeye devam etmek için Raspberry Pi 3 B+ Başvuru Görüntüsünü kullanarak Azure IoT Hub için Cihaz Güncelleştirmesi öğreticisindeki bir görüntüyü güncelleştirin.