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:
I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan hubben i listan över resurser.
I fönstret till vänster i hubben väljer du Principer för delad åtkomst.
På menyn ovanför listan över principer väljer du Lägg till princip för delad åtkomst.
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.)
Välj din nya princip i listan över principer.
Under Delade åtkomstnycklar väljer du kopieringsikonen för den primära anslutningssträngen och sparar värdet.
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.
Kör följande kommando i kommandotolken för att installera paketet azure-iot-hub :
pip install azure-iot-hub
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
Skapa en fil med namnet CreateModule.py i arbetskatalogen med hjälp av en textredigerare.
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")
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.
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
Skapa en fil med namnet UpdateModuleTwinDesiredProperties.py i arbetskatalogen med hjälp av en textredigerare.
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.
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.
Kör följande kommando i kommandotolken för att installera paketet azure-iot-device :
pip install azure-iot-device
Skapa en fil med namnet ReceiveModuleTwinDesiredPropertiesPatch.py i arbetskatalogen med hjälp av en textredigerare.
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.
Öppna en kommandotolk och kör enhetsappen:
python ReceiveModuleTwinDesiredPropertiesPatch.py
Ö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:
Samma egenskap visas i den önskade egenskapskorrigeringen som tas emot i enhetsappens utdata:
Nästa steg
För att fortsätta komma igång med IoT-hubb och utforska andra IoT-scenarier, se:
Feedback
https://aka.ms/ContentUserFeedback.
Kommer snart: Under hela 2024 kommer vi att fasa ut GitHub-problem som feedbackmekanism för innehåll och ersätta det med ett nytt feedbacksystem. Mer information finns i:Skicka och visa feedback för