Partilhar via


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

As identidades dos módulos e os módulos duplos são semelhantes aos Hub IoT do Azure identidades de dispositivos e dispositivos duplos, mas fornecem uma granularidade mais fina. Enquanto Hub IoT do Azure identidades de dispositivos e dispositivos duplos permitem que uma aplicação de back-end configure um dispositivo e forneça visibilidade sobre as condições do dispositivo, as identidades dos módulos e os módulos duplos fornecem estas capacidades para componentes individuais de um dispositivo. Em dispositivos compatíveis com vários componentes, como dispositivos de sistema operativo ou dispositivos de firmware, permitem configuração e condições isoladas para cada componente.

Nota

As funcionalidades descritas neste artigo só estão disponíveis no escalão padrão do Hub IoT. Para obter mais informações sobre os escalões de Hub IoT básico e standard/gratuito, consulte Escolher o escalão de Hub IoT certo para a sua solução.

No final deste artigo, tem três aplicações Python:

  • CreateModule: cria uma identidade de dispositivo, uma identidade de módulo e chaves de segurança associadas para ligar os clientes do dispositivo e do módulo.

  • UpdateModuleTwinDesiredProperties: envia o módulo duplo atualizado, as propriedades pretendidas para o seu Hub IoT.

  • ReceiveModuleTwinDesiredPropertiesPatch: recebe o patch de propriedades pretendidas do módulo duplo no seu dispositivo.

Nota

Para obter mais informações sobre as ferramentas do SDK disponíveis para criar aplicações de dispositivo e back-end, veja SDKs do Azure IoT.

Pré-requisitos

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

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

  • Recomenda-se a versão 3.7 ou posterior do Python . Certifique-se de que utiliza a instalação de 32 ou 64 bits, conforme exigido pela sua configuração. Quando lhe for pedido durante a instalação, confirme que adiciona Python à variável de ambiente específica da sua plataforma.

Autenticação de módulos

Pode utilizar chaves simétricas ou certificados X.509 para autenticar identidades de módulos. Para a autenticação de certificado X.509, o certificado do módulo tem de ter o respetivo nome comum (CN) 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 ligação do hub IoT

Neste artigo, vai criar um serviço de back-end que adiciona um dispositivo no registo de identidade e, em seguida, adiciona um módulo a esse dispositivo. Este serviço requer a permissão de escrita do registo (que também inclui a leitura do registo). Também vai criar um serviço que adiciona as propriedades pretendidas ao módulo duplo para o módulo criado recentemente. Este serviço precisa da permissão de ligação do serviço . Embora existam políticas de acesso partilhado predefinidas que concedem estas permissões individualmente, nesta secção, vai criar uma política de acesso partilhado personalizada que contém ambas as permissões.

Para criar uma política de acesso partilhado que conceda permissões de ligação ao serviço e de escrita do registo e para obter uma cadeia de ligação para esta política, siga estes passos:

  1. Na portal do Azure, selecione Grupos de recursos. Selecione o grupo de recursos onde o hub está localizado e, em seguida, selecione o hub na lista de recursos.

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

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

  4. Em Adicionar política de acesso partilhado, introduza um nome descritivo para a sua política, como serviceAndRegistryReadWrite. Em Permissões, selecione Escrita no Registo e Ligação do Serviço e, em seguida, selecione Adicionar. (A permissão de Leitura do Registo é incluída automaticamente quando seleciona Escrita do Registo.)

    Captura de ecrã que mostra como adicionar uma nova política de acesso partilhado

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

  6. Em Chaves de acesso partilhadas, selecione o ícone de cópia da cadeia de ligação Primária e guarde o valor.

    Captura de ecrã que mostra como obter a cadeia de ligação

Para obter mais informações sobre Hub IoT permissões e políticas de acesso partilhado, veja Controlo de acesso e permissões.

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

Nesta secção, vai criar uma aplicação do serviço Python que cria uma identidade de dispositivo e uma identidade de módulo no registo de identidades no seu hub IoT. Um dispositivo ou módulo não consegue ligar-se ao hub IoT, a menos que tenha uma entrada no registo de identidade. Para obter mais informações, veja Compreender o registo de identidades no seu hub IoT. Ao executar esta aplicação de consola, será gerado um ID e uma chave exclusivos para o dispositivo e o módulo. O ID e a chave são sensíveis às maiúsculas e minúsculas. O dispositivo e o módulo utilizam estes valores para se identificarem quando enviam mensagens do dispositivo para cloud para o Hub IoT.

  1. Na linha de comandos, execute o seguinte comando para instalar o pacote azure-iot-hub :

    pip install azure-iot-hub
    
  2. Na linha de comandos, execute o seguinte comando para instalar o pacote msrest . Precisa deste pacote para detetar exceções HTTPOperationError .

    pip install msrest
    
  3. Com um editor de texto, crie um ficheiro com o nome CreateModule.py no seu diretório de trabalho.

  4. Adicione o seguinte código ao ficheiro Python. Substitua YourIoTHubConnectionString pela cadeia de ligação que copiou em Obter a cadeia de ligaçã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. Na linha de comandos, execute o seguinte comando:

    python CreateModule.py
    

Esta aplicação cria uma identidade de dispositivo com o ID myFirstDevice e uma identidade de módulo com o ID myFirstModule no dispositivo myFirstDevice. (Se o ID do dispositivo ou módulo já existir no registo de identidade, o código obtém simplesmente as informações do dispositivo ou módulo existentes.) A aplicação apresenta o ID e a chave primária para cada identidade.

Nota

O registo de identidade do Hub IoT apenas armazena identidades de dispositivos e módulos para permitir um acesso seguro ao hub IoT. O registo de identidades armazena os IDs de dispositivo e as chaves para utilizar como credenciais de segurança. O registo de identidades também armazena um sinalizador ativado/desativado para cada dispositivo que pode utilizar para desativar o acesso a esse dispositivo. Se a sua aplicação tiver de armazenar outros metadados específicos do dispositivo, deverá utilizar um armazenamento específico da aplicação. Não existe nenhum sinalizador ativado/desativado para identidades de módulo. Para obter mais informações, veja Compreender o registo de identidades no seu hub IoT.

Atualizar o módulo duplo com o SDK do serviço Python

Nesta secção, vai criar uma aplicação do serviço Python que atualiza as propriedades pretendidas do módulo duplo.

  1. Na linha de comandos, execute o seguinte comando para instalar o pacote azure-iot-hub . Pode ignorar este passo se tiver instalado o pacote azure-iot-hub na secção anterior.

    pip install azure-iot-hub
    
  2. Com um editor de texto, crie um ficheiro com o nome UpdateModuleTwinDesiredProperties.py no seu diretório de trabalho.

  3. Adicione o seguinte código ao ficheiro Python. Substitua YourIoTHubConnectionString pela cadeia de ligação que copiou em Obter a cadeia de ligaçã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 do lado do dispositivo

Nesta secção, vai criar uma aplicação Python para obter a atualização das propriedades pretendidas do módulo duplo no seu dispositivo.

  1. Obtenha a cadeia de ligação do módulo. No portal do Azure, navegue até à sua 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 copiar para Cadeia de ligação (chave primária). Precisa desta cadeia de ligação num passo seguinte.

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

  2. Na linha de comandos, execute o seguinte comando para instalar o pacote azure-iot-device :

    pip install azure-iot-device
    
  3. Com um editor de texto, crie um ficheiro com o nome ReceiveModuleTwinDesiredPropertiesPatch.py no seu diretório de trabalho.

  4. Adicione o seguinte código ao ficheiro Python. Substitua YourModuleConnectionString pela cadeia de ligação do módulo que copiou no passo 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 as aplicações

Nesta secção, vai executar a aplicação de dispositivo ReceiveModuleTwinDesiredPropertiesPatch e, em seguida, executar a aplicação do serviço UpdateModuleTwinDesiredProperties para atualizar as propriedades pretendidas do módulo.

  1. Abra uma linha de comandos e execute a aplicação do dispositivo:

    python ReceiveModuleTwinDesiredPropertiesPatch.py
    

    Saída inicial da aplicação do dispositivo

  2. Abra uma linha de comandos separada e execute a aplicação de serviço:

    python UpdateModuleTwinDesiredProperties.py
    

    Repare que a propriedade pretendida TelemetryInterval aparece no módulo duplo atualizado na saída da aplicação de serviço:

    Saída da aplicação de serviço

    A mesma propriedade aparece no patch de propriedades pretendidas recebido na saída da aplicação do dispositivo:

    A saída da aplicação do dispositivo mostra o patch de propriedades pretendidas

Passos seguintes

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