Inviare messaggi da cloud a dispositivo con l'hub IoT (Python)

L'hub IoT di Azure è un servizio completamente gestito che consente di abilitare comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi e un back-end della soluzione.

Questo articolo illustra come:

  • Inviare messaggi da cloud a dispositivo (C2D) dal back-end della soluzione a un singolo dispositivo tramite hub IoT

  • Ricevere messaggi da cloud a dispositivo in un dispositivo

Nota

Le funzionalità descritte in questo articolo sono disponibili solo nel livello Standard dell'hub IoT. Per altre informazioni sui livelli di hub IoT standard e standard, vedere Scegliere il livello di hub IoT appropriato per la soluzione.

Alla fine di questo articolo si eseguono due app console Python:

  • SimulatedDevice.py: simula un dispositivo che si connette all'hub IoT e riceve messaggi da cloud a dispositivo.

  • SendCloudToDeviceMessage.py: invia messaggi da cloud a dispositivo all'app per dispositivi simulati tramite hub IoT.

Per altre informazioni sui messaggi da cloud a dispositivo, vedere Inviare messaggi da cloud a dispositivo da un hub IoT.

Nota

hub IoT supporta SDK per molte piattaforme e linguaggi per dispositivi (C, Java, Python e JavaScript) tramite gli SDK per dispositivi IoT di Azure.

Prerequisiti

  • Un account Azure attivo. Se non si dispone di un account, è possibile crearne uno gratuito in pochi minuti.

  • Un hub IoT. Crearne uno con l'interfaccia della riga di comando o il portale di Azure.

  • Un dispositivo registrato. Registrarne uno nel portale di Azure.

  • È consigliabile usare Python versione 3.7 o successive. Assicurarsi di usare le installazioni a 32 bit o 64 bit, come richiesto dalla configurazione. Quando richiesto durante l'installazione, assicurarsi di aggiungere Python alla variabile di ambiente specifica per la piattaforma.

  • Assicurarsi che la porta 8883 sia aperta nel firewall. L'esempio di dispositivo di questo articolo usa il protocollo MQTT, che comunica tramite la porta 8883. Questa porta potrebbe essere bloccata in alcuni ambienti di rete aziendali e didattici. Per altre informazioni e soluzioni alternative per questo problema, vedere Connettersi all'hub IoT (MQTT).

Ricevere messaggi nell'app per dispositivo simulato

In questa sezione viene creata un'app console Python per simulare un dispositivo e ricevere messaggi da cloud a dispositivo dall'hub IoT.

  1. Da un prompt dei comandi nella directory di lavoro installare l'SDK per dispositivi hub IoT di Azure per Python:

    pip install azure-iot-device
    
  2. Usando un editor di testo, creare un file denominato SimulatedDevice.py.

  3. Aggiungere le variabili e le istruzioni import seguenti all'inizio del file SimulatedDevice.py:

    import time
    from azure.iot.device import IoTHubDeviceClient
    
    RECEIVED_MESSAGES = 0
    
  4. Aggiungere il codice seguente al file SimulatedDevice.py. Sostituire il {deviceConnectionString} valore segnaposto con la stringa di connessione per il dispositivo registrato in Prerequisiti:

    CONNECTION_STRING = "{deviceConnectionString}"
    
  5. Definire la funzione seguente usata per stampare i messaggi ricevuti nella 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))
    
  6. Aggiungere il codice seguente per inizializzare il client e attendere di ricevere il messaggio da cloud a 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. Aggiungere la funzione main seguente:

    if __name__ == '__main__':
        main()
    
  8. Salvare e chiudere il file SimulatedDevice.py.

Per altre informazioni sul ciclo di vita dei messaggi da cloud a dispositivo e su come hub IoT elabora i messaggi da cloud a dispositivo, vedere Inviare messaggi da cloud a dispositivo da un hub IoT.

Ottenere la stringa di connessione dell'hub IoT

In questo articolo viene creato un servizio back-end per inviare messaggi da cloud a dispositivo tramite il hub IoT. Per inviare messaggi da cloud a dispositivo, è necessario che il servizio disponga dell'autorizzazione di connessione al servizio. Per impostazione predefinita, ogni hub IoT viene creato con un servizio con nome di criteri di accesso condiviso che concede tale autorizzazione.

Per ottenere la stringa di connessione dell'hub IoT per i criteri del servizio, seguire questa procedura:

  1. Nel portale di Azure fare clic su Gruppi di risorse. Selezionare il gruppo di risorse in cui si trova l'hub e quindi selezionare l'hub dall'elenco di risorse.

  2. Nel riquadro sinistro dell'hub IoT selezionare Criteri di accesso condiviso.

  3. Dall'elenco dei criteri selezionare i criteri del servizio.

  4. Copiare la stringa di connessione primaria e salvare il valore.

Screenshot che mostra come recuperare la stringa di connessione dal hub IoT nel portale di Azure.

Per altre informazioni sui criteri di accesso condiviso e sulle autorizzazioni dell'hub IoT, vedere Controllo dell'accesso e autorizzazioni.

Inviare un messaggio da cloud a dispositivo

In questa sezione si crea un'app console Python che invia messaggi da cloud a dispositivo all'app di dispositivo simulato. È necessario l'ID dispositivo dal dispositivo e la stringa di connessione dell'hub IoT.

  1. Nella directory di lavoro aprire un prompt dei comandi e installare hub IoT di Azure Service SDK per Python.

    pip install azure-iot-hub
    
  2. Usando un editor di testo, creare un file denominato SendCloudToDeviceMessage.py.

  3. Aggiungere le variabili e le istruzioni import seguenti all'inizio del file 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. Aggiungere il codice seguente al file SendCloudToDeviceMessage.py. Sostituire i valori segnaposto {iot hub connection string} e {device id} con la stringa di connessione dell'hub IoT e l'ID dispositivo annotati in precedenza:

    CONNECTION_STRING = "{IoTHubConnectionString}"
    DEVICE_ID = "{deviceId}"
    
  5. Aggiungere il codice seguente per inviare messaggi 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. Aggiungere la funzione main seguente:

    if __name__ == '__main__':
        print ( "Starting the Python IoT Hub C2D Messaging service sample..." )
    
        iothub_messaging_sample_run()
    
  7. Salvare e chiudere il file SendCloudToDeviceMessage.py.

Eseguire le applicazioni

A questo momento si è pronti per eseguire le applicazioni.

  1. Al prompt dei comandi nella directory di lavoro eseguire il comando seguente per ascoltare i messaggi da cloud a dispositivo:

    python SimulatedDevice.py
    

    Eseguire un'app di dispositivo simulato

  2. Aprire un nuovo prompt dei comandi nella directory di lavoro ed eseguire il comando seguente per inviare messaggi da cloud a dispositivo:

    python SendCloudToDeviceMessage.py
    

    Eseguire l'app per inviare il comando da cloud a dispositivo

  3. Prendere nota dei messaggi ricevuti dal dispositivo.

    Messaggio ricevuto

Passaggi successivi

In questo articolo si è appreso come inviare e ricevere messaggi da cloud a dispositivo.