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

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

Este artigo mostra-lhe como:

  • Enviar mensagens da cloud para o dispositivo (C2D) a partir do back-end da solução para um único dispositivo através de Hub IoT

  • Receber mensagens da cloud para o dispositivo num dispositivo

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, vai executar duas aplicações de consola Python:

  • SimulatedDevice.py: simula um dispositivo que se liga ao seu hub IoT e recebe mensagens da cloud para o dispositivo.

  • SendCloudToDeviceMessage.py: envia mensagens da cloud para o dispositivo para a aplicação de dispositivo simulado através de Hub IoT.

Para saber mais sobre as mensagens da cloud para o dispositivo, veja Enviar mensagens da cloud para o dispositivo a partir de um hub IoT.

Nota

Hub IoT tem suporte de SDK para muitas plataformas e linguagens de dispositivos (C, Java, Python e JavaScript) através dos SDKs de dispositivos IoT do Azure.

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

Receber mensagens na aplicação de dispositivo simulado

Nesta secção, vai criar uma aplicação de consola Python para simular um dispositivo e receber mensagens da cloud para o dispositivo a partir do hub IoT.

  1. A partir de uma linha de comandos no seu diretório de trabalho, instale o SDK do Dispositivo Hub IoT do Azure para Python:

    pip install azure-iot-device
    
  2. Com um editor de texto, crie um ficheiro com o nome SimulatedDevice.py.

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

    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. Adicione o seguinte código ao ficheiro SimulatedDevice.py . Substitua o valor do {deviceConnectionString} marcador de posição pela cadeia de ligação do dispositivo registado em Pré-requisitos:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Defina a seguinte função que é utilizada para imprimir mensagens recebidas na consola:

    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 cloud 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. Guarde e feche o ficheiro SimulatedDevice.py.

Para obter mais informações sobre o ciclo de vida das mensagens da cloud para o dispositivo e como Hub IoT processa mensagens da cloud para o dispositivo, consulte Enviar mensagens da cloud para o dispositivo a partir de um hub IoT.

Obter a cadeia de ligação do hub IoT

Neste artigo, vai criar um serviço de back-end para enviar mensagens da cloud para o dispositivo através da sua Hub IoT. Para enviar mensagens da cloud para o dispositivo, 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.

Enviar uma mensagem da cloud para o dispositivo

Nesta secção, vai criar uma aplicação de consola Python que envia mensagens da cloud para o dispositivo para a aplicação de dispositivo simulado. Precisa do ID do dispositivo e da cadeia de ligação do hub IoT.

  1. No diretório de trabalho, abra uma linha de comandos e instale o SDK do Serviço Hub IoT do Azure para Python.

    pip install azure-iot-hub
    
  2. Com um editor de texto, crie um ficheiro com o nome SendCloudToDeviceMessage.py.

  3. Adicione as seguintes import instruções e variáveis no início do ficheiro de 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 seguinte código ao ficheiro SendCloudToDeviceMessage.py . Substitua os valores de {iot hub connection string} marcador de posição e {device id} pela cadeia de ligação do hub IoT e o ID do dispositivo que anotou 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. Guarde e feche SendCloudToDeviceMessage.py ficheiro.

Executar as aplicações

Agora, está pronto para executar as aplicações.

  1. Na linha de comandos do diretório de trabalho, execute o seguinte comando para escutar mensagens da cloud para o dispositivo:

    python SimulatedDevice.py
    

    Executar a aplicação de dispositivo simulado

  2. Abra uma nova linha de comandos no diretório de trabalho e execute o seguinte comando para enviar mensagens da cloud para o dispositivo:

    python SendCloudToDeviceMessage.py
    

    Executar a aplicação para enviar o comando da cloud para o dispositivo

  3. Repare nas mensagens recebidas pelo dispositivo.

    Mensagem recebida

Passos seguintes

Neste artigo, aprendeu a enviar e receber mensagens da cloud para o dispositivo.