Envío de mensajes de nube a dispositivo con IoT Hub (Python)Send cloud-to-device messages with IoT Hub (Python)

IoT Hub de Azure es un servicio totalmente administrado que permite la comunicación bidireccional confiable y segura entre millones de dispositivos y una solución de back-end.Azure IoT Hub is a fully managed service that helps enable reliable and secure bi-directional communications between millions of devices and a solution back end. En el inicio rápido Envío de telemetría desde un dispositivo a un centro de IoT se muestra cómo crear un centro de IoT, aprovisionar en él la identidad del dispositivo y codificar una aplicación de dispositivo simulado que envíe mensajes del dispositivo a la nube.The Send telemetry from a device to an IoT hub quickstart shows how to create an IoT hub, provision a device identity in it, and code a simulated device app that sends device-to-cloud messages.

Nota

Las características descritas en este artículo solo están disponibles en el nivel estándar de IoT Hub.The features described in this article are available only in the standard tier of IoT Hub. Para más información sobre los niveles Básico y Estándar o Gratis de IoT Hub, consulte el artículo sobre cómo elegir el nivel de IoT Hub correcto.For more information about the basic and standard/free IoT Hub tiers, see Choose the right IoT Hub tier.

Este tutorial se basa en el artículo Envío de telemetría desde un dispositivo a un centro de IoT.This tutorial builds on Send telemetry from a device to an IoT hub. En él se muestra cómo realizar las siguientes acciones:It shows you how to:

  • Desde el back-end de la nube de la aplicación, envíe mensajes de nube a dispositivo en un único dispositivo a través de IoT Hub.From your solution back end, send cloud-to-device messages to a single device through IoT Hub.

  • Reciba mensajes de nube a dispositivo en un dispositivo.Receive cloud-to-device messages on a device.

Encontrará más información sobre los mensajes de nube a dispositivo en la Guía para desarrolladores de IoT Hub.You can find more information on cloud-to-device messages in the IoT Hub developer guide.

Al final de este tutorial tendrá dos aplicaciones de consola de Python:At the end of this tutorial, you run two Python console apps:

  • SimulatedDevice.py, una versión modificada de la aplicación que se creó en Envío de telemetría desde un dispositivo a un centro de IoT, que se conecta al centro de IoT y recibe mensajes de la nube al dispositivo.SimulatedDevice.py, a modified version of the app created in Send telemetry from a device to an IoT hub, which connects to your IoT hub and receives cloud-to-device messages.

  • SendCloudToDeviceMessage.py, que envía un mensaje de la nube a la aplicación de dispositivo simulado mediante IoT Hub.SendCloudToDeviceMessage.py, which sends cloud-to-device messages to the simulated device app through IoT Hub.

Nota

IoT Hub ofrece compatibilidad con el SDK en muchas plataformas de dispositivos y lenguajes (incluidos C, Java, Javascript y Python), mediante los SDK de dispositivo IoT de Azure.IoT Hub has SDK support for many device platforms and languages (including C, Java, Javascript, and Python) through Azure IoT device SDKs. Para obtener instrucciones sobre el uso de Python para conectar el dispositivo al código de este tutorial y, en general, a Azure IoT Hub, consulte el SDK de Python para Azure IoT.For instructions on how to use Python to connect your device to this tutorial's code, and generally to Azure IoT Hub, see the Azure IoT Python SDK.

PrerrequisitosPrerequisites

  • Asegúrese de que el puerto 8883 está abierto en el firewall.Make sure that port 8883 is open in your firewall. En el ejemplo de dispositivo de este artículo se usa el protocolo MQTT, que se comunica mediante el puerto 8883.The device sample in this article uses MQTT protocol, which communicates over port 8883. Este puerto puede estar bloqueado en algunos entornos de red corporativos y educativos.This port may be blocked in some corporate and educational network environments. Para más información y saber cómo solucionar este problema, consulte Conexión a IoT Hub (MQTT).For more information and ways to work around this issue, see Connecting to IoT Hub (MQTT).

Recepción de mensajes en la aplicación de dispositivo simuladoReceive messages in the simulated device app

En esta sección, creará una aplicación de consola de Python para simular el dispositivo y recibir mensajes de la nube al dispositivo desde IoT Hub.In this section, you create a Python console app to simulate the device and receive cloud-to-device messages from the IoT hub.

  1. En un símbolo del sistema del directorio de trabajo, instale el SDK del dispositivo de Azure IoT Hub para Python:From a command prompt in your working directory, install the Azure IoT Hub Device SDK for Python:

    pip install azure-iot-device
    
  2. Con un editor de texto, cree un archivo llamado SimulatedDevice.py.Using a text editor, create a file named SimulatedDevice.py.

  3. Agregue las siguientes instrucciones y variables import al principio del archivo SimulatedDevice.py:Add the following import statements and variables at the start of the SimulatedDevice.py file:

    import threading
    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. Agregue el código siguiente al archivo SimulatedDevice.py.Add the following code to SimulatedDevice.py file. Sustituya el valor de marcador de posición {deviceConnectionString} por la cadena de conexión del dispositivo para el dispositivo que ha creado en el inicio rápido Envío de telemetría desde un dispositivo a un centro de IoT:Replace the {deviceConnectionString} placeholder value with the device connection string for the device you created in the Send telemetry from a device to an IoT hub quickstart:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Agregue la función siguiente para imprimir los mensajes recibidos en la consola:Add the following function to print received messages to the console:

    def message_listener(client):
        global RECEIVED_MESSAGES
        while True:
            message = client.receive_message()
            RECEIVED_MESSAGES += 1
            print("\nMessage received:")
    
            #print data and both system and application (custom) properties
            for property in vars(message).items():
                print ("    {0}".format(property))
    
            print( "Total calls received: {}".format(RECEIVED_MESSAGES))
            print()
    
  6. Agregue el código siguiente para inicializar el cliente y espere a recibir el mensaje de la nube al dispositivo:Add the following code to initialize the client and wait to receive the cloud-to-device message:

    def iothub_client_sample_run():
        try:
            client = IoTHubDeviceClient.create_from_connection_string(CONNECTION_STRING)
    
            message_listener_thread = threading.Thread(target=message_listener, args=(client,))
            message_listener_thread.daemon = True
            message_listener_thread.start()
    
            while True:
                time.sleep(1000)
    
        except KeyboardInterrupt:
            print ( "IoT Hub C2D Messaging device sample stopped" )
    
  7. Agregue la siguiente función main:Add the following main function:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging device sample..." )
        print ( "Waiting for C2D messages, press Ctrl-C to exit" )
    
        iothub_client_sample_run()
    
  8. Guarde y cierre el archivo SimulatedDevice.py.Save and close the SimulatedDevice.py file.

Obtención de la cadena de conexión de IoT HubGet the IoT hub connection string

En este artículo, se crea un servicio de back-end para enviar mensajes de la nube a un dispositivo a través de la instancia de IoT Hub que creó en Envío de telemetría desde un dispositivo a un centro de IoT.In this article, you create a backend service to send cloud-to-device messages through the IoT hub you created in Send telemetry from a device to an IoT hub. Para enviar mensajes de nube a un dispositivo, el servicio necesita el permiso de conexión de servicio.To send cloud-to-device messages, your service needs the service connect permission. De forma predeterminada, todas las instancias de IoT Hub se crean con una directiva de acceso compartido denominada servicio que concede este permiso.By default, every IoT Hub is created with a shared access policy named service that grants this permission.

Para obtener la cadena de conexión de IoT Hub para la directiva service, siga estos pasos:To get the IoT Hub connection string for the service policy, follow these steps:

  1. En Azure Portal, seleccione Grupos de recursos.In the Azure portal, select Resource groups. Seleccione el grupo de recursos donde se encuentra el centro y, a continuación, seleccione el centro en la lista de recursos.Select the resource group where your hub is located, and then select your hub from the list of resources.

  2. En el panel de la izquierda de IoT Hub, seleccione Directivas de acceso compartido.On the left-side pane of your IoT hub, select Shared access policies.

  3. En la lista de directivas, seleccione la directiva service.From the list of policies, select the service policy.

  4. En Claves de acceso compartido, seleccione el icono de Cadena de conexión: clave principal y guarde el valor.Under Shared access keys, select the copy icon for the Connection string -- primary key and save the value.

    Recuperación de la cadena de conexión

Para obtener más información sobre las directivas de acceso compartido y los permisos de IoT Hub, consulte Permisos y control del acceso.For more information about IoT Hub shared access policies and permissions, see Access control and permissions.

Envío de mensajes de nube a dispositivoSend a cloud-to-device message

En esta sección, escribirá una aplicación de consola de Python que envía mensajes de nube a dispositivo a la aplicación del dispositivo simulado.In this section, you create a Python console app that sends cloud-to-device messages to the simulated device app. Necesitará el identificador del dispositivo que agregó en el inicio rápido Envío de telemetría desde un dispositivo a un centro de IoT.You need the device ID of the device you added in the Send telemetry from a device to an IoT hub quickstart. También necesitará la cadena de conexión de IoT Hub que copió anteriormente en Obtención de la cadena de conexión de IoT Hub.You also need the IoT hub connection string you copied previously in Get the IoT hub connection string.

  1. En el directorio de trabajo, abra un símbolo del sistema e instale el SDK del servicio Azure IoT Hub para Python.In your working directory, open a command prompt and install the Azure IoT Hub Service SDK for Python.

    pip install azure-iot-hub
    
  2. Con un editor de texto, cree un archivo llamado SendCloudToDeviceMessage.py.Using a text editor, create a file named SendCloudToDeviceMessage.py.

  3. Agregue las siguientes instrucciones y variables import al principio del archivo SendCloudToDeviceMessage.py:Add the following import statements and variables at the start of the SendCloudToDeviceMessage.py file:

    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. Agregue el código siguiente al archivo SendCloudToDeviceMessage.py.Add the following code to SendCloudToDeviceMessage.py file. Reemplace los valores de marcador de posición {iot hub connection string} y {device id} por la cadena de conexión de IoT Hub y el identificador de dispositivo que anotó anteriormente:Replace the {iot hub connection string} and {device id} placeholder values with the IoT hub connection string and device ID you noted previously:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. Agregue el código siguiente para enviar mensajes al dispositivo:Add the following code to send messages to your device:

    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. Agregue la siguiente función main:Add the following main function:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging service sample..." )
    
        iothub_messaging_sample_run()
    
  7. Guarde y cierre el archivo SendCloudToDeviceMessage.py.Save and close SendCloudToDeviceMessage.py file.

Ejecución de las aplicacionesRun the applications

Ahora está preparado para ejecutar las aplicaciones.You are now ready to run the applications.

  1. En el símbolo del sistema en el directorio de trabajo, ejecute el comando siguiente para escuchar mensajes de nube a dispositivo:At the command prompt in your working directory, run the following command to listen for cloud-to-device messages:

    python SimulatedDevice.py
    

    Ejecución de una aplicación de dispositivo simulada

  2. Abra un nuevo símbolo del sistema en el directorio de trabajo y ejecute el siguiente comando para enviar mensajes de nube a dispositivo:Open a new command prompt in your working directory and run the following command to send cloud-to-device messages:

    python SendCloudToDeviceMessage.py
    

    Ejecución de la aplicación para enviar el comando de nube a dispositivo

  3. Anote el mensaje que recibirá en el dispositivo.Note the messages received by the device.

    Mensaje recibido

Pasos siguientesNext steps

En este tutorial, aprendió a enviar y recibir mensajes de nube a dispositivo.In this tutorial, you learned how to send and receive cloud-to-device messages.

Para ver ejemplos de soluciones de un extremo a otro que usen IoT Hub, vea el Acelerador de la solución de supervisión remota de Azure IoT.To see examples of complete end-to-end solutions that use IoT Hub, see Azure IoT Remote Monitoring solution accelerator.

Para obtener más información sobre cómo desarrollar soluciones con IoT Hub, consulte la Guía para desarrolladores de IoT Hub.To learn more about developing solutions with IoT Hub, see the IoT Hub developer guide.