Share via


Introdução à identidade do módulo e ao módulo gêmeo do Hub IoT (Python)

As identidades do módulo e os módulos gêmeos são semelhantes às identidades do dispositivo e aos dispositivos gêmeos do Hub IoT do Azure, mas fornecem melhor granularidade. Enquanto que as identidades do dispositivo e os dispositivos gêmeos do Hub IoT do Azure permitem que o aplicativo de back-end configure um dispositivo e forneça visibilidade às condições do dispositivo, as identidades do módulo e os módulos gêmeos fornecem essas funcionalidades para componentes individuais de um dispositivo. Em dispositivos habilitados com vários componentes, como dispositivos de sistema operacional ou dispositivos de firmware, eles permitem condições e configuração isolada para cada componente.

Observação

Os recursos descritos neste artigo estão disponíveis apenas na camada padrão do Hub IoT. Para obter mais informações sobre as camadas básica e padrão/gratuita do Hub IoT, confira Escolher a camada certa do Hub IoT para sua solução.

No fim deste artigo, você tem três aplicativos Python:

  • CreateModule: que cria uma identidade de dispositivo, uma identidade de módulo e chaves de segurança associadas para conectar seus clientes de dispositivo e módulo.

  • UpdateModuleTwinDesiredProperties: envia propriedades desejadas atualizadas de módulo gêmeo ao Hub IoT.

  • ReceiveModuleTwinDesiredPropertiesPatch: recebe o patch das propriedades desejadas do módulo gêmeo em seu dispositivo.

Observação

Para obter mais informações sobre as ferramentas do SDK disponíveis para compilar os dispositivos e os aplicativos de back-end, consulte SDKs de Internet das Coisas do Azure.

Pré-requisitos

  • Uma conta ativa do Azure. (Se você não tiver uma conta, poderá criar uma conta gratuita em apenas alguns minutos.)

  • Um hub IoT. Crie um com a CLI ou o portal do Azure.

  • O Python versão 3.7 ou posterior é recomendado. Certifique-se de usar a instalação de 32 bits ou 64 bits conforme exigido pelo seu programa de instalação. Quando solicitado durante a instalação, certifique-se de adicionar Python à variável de ambiente específica da plataforma.

Autenticação de módulo

Você pode usar chaves simétricas ou certificados X.509 para autenticar identidades de módulo. Para autenticação de certificado X.509, o certificado do módulo deve ter seu CN (nome comum) formatado como CN=<deviceid>/<moduleid>. Por exemplo:

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

Obter a cadeia de conexão do hub IoT

Neste artigo, você criará um serviço de back-end que adiciona um dispositivo no registro de identidade e, em seguida, adiciona um módulo a esse dispositivo. Esse serviço requer a permissão de gravação do registro (que também inclui a leitura do registro). Você também cria um serviço que adiciona as propriedades desejadas ao módulo gêmeo para o módulo recém-criado. Este serviço precisa da permissão de conexão de serviço. Embora existam políticas de acesso compartilhado padrão que concedam essas permissões individualmente, nesta seção, você cria uma política de acesso compartilhado personalizada que contém essas duas permissões.

Para criar uma política de acesso compartilhado que conceda permissões de conexão de serviço e gravação de registro e para obter uma cadeia de conexão para esta política, siga estas etapas:

  1. No portal do Azure, selecione Grupos de recursos. Selecione o grupo de recursos em que o Hub está localizado e, em seguida, selecione o seu hub na lista de recursos.

  2. No painel do lado esquerdo do hub, selecione Políticas de acesso compartilhado.

  3. No menu acima da lista de políticas, selecione Adicionar política de acesso compartilhado.

  4. Em Adicionar política de acesso compartilhado, insira um nome descritivo para a política, como serviceAndRegistryReadWrite. Em Permissões, selecione Gravação de registro e Conexão de serviço e selecione Adicionar. (A permissão de Leitura de registro é incluída automaticamente quando você seleciona a Gravação de registro.)

    Captura de tela que mostra como adicionar uma nova política de acesso compartilhado

  5. Selecione a sua nova política na lista de políticas.

  6. Em Chaves de acesso compartilhado, selecione o ícone de cópia da Cadeia de conexão primária e salve o valor.

    Captura de tela que mostra como recuperar a cadeia de conexão

Para obter mais informações sobre permissões e políticas de acesso compartilhado do Hub IoT, consulte Controle de acesso e permissões.

Criar uma identidade do dispositivo e uma identidade do módulo no Hub IoT

Nesta seção, você criará um aplicativo de serviço Python que cria uma identidade do dispositivo e uma identidade do módulo no registro de identidade no Hub IoT. Um dispositivo ou módulo não pode se conectar ao Hub IoT, a menos que ele tenha uma entrada no Registro de identidade. Para obter mais informações, consulte Entender o registro de identidade no Hub IoT. Quando você executa esse aplicativo de console, ele gera ID e chave exclusivas para o dispositivo e o módulo. A ID e a chave diferenciam maiúsculas de minúsculas. O dispositivo e o módulo usam esses valores para se identificar ao enviar mensagens de dispositivo para nuvem para o Hub IoT.

  1. No prompt de comando, execute o seguinte comando para instalar o pacote azure-iot-hub:

    pip install azure-iot-hub
    
  2. No prompt de comando, execute o seguinte comando para instalar o pacote msrest. Você precisa desse pacote para capturar exceções HTTPOperationError.

    pip install msrest
    
  3. Usando um editor de texto, crie um arquivo chamado CreateModule.py em seu diretório de trabalho.

  4. Adicione o código a seguir ao arquivo do Python. Substitua YourIoTHubConnectionString pela cadeia de conexão que você copiou em Obter a cadeia de conexão do hub IoT.

    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. No prompt de comando, execute o comando a seguir:

    python CreateModule.py
    

Esse aplicativo cria uma identidade do dispositivo com a ID myFirstDevice e uma identidade do módulo com a ID myFirstModule no dispositivo myFirstDevice. (Quando esse dispositivo ou essa identidade do módulo já existe no registro de identidade, o código simplesmente recupera as informações do dispositivo ou módulo existente.) O aplicativo exibe a identidade e a chave primária de cada identidade.

Observação

O Registro de identidade do Hub IoT armazena apenas as identidades de dispositivo e módulo para habilitar o acesso seguro ao Hub IoT. O registro de identidade armazena IDs de dispositivo e chaves para usar como credenciais de segurança. O registro de identidade também armazena um sinalizador de habilitado/desabilitado para cada dispositivo que você pode usar para desabilitar o acesso ao dispositivo. Se seu aplicativo precisar armazenar outros metadados específicos do dispositivo, ele deverá usar um repositório específico do aplicativo. Não há nenhum sinalizador habilitado/desabilitado para as identidades do módulo. Para obter mais informações, consulte Entender o registro de identidade no Hub IoT.

Atualizar o módulo gêmeo usando o SDK do serviço Python

Nesta seção, você cria um aplicativo de serviço do Python que atualiza as propriedades desejadas do módulo gêmeo.

  1. No prompt de comando, execute o seguinte comando para instalar o pacote azure-iot-hub. Você poderá ignorar esta etapa se tiver instalado o pacote azure-iot-hub na seção anterior.

    pip install azure-iot-hub
    
  2. Usando um editor de texto, crie um arquivo chamado UpdateModuleTwinDesiredProperties.py em seu diretório de trabalho.

  3. Adicione o código a seguir ao arquivo do Python. Substitua YourIoTHubConnectionString pela cadeia de conexão que você copiou em Obter a cadeia de conexão do hub IoT.

    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" )
    

Obter atualizações no lado do dispositivo

Nesta seção, você criará um aplicativo Python para obter a atualização das propriedades desejadas do módulo gêmeo em seu dispositivo.

  1. Obtenha a cadeia de conexão do módulo. No portal do Azure, navegue até o Hub IoT e selecione Dispositivos no painel esquerdo. Selecione myFirstDevice na lista de dispositivos e abra-o. Em Identidades do módulo selecione myFirstModule. Selecione o ícone de cópia para a cadeia de conexão (chave primária). Você precisa dessa cadeia de conexão em uma etapa posterior.

    Captura de tela da página de Detalhes da Identidade do Módulo no portal do Azure.

  2. No seu prompt de comando, execute o seguinte comando para instalar o pacote azure-iot-device:

    pip install azure-iot-device
    
  3. Usando um editor de texto, crie um arquivo chamado ReceiveModuleTwinDesiredPropertiesPatch.py em seu diretório de trabalho.

  4. Adicione o código a seguir ao arquivo do Python. Substitua YourModuleConnectionString pela cadeia de conexão do módulo que você copiou na etapa 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()
    

Executar os aplicativos

Nesta seção, você executará o aplicativo de dispositivo ReceiveModuleTwinDesiredPropertiesPatch e executará o aplicativo de serviço UpdateModuleTwinDesiredProperties para atualizar as propriedades desejadas do seu módulo.

  1. Abra o prompt de comando e execute o aplicativo do dispositivo:

    python ReceiveModuleTwinDesiredPropertiesPatch.py
    

    Saída inicial do aplicativo do dispositivo

  2. Abra um prompt de comando separado e execute o aplicativo de serviço:

    python UpdateModuleTwinDesiredProperties.py
    

    Observe que a propriedade desejada TelemetryInterval aparece no módulo gêmeo atualizado na saída do aplicativo de serviço:

    Saída do aplicativo de serviço

    A mesma propriedade aparece no patch de propriedades desejadas recebido na saída do aplicativo do dispositivo:

    A saída do aplicativo do dispositivo mostra o patch de propriedades desejado

Próximas etapas

Para continuar a introdução ao Hub IoT e explorar outros cenários de IoT, confira: