Share via


İş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 cihaz ikizi sorgusu tarafından tanımlanan bir cihaz kümesinde yürütmenin ilerleme durumunu izler. Örneğin bir arka uç uygulaması, bir cihaz ikizi sorgusu tarafından belirtilen ve gelecekte 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 aldığında ve 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 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ı 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 python konsol uygulaması. Bir iş lockDoor doğrudan yöntemini çağırır ve başka bir iş 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.)

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

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

  • 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 sanal bir lockDoor yöntemini tetikleyen doğrudan bir yönteme yanıt veren bir Python konsol uygulaması oluşturacaksınız.

  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ı dizesiyle değiştirin deviceConnectionString :

    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. Geçici Hata İşleme makalesinde önerilen şekilde üretim kodunda yeniden deneme ilkeleri (üstel geri çekilme gibi) uygulamanız gerekir.

IoT Hub bağlantı dizesini alma

Bu makalede, bir cihazda doğrudan yöntem çağıran ve cihaz ikizini güncelleştiren bir arka uç hizmeti oluşturursunuz. Hizmet, bir cihazda doğrudan yöntemi ç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 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 IoT Hub yeni erişim ilkesi ekleme işleminin ekran görüntüsü.

  5. Paylaşılan erişim ilkeleri sayfasına döndüğünüzde, ilkeler listesinden yeni ilkenizi seçin.

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

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

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 aynı zamanda 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 bağlantı dizesini alma bölümünde kopyaladığınız IoT hub bağlantı dizesiyle 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 dahil edin main :

    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 kapıyı kilitlemek ve ikizi güncelleştirmek üzere işleri tetikleyin:

    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 İş örneği 1 -- cihaz çıkışı

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

Sonraki adımlar

Bu makalede, işleri doğrudan bir yöntemi çalıştıracak ve cihaz ikizinin özelliklerini güncelleştirecek şekilde zamanlamıştını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.