Envoi de messages cloud-à-appareil avec IoT Hub (Python)
Azure IoT Hub est un service entièrement géré qui permet d’autoriser des communications bidirectionnelles fiables et sécurisées entre des millions d’appareils et un serveur principal de solution.
Cet article vous montre comment :
Envoyer des messages cloud-à-appareil (C2D) de votre back-end de solution vers un seul appareil par IoT Hub
Recevoir des messages cloud-à-appareil sur un appareil
Notes
Les fonctionnalités décrites dans cet article sont uniquement disponibles au niveau Standard d’IoT Hub. Pour plus d’informations sur les niveaux de base et standard/gratuit d’IoT Hub, consultez Choisir le niveau IoT Hub correspondant à votre solution.
À la fin de cet article, exécutez deux applications console Python :
SimulatedDevice.py: simule un appareil qui se connecte à votre hub IoT et reçoit des messages du nuage vers l'appareil.
SendCloudToDeviceMessage.py : envoie des messages cloud-à-appareil à l’application d’appareil simulé par le biais d’IoT Hub.
Pour en savoir plus sur les messages cloud-à-appareil, consultez Envoyer des messages cloud-à-appareil à partir d’IoT Hub.
Notes
IoT Hub offre la prise en charge de kits SDK pour plusieurs plateformes d’appareils et langages (notamment C, Java, Python et JavaScript) par le biais de kits Azure IoT device SDK.
Prérequis
Un compte Azure actif. (Si vous ne possédez pas de compte, vous pouvez créer un compte gratuit en quelques minutes seulement.)
Un IoT Hub. Créez-en un avec l’interface CLI ou le portail Azure.
Appareil inscrit. Inscrivez-en un dans le portail Azure.
Python version 3.7 ou ultérieure est recommandé. Veillez à utiliser l’installation 32 bits ou 64 bits comme requis par votre programme d’installation. Lorsque vous y êtes invité pendant l’installation, veillez à ajouter Python à votre variable d’environnement propre à la plateforme.
Assurez-vous que le port 8883 est ouvert dans votre pare-feu. L’exemple d’appareil décrit dans cet article utilise le protocole MQTT, qui communique via le port 8883. Ce port peut être bloqué dans certains environnements réseau professionnels et scolaires. Pour plus d'informations sur les différentes façons de contourner ce problème, consultez Se connecter à IoT Hub (MQTT).
Recevoir des messages dans l’application d’appareil simulé
Dans cette section, vous créez une application de console Python pour simuler un appareil et recevoir des messages cloud-à-appareil à partir de l’IoT Hub.
À partir d’une invite de commandes dans votre répertoire de travail, installez le Kit SDK Azure IoT Hub Device pour Python :
pip install azure-iot-device
À l'aide d'un éditeur de texte, créez un fichier nommé SimulatedDevice.py.
Ajoutez les instructions et variables
import
ci-dessous au début du fichier SimulatedDevice.py :import time from azure.iot.device import IoTHubDeviceClient RECEIVED_MESSAGES = 0
Ajoutez le code suivant au fichier SimulatedDevice.py. Remplacez la valeur de l’espace
{deviceConnectionString}
réservé par la chaîne de connexion de l’appareil inscrit dans Prérequis :CONNECTION_STRING = "{deviceConnectionString}"
Définissez la fonction suivante qui est utilisée pour imprimer les messages reçus sur la 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))
Ajoutez le code suivant pour initialiser le client et attendre de recevoir le message cloud-à-appareil :
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()
Ajoutez la fonction principale suivante :
if __name__ == '__main__': main()
Enregistrez et fermez le fichier SimulatedDevice.py.
Pour plus d’informations sur le cycle de vie des messages cloud-à-appareil et sur la manière dont l’IoT Hub traite les messages cloud-à-appareil, consultez Envoyer des messages cloud-à-appareil à partir d’un hub IoT.
Obtenir la chaîne de connexion du hub IoT
Dans cet article, vous allez créer un service principal pour envoyer des messages cloud-à-appareil via votre IoT Hub. Pour envoyer des messages cloud-à-appareil, votre service a besoin de l'autorisation de connexion de service. Par défaut, chaque IoT Hub est créé avec une stratégie d’accès partagé nommée service qui accorde cette autorisation.
Pour obtenir la chaîne de connexion IoT Hub pour la stratégie service, procédez comme suit :
Dans le portail Azure, sélectionnez Groupes de ressources. Sélectionnez le groupe de ressources dans lequel se trouve votre hub, puis sélectionnez votre hub dans la liste des ressources.
Dans le volet de gauche de votre IoT Hub, sélectionnez Stratégies d’accès partagé.
Dans la liste des stratégies, sélectionnez la stratégie service.
Copiez la Chaîne de connexion principale, puis enregistrez la valeur.
Pour plus d’informations sur les autorisations et les stratégies d’accès partagé IoT Hub, consultez Contrôle d’accès et autorisations.
Envoi d’un message cloud vers appareil
Dans cette section, vous créez une application de console Python qui envoie des messages cloud-à-appareil à l’application de l’appareil simulé. Vous avez besoin de l’ID d’appareil de votre appareil et de votre chaîne de connexion IoT Hub.
Dans votre répertoire de travail, ouvrez une invite de commandes et installez le Kit de développement logiciel (SDK) Azure IoT Hub Service pour Python.
pip install azure-iot-hub
À l'aide d'un éditeur de texte, créez un fichier nommé SendCloudToDeviceMessage.py.
Ajoutez les instructions et variables
import
ci-dessous au début du fichier 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}"
Ajoutez le code suivant au fichier SendCloudToDeviceMessage.py. Remplacez les valeurs d'espace réservé
{iot hub connection string}
et{device id}
par la chaîne de connexion du hub IoT et l'identité d'appareil que vous avez notées précédemment :CONNECTION_STRING = "{IoTHubConnectionString}" DEVICE_ID = "{deviceId}"
Ajoutez le code suivant pour envoyer des messages à votre appareil :
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" )
Ajoutez la fonction principale suivante :
if __name__ == '__main__': print ( "Starting the Python IoT Hub C2D Messaging service sample..." ) iothub_messaging_sample_run()
Enregistrez et fermez le fichier SendCloudToDeviceMessage.py.
Exécution des applications
Vous êtes maintenant prêt à exécuter les applications.
À l'invite de commandes de votre répertoire de travail, exécutez la commande suivante pour écouter les messages cloud-à-appareil :
python SimulatedDevice.py
Ouvrez une nouvelle invite de commandes dans votre répertoire de travail et exécutez la commande suivante pour envoyer des messages cloud-à-appareil :
python SendCloudToDeviceMessage.py
Notez les messages reçus par l'appareil.
Étapes suivantes
Dans cet article, vous avez appris à envoyer et recevoir des messages de cloud-à-appareil.
Pour en savoir plus sur les messages cloud-à-appareil, consultez Envoyer des messages cloud-à-appareil à partir d’IoT Hub.
Pour en savoir plus sur les formats de message de IoT Hub, consultez Créer et lire des messages IoT Hub.