Partilhar via


Introdução à gestão de dispositivos (Python)

As aplicações de back-end podem utilizar Hub IoT do Azure primitivos, como dispositivos duplos e métodos diretos, para iniciar e monitorizar remotamente ações de gestão de dispositivos em dispositivos. Este artigo mostra-lhe como uma aplicação de back-end e uma aplicação de dispositivo podem funcionar em conjunto para iniciar e monitorizar um reinício remoto do dispositivo com Hub IoT.

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.

Utilize um método direto para iniciar ações de gestão de dispositivos (como reinício, reposição de fábrica e atualização de firmware) a partir de uma aplicação de back-end na cloud. O dispositivo é responsável por:

  • Processar o pedido de método enviado a partir de Hub IoT.

  • Iniciar a ação específica do dispositivo correspondente no dispositivo.

  • Fornecer atualizações de estado através de propriedades reportadas para Hub IoT.

Pode utilizar uma aplicação de back-end na cloud para executar consultas de dispositivo duplo para comunicar o progresso das ações de gestão de dispositivos.

Este artigo mostra-lhe como criar:

  • dmpatterns_getstarted_device.py: uma aplicação de dispositivo simulado com um método direto que reinicia o dispositivo e reporta a hora do último reinício. Os métodos diretos são invocados a partir da cloud.

  • dmpatterns_getstarted_service.py: uma aplicação de consola Python que chama o método direto na aplicação de dispositivo simulado através do seu hub IoT. Apresenta a resposta e as propriedades reportadas atualizadas.

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.

  • Um dispositivo registado. Registe um na 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.

  • Certifique-se de que a porta 8883 está aberta na firewall. O exemplo de dispositivo neste artigo utiliza o protocolo MQTT, que comunica através da porta 8883. Esta porta pode ser bloqueada em alguns ambientes de rede empresarial e educacional. Para obter mais informações e formas de contornar este problema, veja Ligar ao Hub IoT (MQTT).

Registar um novo dispositivo no hub IoT

Nesta secção, vai utilizar a CLI do Azure para criar uma identidade de dispositivo para este artigo. Os IDs dos dispositivos são sensíveis às maiúsculas e minúsculas.

  1. Abra o Azure Cloud Shell.

  2. No Azure Cloud Shell, execute o seguinte comando para instalar a Extensão IoT do Microsoft Azure para a CLI do Azure:

    az extension add --name azure-iot
    
  3. Crie uma nova identidade de dispositivo denominada myDeviceId e obtenha a cadeia de ligação do dispositivo com estes comandos:

    az iot hub device-identity create --device-id myDeviceId --hub-name {Your IoT Hub name} --resource-group {Resource group of the Hub}
    az iot hub device-identity connection-string show --device-id myDeviceId --hub-name {Your IoT Hub name} --resource-group {Resource group of the Hub} -o table
    

    Importante

    O ID do dispositivo poderá estar visível no registos recolhidos para suporte técnico ao cliente e resolução de problemas, pelo que deve evitar incluir informações confidenciais quando lhe der um nome.

Tome nota da cadeia de ligação do dispositivo a partir do resultado. Esta cadeia de ligação de dispositivo é utilizada pela aplicação do dispositivo para ligar à sua Hub IoT como um dispositivo.

Criar uma aplicação de dispositivo com um método direto

Nesta secção, pode:

  • Crie uma aplicação de consola Python que responda a um método direto chamado pela cloud.

  • Simular um reinício do dispositivo.

  • Utilize as propriedades comunicadas para permitir que as consultas do dispositivo duplo identifiquem dispositivos e quando foram reiniciadas pela última vez.

No Azure Cloud Shell utilizou anteriormente ou qualquer outro ambiente com Python, crie o código do dispositivo.

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

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

  3. Adicione as seguintes import instruções no início do ficheiro dmpatterns_getstarted_device.py .

    import time
    import datetime
    from azure.iot.device import IoTHubDeviceClient, MethodResponse
    
  4. Adicione a variável CONNECTION_STRING . Substitua o valor do {deviceConnectionString} marcador de posição pela cadeia de ligação do dispositivo. Copiou esta cadeia de ligação anteriormente em Registar um novo dispositivo no hub IoT.

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Adicione a seguinte função para instanciar um cliente configurado para métodos diretos no dispositivo.

    def create_client():
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        # Define the handler for method requests
        def method_request_handler(method_request):
            if method_request.name == "rebootDevice":
                # Act on the method by rebooting the device
                print("Rebooting device")
                time.sleep(20)
                print("Device rebooted")
    
                # ...and patching the reported properties
                current_time = str(datetime.datetime.now())
                reported_props = {"rebootTime": current_time}
                client.patch_twin_reported_properties(reported_props)
                print( "Device twins updated with latest rebootTime")
    
                # Create a method response indicating the method request was resolved
                resp_status = 200
                resp_payload = {"Response": "This is the response from the device"}
                method_response = MethodResponse(method_request.request_id, resp_status, resp_payload)
    
            else:
                # Create a method response indicating the method request was for an unknown method
                resp_status = 404
                resp_payload = {"Response": "Unknown method"}
                method_response = MethodResponse(method_request.request_id, resp_status, resp_payload)
    
            # Send the method response
            client.send_method_response(method_response)
    
        try:
            # Attach the handler to the client
            client.on_method_request_received = method_request_handler
        except:
            # In the event of failure, clean up
            client.shutdown()
    
        return client
    
  6. Inicie o exemplo do método direto e aguarde.

    def main():
        print ("Starting the IoT Hub Python sample...")
        client = create_client()
    
        print ("Waiting for commands, press Ctrl-C to exit")
        try:
            # Wait for program exit
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoTHubDeviceClient sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
    if __name__ == '__main__':
        main()
    
  7. Guarde e feche o ficheiro dmpatterns_getstarted_device.py .

Nota

Para facilitar, este tutorial não implementa nenhuma política de repetição. No código de produção, deve implementar políticas de repetição (como um recuo exponencial), conforme sugerido no artigo Processamento transitório de falhas.

Obter a cadeia de ligação do hub IoT

Neste artigo, vai criar um serviço de back-end que invoca um método direto num dispositivo. Para invocar um método direto num dispositivo através de Hub IoT, o serviço precisa da permissão de ligação do serviço. Por predefinição, todos os Hub IoT são criados com uma política de acesso partilhado denominada serviço que concede esta permissão.

Para obter a cadeia de ligação Hub IoT para a política de serviço, 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 IoT, selecione Políticas de acesso partilhado.

  3. Na lista de políticas, selecione a política de serviço .

  4. Copie a cadeia de ligação Primária e guarde o valor.

Captura de ecrã que mostra como obter a cadeia de ligação do Hub IoT no portal do Azure.

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 aplicação de serviço para acionar um reinício

Nesta secção, vai criar uma aplicação de consola Python que inicia um reinício remoto num dispositivo com um método direto. A aplicação utiliza consultas de dispositivo duplo para detetar a hora do último reinício desse dispositivo.

No Azure Cloud Shell ou em qualquer outro ambiente com Python, crie o código da consola.

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

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

  3. Adicione as seguintes import instruções no início do ficheiro dmpatterns_getstarted_service.py .

    import sys, time
    
    from azure.iot.hub import IoTHubRegistryManager
    from azure.iot.hub.models import CloudToDeviceMethod, CloudToDeviceMethodResult, Twin
    
  4. Adicione as seguintes declarações de variáveis. Substitua o valor do {IoTHubConnectionString} marcador de posição pela cadeia de ligação do hub IoT que copiou anteriormente em Obter a cadeia de ligação do hub IoT. Substitua o valor do {deviceId} marcador de posição pelo ID do dispositivo que registou em Registar um novo dispositivo no hub IoT.

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
    METHOD_NAME = "rebootDevice"
    METHOD_PAYLOAD = "{\"method_number\":\"42\"}"
    TIMEOUT = 60
    WAIT_COUNT = 10
    
  5. Adicione a seguinte função para invocar o método do dispositivo para reiniciar o dispositivo de destino e, em seguida, consultar os dispositivos duplos e obter a hora do último reinício.

    def iothub_devicemethod_sample_run():
        try:
            # Create IoTHubRegistryManager
            registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
            print ( "" )
            print ( "Invoking device to reboot..." )
    
            # Call the direct method.
            deviceMethod = CloudToDeviceMethod(method_name=METHOD_NAME, payload=METHOD_PAYLOAD)
            response = registry_manager.invoke_device_method(DEVICE_ID, deviceMethod)
    
            print ( "" )
            print ( "Successfully invoked the device to reboot." )
    
            print ( "" )
            print ( response.payload )
    
            while True:
                print ( "" )
                print ( "IoTHubClient waiting for commands, press Ctrl-C to exit" )
    
                status_counter = 0
                while status_counter <= WAIT_COUNT:
                    twin_info = registry_manager.get_twin(DEVICE_ID)
    
                    if twin_info.properties.reported.get("rebootTime") != None :
                        print ("Last reboot time: " + twin_info.properties.reported.get("rebootTime"))
                    else:
                        print ("Waiting for device to report last reboot time...")
    
                    time.sleep(5)
                    status_counter += 1
    
        except Exception as ex:
            print ( "" )
            print ( "Unexpected error {0}".format(ex) )
            return
        except KeyboardInterrupt:
            print ( "" )
            print ( "IoTHubDeviceMethod sample stopped" )
    
    if __name__ == '__main__':
        print ( "Starting the IoT Hub Service Client DeviceManagement Python sample..." )
        print ( "    Connection string = {0}".format(CONNECTION_STRING) )
        print ( "    Device ID         = {0}".format(DEVICE_ID) )
    
        iothub_devicemethod_sample_run()
    
  6. Guarde e feche o ficheiro dmpatterns_getstarted_service.py .

Executar as aplicações

Está agora pronto para executar o código do dispositivo e o código de serviço que inicia um reinício do dispositivo.

  1. Na linha de comandos onde criou o dispositivo, execute o seguinte comando para começar a escutar o método direto de reinício.

    python dmpatterns_getstarted_device.py
    
  2. Na linha de comandos onde cria o serviço, execute o seguinte comando para acionar o reinício remoto e a consulta do dispositivo duplo para encontrar a hora do último reinício.

    python dmpatterns_getstarted_service.py
    
  3. Verá a resposta do dispositivo ao método direto na consola do .

    O seguinte mostra a resposta do dispositivo ao método direto de reinício:

    Saída da aplicação de dispositivo simulado

    O seguinte mostra o serviço a chamar o método direto de reinício e a consultar o estado do dispositivo duplo:

    Acionar a saída do serviço de reinício

Personalizar e expandir as ações de gestão de dispositivos

As suas soluções de IoT podem expandir o conjunto definido de padrões de gestão de dispositivos ou ativar padrões personalizados com os primitivos do dispositivo duplo e do método cloud para dispositivo. Outros exemplos de ações de gestão de dispositivos incluem a reposição de fábrica, atualização de firmware, atualização de software, gestão de energia, gestão de rede e conectividade e encriptação de dados.

Janelas de manutenção do dispositivo

Normalmente, configura dispositivos para efetuar ações de cada vez que minimizam as interrupções e o tempo de inatividade. As janelas de manutenção do dispositivo são um padrão frequentemente utilizado para definir a hora em que um dispositivo deve atualizar a configuração. As suas soluções de back-end podem utilizar as propriedades pretendidas do dispositivo duplo para definir e ativar uma política no seu dispositivo que permite uma janela de manutenção. Quando um dispositivo recebe a política de janela de manutenção, pode utilizar a propriedade reportada do dispositivo duplo para comunicar o estado da política. Em seguida, a aplicação de back-end pode utilizar consultas de dispositivo duplo para atestar a conformidade dos dispositivos e de cada política.

Passos seguintes

Neste artigo, utilizou um método direto para acionar um reinício remoto num dispositivo. Utilizou as propriedades comunicadas para comunicar a hora do último reinício do dispositivo e consultou o dispositivo duplo para detetar a hora do último reinício do dispositivo a partir da cloud.

Para continuar a introdução aos padrões de gestão de Hub IoT e dispositivos, como a atualização ponto a ponto baseada em imagens no artigo Atualização de Dispositivos para Hub IoT do Azure utilizando a Imagem de Referência raspberry Pi 3 B+.

Para saber como expandir a sua solução de IoT e agendar chamadas de método em vários dispositivos, veja Agendar e difundir tarefas.