Sdílet prostřednictvím


Plánování a vysílání úloh (Python)

Pomocí služby Azure IoT Hub můžete plánovat a sledovat úlohy, které aktualizují miliony zařízení. Použití úloh k:

  • Aktualizace požadovaných vlastností
  • Aktualizace značek
  • Vyvolání přímých metod

Koncepčně úloha zabalí jednu z těchto akcí a sleduje průběh provádění u sady zařízení, která je definovaná dotazem dvojčete zařízení. Back-endová aplikace může například pomocí úlohy vyvolat metodu restartování na 10 000 zařízeních určených dotazem dvojčete zařízení a naplánovat ji v budoucnu. Tato aplikace pak může sledovat průběh, když každé z těchto zařízení přijme a spustí metodu restartování.

Další informace o jednotlivých funkcích najdete v těchto článcích:

Poznámka:

Funkce popsané v tomto článku jsou k dispozici pouze na úrovni Standard služby IoT Hub. Další informace o úrovních Služby IoT Hub úrovně Basic a Standard/Free najdete v tématu Volba správné úrovně IoT Hubu pro vaše řešení.

V tomto článku se dozvíte, jak vytvořit dvě aplikace v Pythonu:

  • Aplikace simulovaného zařízení v Pythonu simDevice.py, která implementuje přímou metodu s názvem lockDoor, kterou může volat back-endová aplikace.

  • Konzolová aplikace Pythonu scheduleJobService.py, která vytvoří dvě úlohy. Jedna úloha volá přímou metodu lockDoor a jiná úloha odesílá aktualizace požadovaných vlastností do více zařízení.

Poznámka:

Další informace o dostupných nástrojích SDK pro sestavení zařízení i back-endových aplikací najdete v sadách SDK .

Požadavky

  • Aktivní účet Azure (Pokud účet nemáte, můžete si během několika minut vytvořit bezplatný účet.)

  • Centrum IoT ve vašem předplatném Azure Pokud centrum ještě nemáte, můžete postupovat podle kroků v tématu Vytvoření centra IoT.

  • Zařízení zaregistrované ve službě IoT Hub. Pokud ve službě IoT Hub nemáte zařízení, postupujte podle pokynů v části Registrace zařízení.

  • Doporučuje se Python verze 3.7 nebo novější . Ujistěte se, že používáte 32bitovou, nebo 64bitovou instalaci podle požadavků vašeho nastavení. Po zobrazení výzvy v průběhu instalace nezapomeňte přidat Python do proměnné prostředí pro konkrétní platformu.

Vytvoření aplikace simulovaného zařízení

V této části vytvoříte konzolovou aplikaci Pythonu, která reaguje na přímou metodu volanou cloudem, která aktivuje simulovanou metodu lockDoor .

Důležité

Tento článek obsahuje postup připojení zařízení pomocí sdíleného přístupového podpisu, označovaného také jako ověřování symetrického klíče. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování zařízení pomocí certifikátů X.509 je bezpečnější přístup. Další informace najdete v tématu Zabezpečení osvědčených postupů > zabezpečení připojení.

  1. Na příkazovém řádku spusťte následující příkaz a nainstalujte balíček azure-iot-device :

    pip install azure-iot-device
    
  2. Pomocí textového editoru vytvořte v pracovním adresáři nový simDevice.py soubor.

  3. Na začátek souboru simDevice.py přidejte následující import příkazy a proměnné. Nahraďte deviceConnectionString připojovací řetězec zařízení, které jste vytvořili výše:

    import time
    from azure.iot.device import IoTHubDeviceClient, MethodResponse
    
    CONNECTION_STRING = "{deviceConnectionString}"
    
  4. Definujte následující funkci, která vytvoří instanci klienta a nakonfiguruje ji tak, aby reagovala na metodu lockDoor , a také přijímat aktualizace dvojčat zařízení:

    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. Přidejte následující kód pro spuštění ukázky:

    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. Uložte a zavřete soubor simDevice.py .

Poznámka:

Aby bylo všechno jednoduché, tento článek neimplementuje zásadu opakování. V produkčním kódu byste měli implementovat zásady opakování (například exponenciální zpoždování), jak je doporučeno v článku Zpracování přechodných chyb.

Získání připojovací řetězec ioT Hubu

V tomto článku vytvoříte back-endovou službu, která vyvolá přímou metodu na zařízení a aktualizuje dvojče zařízení. Služba potřebuje oprávnění k připojení služby k volání přímé metody na zařízení. Služba také potřebuje oprávnění ke čtení a zápisu registru registru ke čtení a zápisu registru identit. Neexistují žádné výchozí zásady sdíleného přístupu, které obsahují pouze tato oprávnění, takže ho musíte vytvořit.

Pokud chcete vytvořit zásadu sdíleného přístupu, která uděluje oprávnění pro připojení služby, čtení registru a zápis registru a získat připojovací řetězec pro tuto zásadu, postupujte takto:

  1. Otevřete centrum IoT na webu Azure Portal. Nejjednodušší způsob, jak se dostat do centra IoT, je vybrat skupiny prostředků, vybrat skupinu prostředků, ve které se nachází centrum IoT, a pak ze seznamu prostředků vybrat centrum IoT.

  2. V levém podokně centra IoT vyberte zásady sdíleného přístupu.

  3. V horní nabídce nad seznamem zásad vyberte Přidat zásady sdíleného přístupu.

  4. V podokně Přidat zásady sdíleného přístupu zadejte popisný název zásady, například serviceAndRegistryReadWrite. V části Oprávnění vyberte Možnost Zápis registru a Připojení služby (Při výběru možnosti Zápis registru se automaticky vybere čtení registru) a pak vyberte Přidat.

    Snímek obrazovky s novými zásadami přístupu na webu Azure Portal ve službě IoT Hub

  5. Zpátky na stránce Zásady sdíleného přístupu vyberte novou zásadu ze seznamu zásad.

  6. V novém podokně, které se zobrazí, vyberte ikonu kopírování pro primární připojovací řetězec a uložte hodnotu.

    Snímek obrazovky znázorňuje, jak získat primární připojovací řetězec ze zásad přístupu na webu IoT Hub na webu Azure Portal.

Další informace ozásadách

Důležité

Tento článek obsahuje postup připojení ke službě pomocí sdíleného přístupového podpisu. Tato metoda ověřování je vhodná pro testování a vyhodnocení, ale ověřování ve službě pomocí MICROSOFT Entra ID nebo spravovaných identit je bezpečnější přístup. Další informace najdete v tématu Osvědčené postupy > zabezpečení cloudu.

Naplánování úloh pro volání přímé metody a aktualizaci vlastností dvojčete zařízení

V této části vytvoříte konzolovou aplikaci Pythonu, která zahájí vzdálené uzamčení zařízení pomocí přímé metody a aktualizuje také požadované vlastnosti dvojčete zařízení.

  1. Na příkazovém řádku spusťte následující příkaz a nainstalujte balíček azure-iot-hub :

    pip install azure-iot-hub
    
  2. Pomocí textového editoru vytvořte v pracovním adresáři nový scheduleJobService.py soubor.

  3. Na začátek souboru scheduleJobService.py přidejte následující import příkazy a proměnné. {IoTHubConnectionString} Zástupný symbol nahraďte službou IoT Hub připojovací řetězec, kterou jste zkopírovali dříve v připojovací řetězec Get the IoT Hub. {deviceId} Zástupný symbol nahraďte ID zařízení (název) z registrovaného zařízení:

    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. Přidejte následující metody pro spuštění úloh, které volají přímou metodu a dvojče zařízení:

    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. Přidejte následující kód, který naplánuje úlohy a aktualizuje stav úlohy. Patří sem také rutina 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. Uložte a zavřete soubor scheduleJobService.py .

Spuštění aplikací

Nyní můžete spustit aplikace.

  1. Na příkazovém řádku v pracovním adresáři spusťte následující příkaz, který začne naslouchat přímé metodě restartování:

    python simDevice.py
    
  2. V jiném příkazovém řádku v pracovním adresáři spusťte následující příkaz, který aktivuje úlohy, které zamknou dveře a aktualizují dvojče:

    python scheduleJobService.py
    
  3. V konzole se zobrazí odpovědi zařízení na přímou metodu a aktualizaci dvojčat zařízení.

    Úloha IoT Hubu – ukázka 1 – výstup zařízení

    Ukázka úlohy IoT Hubu 2 – výstup zařízení

Další kroky

V tomto článku jste naplánovali úlohy, které spustí přímou metodu a aktualizují vlastnosti dvojčete zařízení.

Pokud chcete pokračovat ve zkoumání vzorů správy ioT Hubu a zařízení, aktualizujte image ve službě Device Update pro Azure IoT Hub pomocí referenční image Raspberry Pi 3 B+.