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.
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
Con un editor de texto, cree un archivo llamado SimulatedDevice.py.
Agregue las siguientes instrucciones y variables
import
al principio del archivo SimulatedDevice.py:import time from azure.iot.device import IoTHubDeviceClient RECEIVED_MESSAGES = 0
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}"
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))
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()
Agregue la siguiente función main:
if __name__ == '__main__': main()
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:
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.
En el panel de la izquierda de IoT Hub, seleccione Directivas de acceso compartido.
En la lista de directivas, seleccione la directiva service.
Copie la Cadena de conexión principal y guarde el valor.
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.
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
Con un editor de texto, cree un archivo llamado SendCloudToDeviceMessage.py.
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}"
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}"
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" )
Agregue la siguiente función main:
if __name__ == '__main__': print ( "Starting the Python IoT Hub C2D Messaging service sample..." ) iothub_messaging_sample_run()
Guarde y cierre el archivo SendCloudToDeviceMessage.py.
Ejecución de las aplicaciones
Ya está listo para ejecutar las aplicaciones.
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
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
Anote el mensaje que recibirá en el dispositivo.
Pasos siguientes
En este artículo, ha aprendido a enviar y recibir mensajes de la nube al dispositivo.
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.
Para más información acerca del formato de los mensajes de IoT Hub, consulte Creación y lectura de mensajes de IoT Hub.