Skicka meddelanden från moln till enhet med IoT Hub (Python)
Azure IoT Hub är en fullständigt hanterad tjänst som möjliggör tillförlitlig och säker dubbelriktad kommunikation mellan miljontals enheter och en serverdelslösning.
Den här artikeln visar hur du:
Skicka meddelanden från moln till enhet (C2D) från din lösningsserverdel till en enda enhet via IoT Hub
Ta emot meddelanden från moln till enhet på en enhet
Anteckning
Funktionerna som beskrivs i den här artikeln är endast tillgängliga på standardnivån för IoT Hub. Mer information om nivåerna basic och standard/kostnadsfri IoT Hub finns i Välja rätt IoT Hub nivå för din lösning.
I slutet av den här artikeln kör du två Python-konsolappar:
SimulatedDevice.py: simulerar en enhet som ansluter till din IoT-hubb och tar emot meddelanden från molnet till enheten.
SendCloudToDeviceMessage.py: skickar meddelanden från molnet till enheten till den simulerade enhetsappen via IoT Hub.
Mer information om moln-till-enhet-meddelanden finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.
Anteckning
IoT Hub har SDK-stöd för många enhetsplattformar och språk (C, Java, Python och JavaScript) via SDK:er för Azure IoT-enheter.
Förutsättningar
Ett aktivt Azure-konto. (Om du inte har något konto kan du skapa ett kostnadsfritt konto på bara några minuter.)
En IoT-hubb. Skapa en med CLI eller Azure Portal.
En registrerad enhet. Registrera en i Azure Portal.
Python version 3.7 eller senare rekommenderas. Se till att använda en 32-bitars eller 64-bitars installation beroende på vad som krävs för din konfiguration. Se till att du lägger till Python i den plattformsspecifika miljövariabeln när du uppmanas att göra det under installationen.
Kontrollera att port 8883 är öppen i brandväggen. Enhetsexemplet i den här artikeln använder MQTT-protokollet, som kommunicerar via port 8883. Den här porten kan blockeras i vissa företags- och utbildningsnätverksmiljöer. Mer information och sätt att kringgå det här problemet finns i Ansluta till IoT Hub (MQTT).
Ta emot meddelanden i den simulerade enhetsappen
I det här avsnittet skapar du en Python-konsolapp för att simulera en enhet och ta emot meddelanden från molnet till enheten från IoT-hubben.
Från en kommandotolk i arbetskatalogen installerar du Azure IoT Hub Device SDK för Python:
pip install azure-iot-device
Skapa en fil med namnet SimulatedDevice.py med hjälp av en textredigerare.
Lägg till följande
import
instruktioner och variabler i början av SimulatedDevice.py-filen :import time from azure.iot.device import IoTHubDeviceClient RECEIVED_MESSAGES = 0
Lägg till följande kod i SimulatedDevice.py filen.
{deviceConnectionString}
Ersätt platshållarvärdet med anslutningssträngen för den registrerade enheten i Krav:CONNECTION_STRING = "{deviceConnectionString}"
Definiera följande funktion som används för att skriva ut mottagna meddelanden till konsolen:
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))
Lägg till följande kod för att initiera klienten och vänta på att få meddelandet från molnet till enheten:
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()
Lägg till följande huvudfunktion:
if __name__ == '__main__': main()
Spara och stäng filen SimulatedDevice.py.
Mer information om meddelandelivscykeln från moln till enhet och hur IoT Hub bearbetar meddelanden från molnet till enheten finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.
Hämta IoT Hub-anslutningssträngen
I den här artikeln skapar du en serverdelstjänst för att skicka meddelanden från moln till enhet via din IoT Hub. Om du vill skicka meddelanden från molnet till enheten behöver din tjänst behörighet att ansluta till tjänsten . Som standard skapas varje IoT Hub med en princip för delad åtkomst med namnet service som ger den här behörigheten.
Så här hämtar du IoT Hub anslutningssträngen för tjänstprincipen:
I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan hubben i listan över resurser.
I fönstret till vänster i IoT-hubben väljer du Principer för delad åtkomst.
I listan över principer väljer du tjänstprincipen .
Kopiera den primära anslutningssträngen och spara värdet.
Mer information om IoT Hub principer och behörigheter för delad åtkomst finns i Åtkomstkontroll och behörigheter.
Skicka ett meddelande från molnet till enheten
I det här avsnittet skapar du en Python-konsolapp som skickar meddelanden från molnet till enheten till den simulerade enhetsappen. Du behöver enhets-ID:t från enheten och IoT Hub-anslutningssträngen.
Öppna en kommandotolk i arbetskatalogen och installera Azure IoT Hub Service SDK för Python.
pip install azure-iot-hub
Skapa en fil med namnet SendCloudToDeviceMessage.py med hjälp av en textredigerare.
Lägg till följande
import
instruktioner och variabler i början av SendCloudToDeviceMessage.py-filen :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}"
Lägg till följande kod i SendCloudToDeviceMessage.py filen. Ersätt platshållarvärdena
{iot hub connection string}
och{device id}
med IoT Hub-anslutningssträngen och enhets-ID:t som du antecknade tidigare:CONNECTION_STRING = "{IoTHubConnectionString}" DEVICE_ID = "{deviceId}"
Lägg till följande kod för att skicka meddelanden till enheten:
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" )
Lägg till följande huvudfunktion:
if __name__ == '__main__': print ( "Starting the Python IoT Hub C2D Messaging service sample..." ) iothub_messaging_sample_run()
Spara och stäng SendCloudToDeviceMessage.py fil.
Köra programmen
Nu är du redo att köra programmen.
I kommandotolken i arbetskatalogen kör du följande kommando för att lyssna efter meddelanden från molnet till enheten:
python SimulatedDevice.py
Öppna en ny kommandotolk i arbetskatalogen och kör följande kommando för att skicka meddelanden från molnet till enheten:
python SendCloudToDeviceMessage.py
Observera meddelandena som tagits emot av enheten.
Nästa steg
I den här artikeln har du lärt dig hur du skickar och tar emot meddelanden från molnet till enheten.
Mer information om moln-till-enhet-meddelanden finns i Skicka meddelanden från molnet till enheten från en IoT-hubb.
Mer information om IoT Hub meddelandeformat finns i Skapa och läsa IoT Hub meddelanden.