جدولة وبث المهام (Python)
استخدم Azure IoT Hub لجدولة المهام التي تحدث ملايين الأجهزة وتعقبها. استخدام الوظائف لإجراء ما يلي:
- تحديث الخصائص المطلوبة
- تحديث العلامات
- استدعاء أساليب مباشرة
من الناحية المفاهيمية، تغلف الوظيفة أحد هذه الإجراءات وتتتبع تقدم التنفيذ مقابل مجموعة من الأجهزة، والتي يتم تحديدها بواسطة استعلام مزدوج للجهاز. على سبيل المثال، يمكن للتطبيق الخلفي استخدام وظيفة لاستدعاء طريقة إعادة التشغيل على 10000 جهاز، محدداً بواسطة استعلام مزدوج للجهاز ومجدولاً في وقت لاحق. يمكن لهذا التطبيق بعد ذلك تتبع التقدم حيث يتلقى كل جهاز من هذه الأجهزة أسلوب إعادة التشغيل وينفذه.
في المقالات التالية نتعرف على المزيد حول كل من هذه الإمكانات:
توأم الجهاز وخصائصه: بدء استخدام توائم الجهاز وفهم واستخدام توائم الجهاز في IoT Hub
الأساليب المباشرة: دليل مطور IoT Hub - الأساليب المباشرة
ملاحظة
الميزات الموضحة في هذه المقالة متوفرة فقط في المستوى القياسي لـ IoT Hub. لمزيد من المعلومات حول مستويات IoT Hub الأساسية والقياسية/المجانية، راجع اختيار طبقة IoT Hub المناسبة للحل الخاص بك.
توضح لك هذه المقالة كيفية إنشاء تطبيقين من تطبيقات Python:
تطبيق جهاز محاكاة Python simDevice.py، ينفذ أسلوبًا مباشرًا يسمى lockDoor، والذي يمكن استدعاؤه بواسطة التطبيق الخلفي.
تطبيق وحدة تحكم Python، scheduleJobService.py، الذي ينشئ وظيفتين. تستدعي إحدى الوظائف الأسلوب المباشر lockDoor وترسل مهمة أخرى تحديثات الخصائص المطلوبة إلى أجهزة متعددة.
ملاحظة
راجع Azure IoT SDKs لمزيد من المعلومات حول أدوات SDK المتوفرة لإنشاء كل من الجهاز والتطبيقات الخلفية.
المتطلبات الأساسية
حساب Azure نشط. (إذا لم يكن لديك حساب، فيمكنك إنشاء حساب مجاني خلال دقيقتين فقط.)
مركز IoT. أنشئ واحدًا باستخدام CLI أو مدخل Azure.
جهاز مسجل. سجَل واحداً في مدخل Microsoft Azure.
يوصى بإصدار 3.7 من Python أو أحدث. تأكد من استخدام التثبيت 32 بت أو 64 بت كما هو مطلوب من قبل الإعداد الخاص بك. عند المطالبة في أثناء التثبيت، تأكد من إضافة Python إلى متغيرات البيئة الخاصة بالنظام الأساسي.
إنشاء تطبيق جهاز محاكاة
في هذا القسم، تقوم بإنشاء تطبيق وحدة تحكم Python يستجيب لطريقة مباشرة تستدعيها السحابة، والتي تقوم بتشغيل طريقة محاكاة lockDoor.
في موجه الأوامر، قم بتشغيل الأمر التالي لتثبيت حزمة azure-iot-device:
pip install azure-iot-device
باستخدام محرر نص، قم بإنشاء ملف simDevice.py جديد في دليل العمل الخاص بك.
أضف
import
العبارات والمتغيرات التالية في بداية ملف SimulatedDevice.py. استبدلdeviceConnectionString
بسلسلة الاتصال الخاصة بالجهاز الذي أنشأته أعلاه:import time from azure.iot.device import IoTHubDeviceClient, MethodResponse CONNECTION_STRING = "{deviceConnectionString}"
حدد الدالة التالية التي ستقوم بإنشاء مثيل للعميل وتكوينه للاستجابة لأسلوب lockDoor، بالإضافة إلى تلقي تحديثات الجهاز المزدوج:
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
أضف التعليمات البرمجية التالية لتشغيل النموذج:
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.js.
ملاحظة
للحفاظ على بساطة الأمور، لا تنفذ هذه المقالة سياسة إعادة المحاولة. في التعليمات البرمجية للإنتاج، يجب عليك تنفيذ نهج إعادة المحاولة (مثل التراجع الأسي)، كما هو مقترح في المقالة، معالجة الأخطاء العابرة.
الحصول على سلسلة اتصال IoT Hub
في هذه المقالة، يمكنك إنشاء خدمة خلفية تستدعي أسلوبًا مباشرًا على جهاز. تحتاج الخدمة إلى إذن اتصال الخدمة لاستدعاء أسلوب مباشر على جهاز. تحتاج الخدمة أيضا إلى أذونات قراءة السجلوكتابة السجل لقراءة وكتابة سجل الهوية. لا توجد نهج وصول مشتركة افتراضية تحتوي على هذين الإذنين فقط، لذلك تحتاج إلى إنشاء نهج.
لإنشاء نهج وصول مشتركة تمنح أذونات اتصال الخدمة وقراءة السجل و كتابة السجل والحصول على سلسلة اتصال لهذه النهج، اتبع الخطوات التالية:
في مدخل Azure، افتح مركز إنترنت الأشياء الخاص بك. أسهل طريقة للوصول إلى مركز IoT الخاص بك هي تحديد مجموعات الموارد، وتحديد مجموعة الموارد حيث يوجد مركز IoT، ثم تحديد مركز IoT الخاص بك من قائمة الموارد.
في الجزء الأيسر من مركز إنترنت الأشياء، حدد نهج الوصول المشترك.
من القائمة العليا أعلى قائمة النهج، حدد إضافة نهج الوصول المشترك.
ضمن إضافة نهج وصول مشترك، أدخل اسمًا وصفيًا للنهج الخاص بك، مثل serviceAndRegistryReadWrite. ضمن الأذونات، حدد كتابة تسجيل وتوصيل الخدمة (يتم تحديد قراءة التسجيل تلقائيًا عند تحديد كتابة تسجيل) ثم حدد إضافة.
مرة أخرى في صفحة نهج الوصول المشترك، حدد النهج الجديد من قائمة النهج.
في الجزء الجديد الذي يظهر، حدد رمز النسخ لسلسلة الاتصال الأساسي واحفظ القيمة.
لمزيد من المعلومات حول نهج الوصول المشترك لمركز IoT والأذونات، راجع التحكم في الوصول والأذونات.
جدولة الوظائف لاستدعاء طريقة مباشرة وتحديث خصائص جهاز مزدوج
في هذا القسم، تقوم بإنشاء تطبيق وحدة تحكم Python الذي يبدأ تشغيل lockDoor عن بُعد على جهاز باستخدام طريقة مباشرة وتحديث خصائص الجهاز المزدوج.
في موجه الأوامر، قم بتشغيل الأمر التالي لتثبيت حزمة azure-iot-hub :
pip install azure-iot-hub
باستخدام محرر نص، قم بإنشاء ملف scheduleJobService.py جديد في دليل العمل الخاص بك.
أضف
import
العبارات والمتغيرات التالية في بداية ملف scheduleJobService.py. استبدال{IoTHubConnectionString}
قيمة العنصر النائب بسلسلة اتصال مركز IoT التي قمت بنسخها سابقًا في الحصول على سلسلة اتصال لوحة الوصل لـ IoT. استبدل العنصر النائب{deviceId}
بمعرف الجهاز (الاسم) من جهازك المسجل: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)
أضف الأساليب التالية لتشغيل المهام التي تستدعي الأسلوب المباشر والجهاز المزدوج:
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)
أضف التعليمات البرمجية التالية لجدولة المهام وتحديث حالة المهمة. قم أيضا بتضمين الروتين
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.js.
تشغيل التطبيقات
أنت الآن جاهز لتشغيل التطبيقات.
في موجه الأوامر في دليل العمل الخاص بك، قم بتشغيل الأمر التالي لبدء الاستماع إلى أسلوب إعادة التشغيل المباشر:
python simDevice.py
في موجه أوامر آخر في دليل العمل الخاص بك، قم بتشغيل الأمر التالي لتشغيل المهام لتأمين الباب وتحديث الجهاز المزدوج:
python scheduleJobService.py
ترى استجابات الجهاز للأسلوب المباشر وتحديث الجهاز المزدوج في وحدة التحكم.
الخطوات التالية
في هذه المقالة، قمت بجدولة المهام لتشغيل أسلوب مباشر وتحديث خصائص توأم الجهاز.
لمتابعة استكشاف IoT Hub وأنماط إدارة الجهاز، قم بتحديث صورة في البرنامج التعليمي Device Update for Azure IoT Hub باستخدام Raspberry Pi 3 B + صورة مرجعية.
الملاحظات
https://aka.ms/ContentUserFeedback.
قريبًا: خلال عام 2024، سنتخلص تدريجيًا من GitHub Issues بوصفها آلية إرسال ملاحظات للمحتوى ونستبدلها بنظام ملاحظات جديد. لمزيد من المعلومات، راجعإرسال الملاحظات وعرضها المتعلقة بـ