جدولة وبث المهام (Python)

استخدم Azure IoT Hub لجدولة المهام التي تحدث ملايين الأجهزة وتعقبها. استخدام الوظائف لإجراء ما يلي:

  • تحديث الخصائص المطلوبة
  • تحديث العلامات
  • استدعاء أساليب مباشرة

من الناحية المفاهيمية، تغلف الوظيفة أحد هذه الإجراءات وتتتبع تقدم التنفيذ مقابل مجموعة من الأجهزة، والتي يتم تحديدها بواسطة استعلام مزدوج للجهاز. على سبيل المثال، يمكن للتطبيق الخلفي استخدام وظيفة لاستدعاء طريقة إعادة التشغيل على 10000 جهاز، محدداً بواسطة استعلام مزدوج للجهاز ومجدولاً في وقت لاحق. يمكن لهذا التطبيق بعد ذلك تتبع التقدم حيث يتلقى كل جهاز من هذه الأجهزة أسلوب إعادة التشغيل وينفذه.

في المقالات التالية نتعرف على المزيد حول كل من هذه الإمكانات:

ملاحظة

الميزات الموضحة في هذه المقالة متوفرة فقط في المستوى القياسي لـ 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.

  1. في موجه الأوامر، قم بتشغيل الأمر التالي لتثبيت حزمة azure-iot-device:

    pip install azure-iot-device
    
  2. باستخدام محرر نص، قم بإنشاء ملف simDevice.py جديد في دليل العمل الخاص بك.

  3. أضف import العبارات والمتغيرات التالية في بداية ملف SimulatedDevice.py. استبدل deviceConnectionString بسلسلة الاتصال الخاصة بالجهاز الذي أنشأته أعلاه:

    import time
    from azure.iot.device import IoTHubDeviceClient, MethodResponse
    
    CONNECTION_STRING = "{deviceConnectionString}"
    
  4. حدد الدالة التالية التي ستقوم بإنشاء مثيل للعميل وتكوينه للاستجابة لأسلوب 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
    
  5. أضف التعليمات البرمجية التالية لتشغيل النموذج:

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

ملاحظة

للحفاظ على بساطة الأمور، لا تنفذ هذه المقالة سياسة إعادة المحاولة. في التعليمات البرمجية للإنتاج، يجب عليك تنفيذ نهج إعادة المحاولة (مثل التراجع الأسي)، كما هو مقترح في المقالة، معالجة الأخطاء العابرة.

الحصول على سلسلة اتصال IoT Hub

في هذه المقالة، يمكنك إنشاء خدمة خلفية تستدعي أسلوبًا مباشرًا على جهاز. تحتاج الخدمة إلى إذن اتصال الخدمة لاستدعاء أسلوب مباشر على جهاز. تحتاج الخدمة أيضا إلى أذونات قراءة السجلوكتابة السجل لقراءة وكتابة سجل الهوية. لا توجد نهج وصول مشتركة افتراضية تحتوي على هذين الإذنين فقط، لذلك تحتاج إلى إنشاء نهج.

لإنشاء نهج وصول مشتركة تمنح أذونات اتصال الخدمة وقراءة السجل و كتابة السجل والحصول على سلسلة اتصال لهذه النهج، اتبع الخطوات التالية:

  1. في مدخل Azure، افتح مركز إنترنت الأشياء الخاص بك. أسهل طريقة للوصول إلى مركز IoT الخاص بك هي تحديد مجموعات الموارد، وتحديد مجموعة الموارد حيث يوجد مركز IoT، ثم تحديد مركز IoT الخاص بك من قائمة الموارد.

  2. في الجزء الأيسر من مركز إنترنت الأشياء، حدد نهج الوصول المشترك.

  3. من القائمة العليا أعلى قائمة النهج، حدد إضافة نهج الوصول المشترك.

  4. ضمن إضافة نهج وصول مشترك، أدخل اسمًا وصفيًا للنهج الخاص بك، مثل serviceAndRegistryReadWrite. ضمن الأذونات، حدد كتابة تسجيل وتوصيل الخدمة (يتم تحديد قراءة التسجيل تلقائيًا عند تحديد كتابة تسجيل) ثم حدد إضافة.

    لقطة شاشة لكيفية إضافة نهج وصول جديد في IoT Hub لمدخل Microsoft Azure.

  5. مرة أخرى في صفحة نهج الوصول المشترك، حدد النهج الجديد من قائمة النهج.

  6. في الجزء الجديد الذي يظهر، حدد رمز النسخ لسلسلة الاتصال الأساسي واحفظ القيمة.

    لقطة شاشة لكيفية الحصول على سلسلة الاتصال الأساسية من نهج وصول في IoT Hub لمدخل Microsoft Azure.

لمزيد من المعلومات حول نهج الوصول المشترك لمركز IoT والأذونات، راجع التحكم في الوصول والأذونات.

جدولة الوظائف لاستدعاء طريقة مباشرة وتحديث خصائص جهاز مزدوج

في هذا القسم، تقوم بإنشاء تطبيق وحدة تحكم Python الذي يبدأ تشغيل lockDoor عن بُعد على جهاز باستخدام طريقة مباشرة وتحديث خصائص الجهاز المزدوج.

  1. في موجه الأوامر، قم بتشغيل الأمر التالي لتثبيت حزمة azure-iot-hub :

    pip install azure-iot-hub
    
  2. باستخدام محرر نص، قم بإنشاء ملف scheduleJobService.py جديد في دليل العمل الخاص بك.

  3. أضف 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)
    
    
  4. أضف الأساليب التالية لتشغيل المهام التي تستدعي الأسلوب المباشر والجهاز المزدوج:

    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. أضف التعليمات البرمجية التالية لجدولة المهام وتحديث حالة المهمة. قم أيضا بتضمين الروتين 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.js.

تشغيل التطبيقات

أنت الآن جاهز لتشغيل التطبيقات.

  1. في موجه الأوامر في دليل العمل الخاص بك، قم بتشغيل الأمر التالي لبدء الاستماع إلى أسلوب إعادة التشغيل المباشر:

    python simDevice.py
    
  2. في موجه أوامر آخر في دليل العمل الخاص بك، قم بتشغيل الأمر التالي لتشغيل المهام لتأمين الباب وتحديث الجهاز المزدوج:

    python scheduleJobService.py
    
  3. ترى استجابات الجهاز للأسلوب المباشر وتحديث الجهاز المزدوج في وحدة التحكم.

    نموذج 1 لمهمة مركز IoT -- إخراج الجهاز

    نموذج 2 لمهمة مركز IoT -- إخراج الجهاز

الخطوات التالية

في هذه المقالة، قمت بجدولة المهام لتشغيل أسلوب مباشر وتحديث خصائص توأم الجهاز.

لمتابعة استكشاف IoT Hub وأنماط إدارة الجهاز، قم بتحديث صورة في البرنامج التعليمي Device Update for Azure IoT Hub باستخدام Raspberry Pi 3 B + صورة مرجعية.