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.

  1. Från en kommandotolk i arbetskatalogen installerar du Azure IoT Hub Device SDK för Python:

    pip install azure-iot-device
    
  2. Skapa en fil med namnet SimulatedDevice.py med hjälp av en textredigerare.

  3. 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
    
  4. 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}"
    
  5. 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))
    
  6. 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()
    
  7. Lägg till följande huvudfunktion:

    if __name__ == '__main__':
        main()
    
  8. 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:

  1. I Azure Portal väljer du Resursgrupper. Välj den resursgrupp där hubben finns och välj sedan hubben i listan över resurser.

  2. I fönstret till vänster i IoT-hubben väljer du Principer för delad åtkomst.

  3. I listan över principer väljer du tjänstprincipen .

  4. Kopiera den primära anslutningssträngen och spara värdet.

Skärmbild som visar hur du hämtar anslutningssträngen från din IoT Hub i Azure Portal.

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.

  1. Öppna en kommandotolk i arbetskatalogen och installera Azure IoT Hub Service SDK för Python.

    pip install azure-iot-hub
    
  2. Skapa en fil med namnet SendCloudToDeviceMessage.py med hjälp av en textredigerare.

  3. 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}"
    
  4. 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}"
    
  5. 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" )
    
  6. Lägg till följande huvudfunktion:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging service sample..." )
    
        iothub_messaging_sample_run()
    
  7. Spara och stäng SendCloudToDeviceMessage.py fil.

Köra programmen

Nu är du redo att köra programmen.

  1. I kommandotolken i arbetskatalogen kör du följande kommando för att lyssna efter meddelanden från molnet till enheten:

    python SimulatedDevice.py
    

    Köra den simulerade enhetsappen

  2. Ö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
    

    Kör appen för att skicka kommandot cloud-to-device

  3. Observera meddelandena som tagits emot av enheten.

    Mottaget meddelande

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.