Dela via


Kom igång med IoT Hub modulidentitet och modultvilling (Python)

Modulidentiteter och modultvillingar liknar Azure IoT Hub enhetsidentiteter och enhetstvillingar, men ger bättre kornighet. Även om Azure IoT Hub enhetsidentiteter och enhetstvillingar gör det möjligt för ett serverdelsprogram att konfigurera en enhet och ge insyn i enhetens villkor, ger modulidentiteter och modultvillingar dessa funktioner för enskilda komponenter på en enhet. På kompatibla enheter med flera komponenter, till exempel operativsystemenheter eller enheter med inbyggd programvara, tillåter de isolerad konfiguration och villkor för varje komponent.

Anteckning

Funktionerna som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om nivåerna basic och standard/kostnadsfri IoT Hub finns i Välja rätt IoT Hub nivå för din lösning.

I slutet av den här artikeln har du tre Python-appar:

  • CreateModule: skapar en enhetsidentitet, en modulidentitet och tillhörande säkerhetsnycklar för att ansluta dina enhets- och modulklienter.

  • UpdateModuleTwinDesiredProperties: skickar uppdaterade modultvillingar, önskade egenskaper till din IoT Hub.

  • ReceiveModuleTwinDesiredPropertiesPatch: tar emot modultvillingen, önskad egenskapskorrigering på enheten.

Anteckning

Mer information om de SDK-verktyg som är tillgängliga för att skapa både enhets- och serverdelsappar finns i Azure IoT SDK:er.

Förutsättningar

  • Ett aktivt Azure-konto. (Om du inte har något konto kan du skapa ett kostnadsfritt konto på bara några minuter.)

  • En IoT-hubb. Skapa en med CLI eller Azure Portal.

  • Python version 3.7 eller senare rekommenderas. Se till att använda en 32-bitars eller 64-bitars installation beroende på vad som krävs för din konfiguration. Se till att du lägger till Python i den plattformsspecifika miljövariabeln när du uppmanas att göra det under installationen.

Modulautentisering

Du kan använda symmetriska nycklar eller X.509-certifikat för att autentisera modulidentiteter. För X.509-certifikatautentisering måste modulens certifikat ha sitt eget namn (CN) formaterat som CN=<deviceid>/<moduleid>. Exempel:

openssl req -new -key d1m1.key.pem -out d1m1.csr -subj "/CN=device01\/module01"

Hämta IoT Hub-anslutningssträngen

I den här artikeln skapar du en serverdelstjänst som lägger till en enhet i identitetsregistret och sedan lägger till en modul på enheten. Den här tjänsten kräver registerskrivningsbehörigheten (som även omfattar registerläsning). Du skapar också en tjänst som lägger till önskade egenskaper i modultvillingen för den nyligen skapade modulen. Den här tjänsten behöver tjänstens anslutningsbehörighet . Även om det finns standardprinciper för delad åtkomst som beviljar dessa behörigheter individuellt, skapar du i det här avsnittet en anpassad princip för delad åtkomst som innehåller båda dessa behörigheter.

Följ dessa steg om du vill skapa en princip för delad åtkomst som beviljar behörigheter för tjänstanslutning och registerskrivning och för att hämta en anslutningssträng för den här principen:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan hubben i listan över resurser.

  2. I fönstret till vänster i hubben väljer du Principer för delad åtkomst.

  3. På menyn ovanför listan över principer väljer du Lägg till princip för delad åtkomst.

  4. Under Lägg till princip för delad åtkomst anger du ett beskrivande namn för principen, till exempel serviceAndRegistryReadWrite. Under Behörigheter väljer du Registerskrivning och Tjänstanslutning och väljer sedan Lägg till. ( Behörigheten Registerläsning inkluderas automatiskt när du väljer Registerskrivning.)

    Skärmbild som visar hur du lägger till en ny princip för delad åtkomst

  5. Välj din nya princip i listan över principer.

  6. Under Delade åtkomstnycklar väljer du kopieringsikonen för den primära anslutningssträngen och sparar värdet.

    Skärmbild som visar hur du hämtar anslutningssträngen

Mer information om IoT Hub principer och behörigheter för delad åtkomst finns i Åtkomstkontroll och behörigheter.

Skapa en enhetsidentitet och en modulidentitet i IoT Hub

I det här avsnittet skapar du en Python-tjänstapp som skapar en enhetsidentitet och en modulidentitet i identitetsregistret i din IoT-hubb. En enhet eller modul kan inte ansluta till IoT Hub om den inte har en post i identitetsregistret. Mer information finns i Förstå identitetsregistret i din IoT-hubb. När du kör den här konsolappen, genereras ett unikt ID och en unik nyckel för både enheten och modulen. ID och nyckel är skiftlägeskänsliga. Enheten och modulen använder dessa värden för att identifiera sig vid överföring av enhet-till-moln-meddelanden till IoT Hub.

  1. Kör följande kommando i kommandotolken för att installera paketet azure-iot-hub :

    pip install azure-iot-hub
    
  2. Kör följande kommando i kommandotolken för att installera msrest-paketet . Du behöver det här paketet för att fånga upp HTTPOperationError-undantag .

    pip install msrest
    
  3. Skapa en fil med namnet CreateModule.py i arbetskatalogen med hjälp av en textredigerare.

  4. Lägg till följande kod i Python-filen. Ersätt YourIoTHubConnectionString med anslutningssträngen som du kopierade i Hämta IoT Hub-anslutningssträngen.

    import sys
    from msrest.exceptions import HttpOperationError
    from azure.iot.hub import IoTHubRegistryManager
    
    CONNECTION_STRING = "YourIotHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        try:
            # CreateDevice - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            device_state = "enabled"
            new_device = iothub_registry_manager.create_device_with_sas(
                DEVICE_ID, primary_key, secondary_key, device_state
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the device already exists.
                new_device = iothub_registry_manager.get_device(DEVICE_ID)
            else:
                raise
    
        print("device <" + DEVICE_ID +
              "> has primary key = " + new_device.authentication.symmetric_key.primary_key)
    
        try:
            # CreateModule - let IoT Hub assign keys
            primary_key = ""
            secondary_key = ""
            managed_by = ""
            new_module = iothub_registry_manager.create_module_with_sas(
                DEVICE_ID, MODULE_ID, managed_by, primary_key, secondary_key
            )
        except HttpOperationError as ex:
            if ex.response.status_code == 409:
                # 409 indicates a conflict. This happens because the module already exists.
                new_module = iothub_registry_manager.get_module(DEVICE_ID, MODULE_ID)
            else:
                raise
    
        print("device/module <" + DEVICE_ID + "/" + MODULE_ID +
              "> has primary key = " + new_module.authentication.symmetric_key.primary_key)
    
    except Exception as ex:
        print("Unexpected error {0}".format(ex))
    except KeyboardInterrupt:
        print("IoTHubRegistryManager sample stopped")
    
  5. Kör följande kommando i kommandotolken:

    python CreateModule.py
    

Den här appen skapar en enhetsidentitet med ID myFirstDevice och en modulidentitet med ID myFirstModule under enheten myFirstDevice. (Om enhets- eller modul-ID:t redan finns i identitetsregistret hämtar koden helt enkelt den befintliga enheten eller modulinformationen.) Appen visar ID och primärnyckel för varje identitet.

Anteckning

IoT Hub-identitetsregistret lagrar enhets- och modulidentiteter endast för att skydda åtkomsten till IoT Hub. Enhets-ID:n och nycklar lagras i identitetsregistret och används som autentiseringsuppgifter. I identitetsregistret lagras också en aktiverad/inaktiverad-flagga för varje enhet som du kan använda till att inaktivera enhetens åtkomst. Om ditt program behöver lagra andra enhetsspecifika metadata bör det använda ett programspecifikt datalager. Det finns ingen aktiverad/inaktiverad flagga för modulidentiteter. Mer information finns i Förstå identitetsregistret i din IoT-hubb.

Uppdatera modultvillingen med Hjälp av Python-tjänst-SDK

I det här avsnittet skapar du en Python-tjänstapp som uppdaterar önskade egenskaper för modultvillingen.

  1. Kör följande kommando i kommandotolken för att installera paketet azure-iot-hub . Du kan hoppa över det här steget om du installerade paketet azure-iot-hub i föregående avsnitt.

    pip install azure-iot-hub
    
  2. Skapa en fil med namnet UpdateModuleTwinDesiredProperties.py i arbetskatalogen med hjälp av en textredigerare.

  3. Lägg till följande kod i Python-filen. Ersätt YourIoTHubConnectionString med anslutningssträngen som du kopierade i Hämta IoT Hub-anslutningssträngen.

    import sys
    from azure.iot.hub import IoTHubRegistryManager
    from azure.iot.hub.models import Twin, TwinProperties
    
    CONNECTION_STRING = "YourIoTHubConnectionString"
    DEVICE_ID = "myFirstDevice"
    MODULE_ID = "myFirstModule"
    
    try:
        # RegistryManager
        iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
        module_twin = iothub_registry_manager.get_module_twin(DEVICE_ID, MODULE_ID)
        print ( "" )
        print ( "Module twin properties before update    :" )
        print ( "{0}".format(module_twin.properties) )
    
        # Update twin
        twin_patch = Twin()
        twin_patch.properties = TwinProperties(desired={"telemetryInterval": 122})
        updated_module_twin = iothub_registry_manager.update_module_twin(
            DEVICE_ID, MODULE_ID, twin_patch, module_twin.etag
        )
        print ( "" )
        print ( "Module twin properties after update     :" )
        print ( "{0}".format(updated_module_twin.properties) )
    
    except Exception as ex:
        print ( "Unexpected error {0}".format(ex) )
    except KeyboardInterrupt:
        print ( "IoTHubRegistryManager sample stopped" )
    

Hämta uppdateringar på enhetssidan

I det här avsnittet skapar du en Python-app för att uppdatera önskade egenskaper för modultvillingen på enheten.

  1. Hämta modulanslutningssträngen. I Azure Portal går du till din IoT Hub och väljer Enheter i den vänstra rutan. Välj myFirstDevice i listan över enheter och öppna den. Under Modulidentiteter väljer du myFirstModule. Välj kopieringsikonen för Anslutningssträng (primär nyckel). Du behöver den här anslutningssträngen i följande steg.

    Skärmbild av sidan Information om modulidentitet i Azure Portal.

  2. Kör följande kommando i kommandotolken för att installera paketet azure-iot-device :

    pip install azure-iot-device
    
  3. Skapa en fil med namnet ReceiveModuleTwinDesiredPropertiesPatch.py i arbetskatalogen med hjälp av en textredigerare.

  4. Lägg till följande kod i Python-filen. Ersätt YourModuleConnectionString med modulanslutningssträngen som du kopierade i steg 1.

    import time
    from azure.iot.device import IoTHubModuleClient
    
    CONNECTION_STRING = "YourModuleConnectionString"
    
    
    def twin_patch_handler(twin_patch):
        print("")
        print("Twin desired properties patch received:")
        print(twin_patch)
    
    
    def main():
        print ("Starting the IoT Hub Python sample...")
        client = IoTHubModuleClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for commands, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_twin_desired_properties_patch_received = twin_patch_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoTHubModuleClient sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    if __name__ == '__main__':
        main()
    

Kör apparna

I det här avsnittet kör du enhetsappen ReceiveModuleTwinDesiredPropertiesPatch och kör sedan tjänstappen UpdateModuleTwinDesiredProperties för att uppdatera önskade egenskaper för modulen.

  1. Öppna en kommandotolk och kör enhetsappen:

    python ReceiveModuleTwinDesiredPropertiesPatch.py
    

    Startutdata för enhetsapp

  2. Öppna en separat kommandotolk och kör tjänstappen:

    python UpdateModuleTwinDesiredProperties.py
    

    Observera att egenskapen TelemetryInterval visas i den uppdaterade modultvillingen i utdata för din tjänstapp:

    Utdata för tjänstapp

    Samma egenskap visas i den önskade egenskapskorrigeringen som tas emot i enhetsappens utdata:

    Utdata från enhetsappen visar korrigering av önskade egenskaper

Nästa steg

För att fortsätta komma igång med IoT-hubb och utforska andra IoT-scenarier, se: