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:
Ikereszköz és tulajdonságok: Ismerkedés az ikereszközökkel , valamint az ikereszközök megismerése és használata az IoT Hubban
Közvetlen módszerek: IoT Hub fejlesztői útmutató – közvetlen metódusok
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.
A parancssorban futtassa a következő parancsot az azure-iot-device csomag telepítéséhez:
pip install azure-iot-device
Szövegszerkesztővel hozzon létre egy új simDevice.py fájlt a munkakönyvtárban.
Adja hozzá a következő
import
utasításokat és változókat a simDevice.py fájl elején. Cserélje ledeviceConnectionString
a fent létrehozott eszköz kapcsolati sztring:import time from azure.iot.device import IoTHubDeviceClient, MethodResponse CONNECTION_STRING = "{deviceConnectionString}"
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
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()
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:
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.
Az IoT Hub bal oldali ablaktábláján válassza a Megosztott hozzáférési szabályzatok lehetőséget.
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.
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.
A Megosztott hozzáférési szabályzatok lapon válassza ki az új szabályzatot a szabályzatok listájából.
A megjelenő új panelen válassza az Elsődleges kapcsolati sztring másolás ikonját, és mentse az értéket.
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.
A parancssorban futtassa a következő parancsot az azure-iot-hub csomag telepítéséhez:
pip install azure-iot-hub
Szövegszerkesztővel hozzon létre egy új scheduleJobService.py fájlt a munkakönyvtárban.
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)
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)
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()
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.
A parancssorban futtassa a következő parancsot a közvetlen újraindítási módszer figyeléséhez:
python simDevice.py
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
A közvetlen metódusra adott eszközválaszok és az ikereszközök frissítése a konzolon jelenik meg.
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.
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: