İş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:
Cihaz ikizi ve özellikleri: Cihaz ikizlerini kullanmaya başlama ve IoT Hub'da cihaz ikizlerini anlama ve kullanma
Doğrudan yöntemler: IoT Hub geliştirici kılavuzu - doğrudan yöntemler
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.
Komut isteminizde aşağıdaki komutu çalıştırarak azure-iot-device paketini yükleyin:
pip install azure-iot-device
Metin düzenleyicisi kullanarak çalışma dizininizde yeni bir simDevice.py dosyası oluşturun.
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}"
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
Ö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()
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:
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.
IoT hub'ınızın sol tarafındaki bölmede Paylaşılan erişim ilkeleri'ni seçin.
İlke listesinin üst kısmındaki menüden Paylaşılan erişim ilkesi ekle'yi seçin.
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.
Paylaşılan erişim ilkeleri sayfasına geri dönüp ilke listesinden yeni ilkenizi seçin.
Görüntülenen yeni bölmede Birincil bağlantı dizesi için kopyala simgesini seçin ve değeri kaydedin.
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.
Komut isteminizde aşağıdaki komutu çalıştırarak azure-iot-hub paketini yükleyin:
pip install azure-iot-hub
Metin düzenleyicisi kullanarak çalışma dizininizde yeni bir scheduleJobService.py dosyası oluşturun.
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)
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)
İş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()
scheduleJobService.py dosyasını kaydedin ve kapatın.
Uygulamaları çalıştırma
Şimdi uygulamaları çalıştırmaya hazırsınız.
Ç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
Ç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
Doğrudan yönteme cihaz yanıtlarını ve cihaz ikizlerinin konsolda güncelleştirildiğini görürsünüz.
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.