İş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:
Cihaz ikizi ve özellikler: Cihaz ikizlerini kullanmaya başlama ve IoT Hub'de 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 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.
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ı dizesiyle 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. 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:
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.
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 döndüğünüzde, ilkeler listesinden yeni ilkenizi seçin.
Görüntülenen yeni bölmede Birincil bağlantı dizesinin kopyala simgesini seçin ve değeri kaydedin.
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.
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 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)
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 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()
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 kapıyı kilitlemek ve ikizi güncelleştirmek üzere işleri tetikleyin:
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, 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.