Megosztás a következőn keresztül:


Feladatok ütemezése és közvetítése (Python)

Az Azure IoT Hub használatával ütemezheti és követheti nyomon az eszközök millióit frissítő feladatokat. Feladatok használata:

  • Eszköz kívánt tulajdonságainak frissítése
  • Címkék frissítése
  • Közvetlen metódusok meghívása

A feladatok elméletileg befuttatják az egyik ilyen műveletet, és nyomon követik a végrehajtás folyamatát egy eszközkészleten, amelyet egy ikereszköz-lekérdezés határoz meg. Egy háttéralkalmazás például egy feladattal meghívhat egy újraindítási metódust 10 000 eszközön, amelyet egy ikereszköz-lekérdezés határoz meg, és amelyet egy későbbi időpontban ütemeznek. Az alkalmazás ezután nyomon követheti az előrehaladást, amint az egyes eszközök megkapják és végrehajtják az újraindítási módszert.

Az alábbi cikkekben további információt talál ezekről a képességekről:

Feljegyzés

A cikkben ismertetett funkciók csak az IoT Hub standard szintjén érhetők el. Az alapszintű és standard/ingyenes IoT Hub-szintekről további információt a megoldáshoz megfelelő IoT Hub-szint kiválasztása című témakörben talál.

Ez a cikk bemutatja, hogyan hozhat létre két Python-alkalmazást:

  • Egy Python-szimulált eszközalkalmazás, simDevice.py, amely egy lockDoor nevű közvetlen metódust implementál, amelyet a háttéralkalmazás hívhat meg.

  • Egy Python-konzolalkalmazás, scheduleJobService.py, amely két feladatot hoz létre. Az egyik feladat meghívja a lockDoor közvetlen metódust, egy másik feladat pedig több eszközre küldi a kívánt tulajdonságfrissítéseket.

Feljegyzés

Az eszköz- és háttéralkalmazások készítéséhez elérhető SDK-eszközökről további információt az Azure IoT SDK-kban talál.

Előfeltételek

  • Aktív Azure-fiók. (Ha nincs fiókja, létrehozhat egy ingyenes fiókot néhány perc alatt.)

  • IoT Hub az Azure-előfizetésben. Ha még nem rendelkezik központokkal, kövesse az IoT Hub létrehozása című témakörben leírt lépéseket.

  • Az IoT Hubon regisztrált eszköz. Ha nincs eszköze az IoT Hubon, kövesse az eszköz regisztrálása című témakörben leírt lépéseket.

  • A Python 3.7-es vagy újabb verziója ajánlott. Mindenképp a rendszernek megfelelő, 32 vagy 64 bites telepítést használja. Amikor a rendszer erre kéri, mindenképp adja hozzá a Pythont a platformspecifikus környezeti változóhoz.

Szimulált eszközalkalmazás létrehozása

Ebben a szakaszban létrehoz egy Python-konzolalkalmazást, amely a felhő által hívott közvetlen metódusra válaszol, amely egy szimulált lockDoor metódust aktivál.

  1. A parancssorban futtassa a következő parancsot az azure-iot-device csomag telepítéséhez:

    pip install azure-iot-device
    
  2. Szövegszerkesztővel hozzon létre egy új simDevice.py fájlt a munkakönyvtárban.

  3. Adja hozzá a következő import utasításokat és változókat a simDevice.py fájl elején. Cserélje le deviceConnectionString a fent létrehozott eszköz kapcsolati sztring:

    import time
    from azure.iot.device import IoTHubDeviceClient, MethodResponse
    
    CONNECTION_STRING = "{deviceConnectionString}"
    
  4. Adja meg a következő függvényt, amely példányosít egy ügyfelet, és konfigurálja a lockDoor metódusra való reagáláshoz, valamint az ikereszköz-frissítések fogadásához:

    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. Adja hozzá a következő kódot a minta futtatásához:

    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. Mentse és zárja be a simDevice.py fájlt.

Feljegyzés

Az egyszerűség érdekében ez a cikk nem valósít meg újrapróbálkozési szabályzatot. Az éles kódban újrapróbálkozási szabályzatokat (például exponenciális visszalépést) kell implementálnia, ahogyan azt az Átmeneti hibakezelés című cikk is javasolja.

Az IoT Hub kapcsolati sztring lekérése

Ebben a cikkben létrehoz egy háttérszolgáltatást, amely közvetlen metódust hív meg egy eszközön, és frissíti az ikereszközt. A szolgáltatásnak a szolgáltatás csatlakoztatási engedélyére van szüksége egy közvetlen metódus meghívásához egy eszközön. A szolgáltatásnak olvasási és beállításjegyzék-írási engedélyre is szüksége van az identitásjegyzék olvasásához és írásához. Nincs olyan alapértelmezett megosztott hozzáférési szabályzat, amely csak ezeket az engedélyeket tartalmazza, ezért létre kell hoznia egyet.

Ha olyan megosztott hozzáférési szabályzatot szeretne létrehozni, amely szolgáltatás-kapcsolódási, beállításjegyzék-olvasási és beállításjegyzék-írási engedélyeket biztosít, és kapcsolati sztring szeretne beszerezni ehhez a szabályzathoz, kövesse az alábbi lépéseket:

  1. Nyissa meg az IoT Hubot az Azure Portalon. Az IoT Hub eléréséhez a legegyszerűbben úgy érheti el, ha kijelöli az erőforráscsoportokat, kiválasztja azt az erőforráscsoportot, amelyben az IoT Hub található, majd az erőforrások listájából válassza ki az IoT Hubot.

  2. Az IoT Hub bal oldali ablaktábláján válassza a Megosztott hozzáférési szabályzatok lehetőséget.

  3. A szabályzatok listája feletti felső menüben válassza a Megosztott hozzáférési szabályzat hozzáadása lehetőséget.

  4. A Megosztott hozzáférési szabályzat hozzáadása panelen adjon meg egy leíró nevet a szabályzatnak, például: serviceAndRegistryReadWrite. Az Engedélyek területen válassza a Beállításjegyzék írása és a Service Connect lehetőséget (a beállításjegyzék olvasása automatikusan ki van jelölve a Beállításjegyzék írása lehetőség kiválasztásakor), majd válassza a Hozzáadás lehetőséget.

    Képernyőkép arról, hogyan adhat hozzá új hozzáférési szabályzatot az Azure Portal IoT Hubjában.

  5. A Megosztott hozzáférési szabályzatok lapon válassza ki az új szabályzatot a szabályzatok listájából.

  6. A megjelenő új panelen válassza az Elsődleges kapcsolati sztring másolás ikonját, és mentse az értéket.

    Képernyőkép arról, hogyan szerezheti be az elsődleges kapcsolati sztring egy hozzáférési szabályzatból az Azure Portal IoT Hubjában.

További információ az IoT Hub megosztott hozzáférési szabályzatairól és engedélyeiről: Hozzáférés-vezérlés és engedélyek.

Feladatok ütemezése közvetlen metódus meghívásához és az ikereszköz tulajdonságainak frissítéséhez

Ebben a szakaszban egy Python-konzolalkalmazást hoz létre, amely egy távoli lockDoort kezdeményez egy eszközön egy közvetlen módszerrel, és frissíti az ikereszköz kívánt tulajdonságait is.

  1. A parancssorban futtassa a következő parancsot az azure-iot-hub csomag telepítéséhez:

    pip install azure-iot-hub
    
  2. Szövegszerkesztővel hozzon létre egy új scheduleJobService.py fájlt a munkakönyvtárban.

  3. Adja hozzá az alábbi import utasításokat és változókat a scheduleJobService.py fájl elején. Cserélje le a {IoTHubConnectionString} helyőrzőt az IoT Hubra, kapcsolati sztring korábban átmásolta az IoT Hub lekérése kapcsolati sztring. Cserélje le a {deviceId} helyőrzőt a regisztrált eszköz eszközazonosítójára (a névre):

    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. Adja hozzá a következő metódusokat a közvetlen metódust és az ikereszközt meghívó feladatok futtatásához:

    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. Adja hozzá a következő kódot a feladatok ütemezéséhez és a feladat állapotának frissítéséhez. A rutint main is tartalmazza:

    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. Mentse és zárja be a scheduleJobService.py fájlt.

Az alkalmazások futtatása

Most már készen áll az alkalmazások futtatására.

  1. A parancssorban futtassa a következő parancsot a közvetlen újraindítási módszer figyeléséhez:

    python simDevice.py
    
  2. A munkakönyvtár egy másik parancssorában futtassa a következő parancsot a feladatok aktiválásához az ajtó zárolásához és az ikerpéldány frissítéséhez:

    python scheduleJobService.py
    
  3. A közvetlen metódusra adott eszközválaszok és az ikereszközök frissítése a konzolon jelenik meg.

    1. IoT Hub-feladatminta – eszköz kimenete

    2. IoT Hub-feladatminta – eszközkimenet

Következő lépések

Ebben a cikkben egy közvetlen metódus futtatására és az ikereszköz tulajdonságainak frissítésére ütemezte a feladatokat.

Az IoT Hub és az eszközfelügyeleti minták felderítésének folytatásához frissítsen egy képet az Azure IoT Hub eszközfrissítési oktatóanyagában a Raspberry Pi 3 B+ referenciarendszerkép használatával.