Envío de mensajes de nube a dispositivo con 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.

En este artículo aprenderá a:

  • Envío de mensajes de la nube al dispositivo (C2D) desde el back-end de la solución a un único dispositivo a través de IoT Hub

  • Reciba mensajes de nube a dispositivo en un dispositivo.

Nota

Las características descritas en este artículo solo están disponibles en el nivel estándar de IoT Hub. Para obtener más información sobre los niveles Básico y Estándar o Gratis de IoT Hub, consulte Elección del nivel adecuado de IoT Hub para la solución.

Al final de este artículo, ejecutará dos aplicaciones de consola de Python:

  • SimulatedDevice.py: simula un dispositivo que se conecta al centro de IoT y recibe mensajes de nube a dispositivo.

  • SendCloudToDeviceMessage.py: envía un mensaje de la nube a la aplicación de dispositivo simulado mediante IoT Hub.

Para más información sobre los mensajes de nube a dispositivo, consulte Envío de mensajes de nube a dispositivo desde un centro de IoT.

Nota

IoT Hub tiene soporte SDK para muchas plataformas de dispositivos y lenguajes (C, Java, Python y JavaScript) a través de los SDK de dispositivo IoT de Azure.

Prerrequisitos

  • Una cuenta de Azure activa. (En caso de no tener ninguna, puede crear una cuenta gratuita en tan solo unos minutos).

  • Una instancia de IoT Hub. Cree uno con la CLI o el Azure Portal.

  • Dispositivo registrado. Registre uno en el Azure Portal.

  • Se recomienda usar Python versión 3.7 o posterior. Asegúrese de usar la instalación de 32 bits o 64 bits en función del programa de instalación. Cuando se le solicite durante la instalación, asegúrese de agregar Python a la variable de entorno específica de la plataforma.

  • Asegúrese de que el puerto 8883 está abierto en el firewall. En el ejemplo de dispositivo de este artículo se usa el protocolo MQTT, que se comunica mediante el puerto 8883. Este puerto puede estar bloqueado en algunos entornos de red corporativos y educativos. Para más información y saber cómo solucionar este problema, consulte Conexión a IoT Hub (MQTT).

Recepción de mensajes en la aplicación de dispositivo simulado

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.

  1. En un símbolo del sistema del directorio de trabajo, instale el SDK del dispositivo de Azure IoT Hub para Python:

    pip install azure-iot-device
    
  2. Con un editor de texto, cree un archivo llamado SimulatedDevice.py.

  3. Agregue las siguientes instrucciones y variables import al principio del archivo SimulatedDevice.py:

    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. Agregue el código siguiente al archivo SimulatedDevice.py. Reemplace el valor del marcador de posición {deviceConnectionString} por la cadena de conexión del dispositivo registrado en Requisitos previos:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Defina la siguiente función que se usa para imprimir los mensajes recibidos en la 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. Agregue el código siguiente para inicializar el cliente y espere a recibir el mensaje de la nube al 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. Agregue la siguiente función main:

    if __name__ == '__main__':
        main()
    
  8. Guarde y cierre el archivo SimulatedDevice.py.

Para más información sobre el ciclo de vida de los mensajes de la nube al dispositivo y sobre cómo IoT Hub procesa los mensajes de nube a dispositivo, consulte Enviar mensajes de nube a dispositivo desde un IoT Hub.

Obtención de la cadena de conexión de IoT Hub

En este artículo, creará un servicio back-end para enviar mensajes de la nube al dispositivo a través de IoT Hub. Para enviar mensajes de nube a un dispositivo, el servicio necesita el permiso de conexión de servicio. De forma predeterminada, todas las instancias de IoT Hub se crean con una directiva de acceso compartido denominada servicio que concede este permiso.

Para obtener la cadena de conexión de IoT Hub para la directiva service, siga estos pasos:

  1. En Azure Portal, seleccione Grupos de recursos. Seleccione el grupo de recursos donde se encuentra el centro y, a continuación, seleccione el centro en la lista de recursos.

  2. En el panel de la izquierda de IoT Hub, seleccione Directivas de acceso compartido.

  3. En la lista de directivas, seleccione la directiva service.

  4. Copie la Cadena de conexión principal y guarde el valor.

Captura de pantalla que muestra cómo recuperar la cadena de conexión de su IoT Hub en el Azure Portal.

Para obtener más información sobre las directivas de acceso compartido y los permisos de IoT Hub, consulte Permisos y control del acceso.

Envío de mensajes de nube a dispositivo

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. Necesita el identificador de dispositivo del dispositivo y la cadena de conexión de IoT Hub.

  1. En el directorio de trabajo, abra un símbolo del sistema e instale el SDK del servicio Azure IoT Hub para Python.

    pip install azure-iot-hub
    
  2. Con un editor de texto, cree un archivo llamado SendCloudToDeviceMessage.py.

  3. Agregue las siguientes instrucciones y variables import al principio del archivo 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. Agregue el código siguiente al archivo SendCloudToDeviceMessage.py. 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:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. Agregue el código siguiente para enviar mensajes al 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. Agregue la siguiente función main:

    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.

Ejecución de las aplicaciones

Ya está listo para ejecutar las aplicaciones.

  1. En el símbolo del sistema en el directorio de trabajo, ejecute el comando siguiente para escuchar mensajes de nube a dispositivo:

    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:

    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.

    Mensaje recibido

Pasos siguientes

En este artículo, ha aprendido a enviar y recibir mensajes de la nube al dispositivo.