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


Feladatok ütemezése és szórása (Python)

A Azure IoT Hub segítségével több millió eszközt frissítő feladatokat ütemezhet és követhet nyomon. Feladatok használata a következő feladatokhoz:

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

A feladat elméletileg becsomagolja az egyik ilyen műveletet, és nyomon követi a végrehajtás előrehaladásá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 módszert 10 000 eszközön, amelyet egy ikereszköz-lekérdezés határoz meg, és későbbi időpontban ütemez. 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.

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

Megjegyzés

A cikkben ismertetett funkciók csak a IoT Hub standard szintjén érhetők el. Az alapszintű és standard/ingyenes IoT Hub szintekkel kapcsolatos további információkért lásd: A megoldáshoz megfelelő IoT Hub szint kiválasztása.

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

  • Egy pythonos 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.

Megjegyzés

Az eszköz- és háttéralkalmazások készítéséhez elérhető SDK-eszközökkel kapcsolatos további információkért lásd: Azure IoT SDK-k .

Előfeltételek

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

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

  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á az alábbi import utasításokat és változókat a simDevice.py fájl elején. Cserélje le deviceConnectionString a elemet 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 úgy konfigurálja, hogy reagáljon a lockDoor metódusra, valamint fogadja az ikereszköz-frissítéseket:

    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.

Megjegyzés

Az egyszerűség érdekében ez a cikk nem implementál ú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 az Átmeneti hibakezelés című cikkben leírtak szerint.

A 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 szolgáltatáscsatlakozási engedéllyel kell rendelkeznie 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élyekkel is rendelkeznie kell 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 lekérni ehhez a szabályzathoz, kövesse az alábbi lépéseket:

  1. Nyissa meg az IoT Hubot a Azure Portal. Az IoT Hub eléréséhez a legegyszerűbben az Erőforráscsoportok lehetőséget választva válassza ki azt az erőforráscsoportot, ahol az IoT Hub található, majd válassza ki az IoT Hubot az erőforrások listájából.

  2. Az IoT Hub bal oldali paneljé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 írása automatikusan ki van jelölve, amikor a Beállításjegyzék írása lehetőséget választja), majd válassza a Hozzáadás lehetőséget.

    Képernyőkép új hozzáférési szabályzat hozzáadásáról a Azure Portal IoT Hub.

  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 a Azure Portal IoT Hub.

A IoT Hub megosztott hozzáférési szabályzatokkal és engedélyekkel kapcsolatos további információkért lásd: 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 létrehoz egy Python-konzolalkalmazást, 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á a következő 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 kimá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 metódus figyeléséhez:

    python simDevice.py
    
  2. A munkakönyvtárban egy másik parancssorban 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 és az ikereszközök frissítésére adott eszközválaszok megjelennek a konzolon.

    IoT Hub 1. feladatminta – eszközkimenet

    IoT Hub 2. 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.

A IoT Hub és az eszközfelügyeleti minták megismeréséhez frissítsen egy képet az Eszközfrissítés Azure IoT Hub oktatóanyagban a Raspberry Pi 3 B+ referenciarendszerkép használatával.