Enviar mensagens da nuvem para dispositivo com o Hub IoT (Python)

O Hub IoT do Azure é um serviço totalmente gerenciado que ajuda a permitir comunicações bidirecionais confiáveis e seguras entre milhões de dispositivos e um back-end de solução.

Este artigo mostra como:

  • Enviar mensagens de nuvem para dispositivo (CD2), do back-end da solução para um único dispositivo, por meio do Hub IoT

  • Receber mensagens da nuvem para dispositivo em um dispositivo

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ê executará dois aplicativos de console Python:

  • SimulatedDevice.py: simula um dispositivo que se conecta ao hub IoT e recebe mensagens de nuvem para dispositivo.

  • SendCloudToDeviceMessage.py: envia uma mensagem da nuvem para dispositivo ao aplicativo de dispositivo simulado por meio do Hub IoT.

Para saber mais sobre mensagens da nuvem para o dispositivo, confira Enviar mensagens da nuvem para o dispositivo de um Hub IoT.

Observação

O Hub IoT tem suporte a SDK para várias plataformas de dispositivo e linguagens (C, Java, Python e JavaScript) por meio dos SDKs do dispositivo IoT 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.

  • Um dispositivo registrado. Registre um no 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.

  • Verifique se a porta 8883 está aberta no firewall. O exemplo de dispositivo deste artigo usa o protocolo MQTT, que se comunica pela porta 8883. Essa porta poderá ser bloqueada em alguns ambientes de rede corporativos e educacionais. Para obter mais informações e maneiras de resolver esse problema, confira Como se conectar ao Hub IoT (MQTT).

Receber mensagens no aplicativo do dispositivo simulado

Nesta seção, você cria um aplicativo de console do Python para simular um dispositivo e receber mensagens da nuvem para dispositivo do hub IoT.

  1. De um prompt de comando em seu diretório de trabalho, instale o SDK de Dispositivo do Hub IoT do Azure para Python:

    pip install azure-iot-device
    
  2. Usando um editor de texto, crie um arquivo nomeado SimulatedDevice.py.

  3. Adicione as seguintes instruções import e variáveis ao início do arquivo SimulatedDevice.py:

    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. Adicione o código a seguir ao arquivo SimulatedDevice.py. Substitua o valor do espaço reservado {deviceConnectionString} pela cadeia de conexão do dispositivo registrado em Pré-requisitos:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Defina a função a seguir que é usada para imprimir mensagens recebidas no console:

    def message_handler(message):
        global RECEIVED_MESSAGES
        RECEIVED_MESSAGES += 1
        print("")
        print("Message received:")
    
        # print data from both system and application (custom) properties
        for property in vars(message).items():
            print ("    {}".format(property))
    
        print("Total calls received: {}".format(RECEIVED_MESSAGES))
    
  6. Adicione o seguinte código para inicializar o cliente e aguarde para receber a mensagem da nuvem para o dispositivo:

    def main():
        print ("Starting the Python IoT Hub C2D Messaging device sample...")
    
        # Instantiate the client
        client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
        print ("Waiting for C2D messages, press Ctrl-C to exit")
        try:
            # Attach the handler to the client
            client.on_message_received = message_handler
    
            while True:
                time.sleep(1000)
        except KeyboardInterrupt:
            print("IoT Hub C2D Messaging device sample stopped")
        finally:
            # Graceful exit
            print("Shutting down IoT Hub Client")
            client.shutdown()
    
  7. Adicione a seguinte função principal:

    if __name__ == '__main__':
        main()
    
  8. Salve e feche o arquivo SimulatedDevice.py.

Para obter mais informações sobre o ciclo de vida de mensagem da nuvem para dispositivo e como o Hub IoT processa mensagens de nuvem para dispositivo, confira Enviar mensagens de nuvem para dispositivo por meio de um Hub IoT.

Obter a cadeia de conexão do hub IoT

Neste artigo, você criará um serviço de back-end para enviar mensagens de nuvem para dispositivo por meio do seu Hub IoT. Para enviar mensagens de nuvem para dispositivo, o serviço precisa da permissão conexão de serviço. Por padrão, todo Hub IoT é criado com uma política de acesso compartilhado chamada serviço que concede essa permissão.

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

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

  4. Copie a Cadeia de conexão primária e salve o valor.

Captura de tela que mostra como recuperar a cadeia de conexão do seu Hub IoT no portal do Azure.

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

Envie uma mensagem da nuvem para o dispositivo

Nesta seção, você cria um aplicativo do console do Python que envia mensagens da nuvem para dispositivo ao aplicativo de dispositivo simulado. Você precisa da ID do dispositivo e da cadeia de conexão do hub IoT.

  1. Em seu diretório de trabalho, abra um prompt de comando e instale o SDK de Serviço do Hub IoT para Python.

    pip install azure-iot-hub
    
  2. Usando um editor de texto, crie um arquivo nomeado SendCloudToDeviceMessage.py.

  3. Adicione as seguintes instruções import e variáveis ao início do arquivo SendCloudToDeviceMessage.py:

    import random
    import sys
    from azure.iot.hub import IoTHubRegistryManager
    
    MESSAGE_COUNT = 2
    AVG_WIND_SPEED = 10.0
    MSG_TXT = "{\"service client sent a message\": %.2f}"
    
  4. Adicione o código a seguir ao arquivo SendCloudToDeviceMessage.py. Substitua os valores de espaço reservado {iot hub connection string} e {device id} pela cadeia de conexão do hub IoT e pela ID do dispositivo anotadas anteriormente:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. Adicione o seguinte código para enviar mensagens para o seu dispositivo:

    def iothub_messaging_sample_run():
        try:
            # Create IoTHubRegistryManager
            registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
    
            for i in range(0, MESSAGE_COUNT):
                print ( 'Sending message: {0}'.format(i) )
                data = MSG_TXT % (AVG_WIND_SPEED + (random.random() * 4 + 2))
    
                props={}
                # optional: assign system properties
                props.update(messageId = "message_%d" % i)
                props.update(correlationId = "correlation_%d" % i)
                props.update(contentType = "application/json")
    
                # optional: assign application properties
                prop_text = "PropMsg_%d" % i
                props.update(testProperty = prop_text)
    
                registry_manager.send_c2d_message(DEVICE_ID, data, properties=props)
    
            try:
                # Try Python 2.xx first
                raw_input("Press Enter to continue...\n")
            except:
                pass
                # Use Python 3.xx in the case of exception
                input("Press Enter to continue...\n")
    
        except Exception as ex:
            print ( "Unexpected error {0}" % ex )
            return
        except KeyboardInterrupt:
            print ( "IoT Hub C2D Messaging service sample stopped" )
    
  6. Adicione a seguinte função principal:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging service sample..." )
    
        iothub_messaging_sample_run()
    
  7. Salve e feche o arquivo SendCloudToDeviceMessage.py.

Executar os aplicativos

Tudo pronto para executar os aplicativos.

  1. No prompt de comando no diretório de trabalho, execute o seguinte comando para escutar mensagens da nuvem para dispositivo:

    python SimulatedDevice.py
    

    Executar um aplicativo de dispositivo simulado

  2. Abra um novo prompt de comando no diretório de trabalho e execute o seguinte comando para enviar mensagens da nuvem para dispositivo:

    python SendCloudToDeviceMessage.py
    

    Execute o aplicativo para enviar o comando da nuvem para o dispositivo

  3. Observe as mensagens recebidas pelo dispositivo.

    Mensagem recebida

Próximas etapas

Neste artigo, você aprendeu a enviar e receber mensagens de nuvem para dispositivo.