Connettere il dispositivo simulato all'hub IoT usando PythonConnect your simulated device to your IoT hub using Python

IntroduzioneIntroduction

L'hub IoT di Azure è un servizio completamente gestito che consente comunicazioni bidirezionali affidabili e sicure tra milioni di dispositivi IoT (Internet delle cose) e un back-end della soluzione.Azure IoT Hub is a fully managed service that enables reliable and secure bi-directional communications between millions of Internet of Things (IoT) devices and a solution back end. Una delle maggiori difficoltà con i progetti IoT consiste nel connettere in modo affidabile e sicuro i dispositivi al back-end della soluzione.One of the biggest challenges that IoT projects face is how to reliably and securely connect devices to the solution back end. Per affrontare questa sfida, l'hub IoT:To address this challenge, IoT Hub:

  • Offre messaggistica affidabile da dispositivo a cloud e da cloud a dispositivo su vasta scala.Offers reliable device-to-cloud and cloud-to-device hyper-scale messaging.
  • Rende possibili comunicazioni sicure mediante le credenziali di sicurezza per i singoli dispositivi e il controllo di accesso.Enables secure communications using per-device security credentials and access control.
  • Comprende librerie di dispositivi per i linguaggi e le piattaforme più diffusi.Includes device libraries for the most popular languages and platforms.

Questa esercitazione illustra come:This tutorial shows you how to:

  • Usare il portale di Azure per creare un hub IoT.Use the Azure portal to create an IoT hub.
  • Creare un'identità del dispositivo nell'hub IoT.Create a device identity in your IoT hub.
  • Creare un'app per dispositivo simulato che invii dati di telemetria al back-end della soluzione.Create a simulated device app that sends telemetry to your solution back end.

Al termine di questa esercitazione si avranno due app Python:At the end of this tutorial, you will have two Python apps:

  • CreateDeviceIdentity.py, che crea un'identità del dispositivo e la chiave di sicurezza associata per connettere l'app per dispositivo simulato.CreateDeviceIdentity.py, which creates a device identity and associated security key to connect your simulated device app.
  • SimulatedDevice.py, che si connette all'hub IoT con l'identità del dispositivo creata in precedenza e invia periodicamente un messaggio di telemetria usando il protocollo MQTT.SimulatedDevice.py, which connects to your IoT hub with the device identity created earlier, and periodically sends a telemetry message using the MQTT protocol.

Nota

L'articolo Azure IoT SDK offre informazioni sui vari Azure IoT SDK che è possibile usare per compilare applicazioni da eseguire nei dispositivi e il backend della soluzione.The article Azure IoT SDKs provides information about the Azure IoT SDKs that you can use to build both applications to run on devices and your solution back end.

Per completare l'esercitazione, sono necessari gli elementi seguenti:To complete this tutorial, you need the following:

Nota

I pacchetti pip per azure-iothub-service-client e azure-iothub-device-client sono attualmente disponibili solo per il sistema operativo Windows.The pip packages for azure-iothub-service-client and azure-iothub-device-client are currently available only for Windows OS. Per Linux o Mac OS, vedere le sezioni dedicate ai sistemi operativi Linux e Mac OS nel post Prepare your development environment for Python (Preparare l'ambiente di sviluppo per Python).For Linux/Mac OS, please refer to the Linux and Mac OS-specific sections on the Prepare your development environment for Python post.

Creare un hub IoTCreate an IoT hub

Creare un hub IoT per connettere l'app per dispositivo simulato.Create an IoT hub for your simulated device app to connect to. La procedura seguente illustra come completare questa attività usando il portale di Azure.The following steps show you how to complete this task by using the Azure portal.

  1. Accedere al portale di Azure.Sign in to the Azure portal.
  2. Selezionare Nuovo > Internet delle cose > Hub IoT.Select New > Internet of Things > IoT Hub.

    Indice del portale di Azure

  3. Nel riquadro Hub IoT immettere le informazioni seguenti per l'hub IoT:In the IoT hub pane, enter the following information for your IoT hub:

    • Nome: creare un nome per l'hub IoT.Name: Create a name for your IoT hub. Se il nome immesso è valido, viene visualizzato un segno di spunta verde.If the name you enter is valid, a green check mark appears.

    Importante

    L'hub IoT sarà individuabile pubblicamente come endpoint DNS, quindi evitare di indicare informazioni riservate nell'assegnazione del nome.The IoT hub will be publicly discoverable as a DNS endpoint, so make sure to avoid any sensitive information while naming it.

    • Piano tariffario e livello di scalabilità: per questa esercitazione selezionare il livello F1 gratuito.Pricing and scale tier: For this tutorial, select the F1 - Free tier. Per altre informazioni, vedere la pagina relativa a piano tariffario e livello di scalabilità.For more information, see the Pricing and scale tier.

    • Gruppo di risorse: creare un gruppo di risorse per ospitare l'hub IoT o usarne uno esistente.Resource group: Create a resource group to host the IoT hub or use an existing one. Per altre informazioni, vedere l'articolo su come usare i gruppi di risorse per gestire le risorse di Azure.For more information, see Use resource groups to manage your Azure resources

    • Località: selezionare la località più vicina.Location: Select the closest location to you.

    • Aggiungi al dashboard: selezionare questa opzione per semplificare l'accesso all'hub IoT dal dashboard.Pin to dashboard: Check this option for easy access to your IoT hub from the dashboard.

      Finestra Hub IoT

  4. Fare clic su Crea.Click Create. La creazione dell'hub IoT può richiedere alcuni minuti.Your IoT hub might take a few minutes to create. È possibile monitorare lo stato di avanzamento nel riquadro Notifiche.You can monitor the progress in the Notifications pane.

Ora che è stato creato un hub IoT, individuare le informazioni importanti che consentono di connettere dispositivi e applicazioni all'hub IoT.Now that you have created an IoT hub, locate the important information that you use to connect devices and applications to your IoT hub.

  1. Dopo avere creato l'hub IoT, fare clic sul nuovo riquadro dell'hub IoT nel portale di Azure per aprire la finestra delle proprietà.When the IoT hub has been created successfully, click the new tile for your IoT hub in the Azure portal to open the properties window for the new IoT hub. Annotare il Nome host, quindi fare clic su Criteri di accesso condiviso.Make a note of the Hostname, and then click Shared access policies.

    Finestra del nuovo hub IoT

  2. In Criteri di accesso condivisi fare clic sul criterio iothubowner, quindi copiare e annotare la stringa di connessione dell'hub IoT nella finestra iothubowner.In Shared access policies, click the iothubowner policy, and then copy and make note of the IoT Hub connection string in the iothubowner window. Per altre informazioni, vedere Controllo di accesso nella "Guida per gli sviluppatori dell'hub IoT".For more information, see Access control in the "IoT Hub developer guide."

    Criteri di accesso condivisi

L'hub IoT è stato creato.You have now created your IoT hub. Usare il nome host e la stringa di connessione dell'hub IoT nel resto dell'esercitazione.Use the IoT Hub host name and the IoT Hub connection string in the rest of this tutorial.

Nota

È anche possibile creare con facilità un hub IoT personalizzato in una riga di comando, usando l'interfaccia della riga di comando di Azure basata su Python o Node.js.You can also easily create your IoT hub on a command line, using the Python or Node.js based Azure CLI. L'articolo Creare un hub IoT usando l'interfaccia della riga di comando di Azure 2.0 illustra la procedura rapida per eseguire questa operazione.The article Create an IoT hub using the Azure CLI 2.0 shows you the quick steps to do so.

Creare un'identità del dispositivoCreate a device identity

Questa sezione elenca i passaggi per la creazione di un'app console Python, che crea un'identità del dispositivo nel registro delle identità dell'hub IoT.This section lists the steps to create a Python console app, that creates a device identity in the identity registry of your IoT hub. Un dispositivo può connettersi all'hub IoT solo se ha una voce nel registro delle identità.A device can only connect to IoT Hub if it has an entry in the identity registry. Per altre informazioni, vedere la sezione Registro di identità della Guida per gli sviluppatori dell'hub IoT.For more information, see the Identity Registry section of the IoT Hub developer guide. Quando si esegue questa app console vengono generati un ID dispositivo univoco e una chiave con cui il dispositivo può identificarsi quando invia messaggi da dispositivo a cloud all'hub IoT.When you run this console app, it generates a unique device ID and key that your device can use to identify itself when it sends device-to-cloud messages to IoT Hub.

  1. Aprire un prompt dei comandi e installare Azure IoT Hub Service SDK per Python.Open a command prompt and install the Azure IoT Hub Service SDK for Python. Chiudere il prompt dei comandi dopo l'installazione dell'SDK.Close the command prompt after you install the SDK.

    pip install azure-iothub-service-client
    
  2. Creare un file di Python denominato CreateDeviceIdentity.py.Create a Python file named CreateDeviceIdentity.py. Aprirlo in un editor/IDE di Python di propria scelta, ad esempio l'editor IDLE predefinito.Open it in a Python editor/IDE of your choice, for example, the default IDLE.

  3. Aggiungere il codice seguente per importare i moduli necessari dall'SDK del servizio:Add the following code to import the required modules from the service SDK:

    import sys
    import iothub_service_client
    from iothub_service_client import IoTHubRegistryManager, IoTHubRegistryManagerAuthMethod
    from iothub_service_client import IoTHubDeviceStatus, IoTHubError
    
  4. Aggiungere il codice seguente, sostituendo il segnaposto per [IoTHub Connection String] con la stringa di connessione dell'hub IoT creato nella sezione precedente.Add the following code, replacing the placeholder for [IoTHub Connection String] with the connection string for the IoT hub you created in the previous section. È possibile usare qualsiasi nome per DEVICE_ID.You can use any name as the DEVICE_ID.

    CONNECTION_STRING = "[IoTHub Connection String]"
    DEVICE_ID = "MyFirstPythonDevice"
    

    Importante

    L'ID dispositivo può essere visibile nei log raccolti per il supporto tecnico e la risoluzione dei problemi, quindi evitare di indicare informazioni riservate nell'assegnazione del nome.The device ID may be visible in the logs collected for customer support and troubleshooting, so make sure to avoid any sensitive information while naming it.

  5. Aggiungere la funzione seguente per stampare alcune informazioni del dispositivo.Add the following function to print some of the device information.

    def print_device_info(title, iothub_device):
        print ( title + ":" )
        print ( "iothubDevice.deviceId                    = {0}".format(iothub_device.deviceId) )
        print ( "iothubDevice.primaryKey                  = {0}".format(iothub_device.primaryKey) )
        print ( "iothubDevice.secondaryKey                = {0}".format(iothub_device.secondaryKey) )
        print ( "iothubDevice.connectionState             = {0}".format(iothub_device.connectionState) )
        print ( "iothubDevice.status                      = {0}".format(iothub_device.status) )
        print ( "iothubDevice.lastActivityTime            = {0}".format(iothub_device.lastActivityTime) )
        print ( "iothubDevice.cloudToDeviceMessageCount   = {0}".format(iothub_device.cloudToDeviceMessageCount) )
        print ( "iothubDevice.isManaged                   = {0}".format(iothub_device.isManaged) )
        print ( "iothubDevice.authMethod                  = {0}".format(iothub_device.authMethod) )
        print ( "" )
    
  6. Aggiungere la funzione seguente per creare l'identificazione del dispositivo usando Gestore Registro di sistema.Add the following function to create the device identification using the Registry Manager.

    def iothub_createdevice():
        try:
            iothub_registry_manager = IoTHubRegistryManager(CONNECTION_STRING)
            auth_method = IoTHubRegistryManagerAuthMethod.SHARED_PRIVATE_KEY
            new_device = iothub_registry_manager.create_device(DEVICE_ID, "", "", auth_method)
            print_device_info("CreateDevice", new_device)
    
        except IoTHubError as iothub_error:
            print ( "Unexpected error {0}".format(iothub_error) )
            return
        except KeyboardInterrupt:
            print ( "iothub_createdevice stopped" )
    
  7. Aggiungere infine la funzione main, come indicato di seguito, quindi salvare il file.Finally, add the main function as follows and save the file.

    if __name__ == '__main__':
        print ( "" )
        print ( "Python {0}".format(sys.version) )
        print ( "Creating device using the Azure IoT Hub Service SDK for Python" )
        print ( "" )
        print ( "    Connection string = {0}".format(CONNECTION_STRING) )
        print ( "    Device ID         = {0}".format(DEVICE_ID) )
    
        iothub_createdevice()
    
  8. Nel prompt dei comandi eseguire CreateDeviceIdentity.py, come indicato di seguito:On the command prompt, run the CreateDeviceIdentity.py as follows:

    python CreateDeviceIdentity.py
    
  9. Verrà visualizzata la creazione del dispositivo simulato.You should see the simulated device getting created. Annotare il valore di deviceId e di primaryKey per il dispositivo.Note down the deviceId and the primaryKey of this device. che saranno necessari più avanti quando si creerà un'applicazione che si connette all'hub IoT come dispositivo.You need these values later when you create an application that connects to IoT Hub as a device.

    La creazione del dispositivo è stata completata

Nota

Il registro di identità dell'hub IoT archivia solo le identità del dispositivo per abilitare l'accesso sicuro all'hub.The IoT Hub identity registry only stores device identities to enable secure access to the IoT hub. Archivia le chiavi e gli ID dispositivo da usare come credenziali di sicurezza e un flag di abilitazione/disabilitazione che consente di disabilitare l'accesso per un singolo dispositivo.It stores device IDs and keys to use as security credentials and an enabled/disabled flag that you can use to disable access for an individual device. Se l'applicazione deve archiviare altri metadati specifici del dispositivo, dovrà usare un archivio specifico dell'applicazione.If your application needs to store other device-specific metadata, it should use an application-specific store. Per altre informazioni, vedere la Guida per gli sviluppatori dell'hub IoT.For more information, see the IoT Hub developer guide.

Creare un'app di dispositivo simulatoCreate a simulated device app

Questa sezione elenca i passaggi per la creazione di un'app console di Python, che simula un dispositivo e invia messaggi da dispositivo a cloud all'hub IoT.This section lists the steps to create a Python console app, that simulates a device and sends device-to-cloud messages to your IoT hub.

  1. Aprire un nuovo prompt dei comandi e installare Azure IoT Hub Device SDK per Python, come indicato di seguito.Open a new command prompt and install the Azure IoT Hub Device SDK for Python as follows. Chiudere il prompt dei comandi dopo l'installazione.Close the command prompt after the installation.

    pip install azure-iothub-device-client
    
  2. Creare un file denominato SimulatedDevice.py.Create a file named SimulatedDevice.py. Aprire il file in un editor/IDE di Python di propria scelta, ad esempio IDLE.Open this file in a Python editor/IDE of your choice (for example, IDLE).

  3. Aggiungere il codice seguente per importare i moduli necessari dall'SDK del dispositivo.Add the following code to import the required modules from the device SDK.

    import random
    import time
    import sys
    import iothub_client
    from iothub_client import IoTHubClient, IoTHubClientError, IoTHubTransportProvider, IoTHubClientResult
    from iothub_client import IoTHubMessage, IoTHubMessageDispositionResult, IoTHubError, DeviceMethodReturnValue
    
  4. Aggiungere il codice seguente e sostituire il segnaposto per [IoTHub Device Connection String] con la stringa di connessione per il dispositivo.Add the following code and replace the placeholder for [IoTHub Device Connection String] with the connection string for your device. La stringa di connessione del dispositivo ha in genere il formato HostName=<hostName>;DeviceId=<deviceId>;SharedAccessKey=<primaryKey>.The device connection string is usually in the format of HostName=<hostName>;DeviceId=<deviceId>;SharedAccessKey=<primaryKey>. Usare il valore deviceId e il valore primaryKey del dispositivo creato nella sezione precedente per sostituire rispettivamente i valori <deviceId> e <primaryKey>.Use the deviceId and primaryKey of the device you created in the previous section to replace the <deviceId> and <primaryKey> respectively. Sostituire <hostName> con il nome host dell'hub IoT, in genere come <IoT hub name>.azure-devices.net.Replace <hostName> with your IoT hub's host name, usually as <IoT hub name>.azure-devices.net.

    # String containing Hostname, Device Id & Device Key in the format
    CONNECTION_STRING = "[IoTHub Device Connection String]"
    # choose HTTP, AMQP or MQTT as transport protocol
    PROTOCOL = IoTHubTransportProvider.MQTT
    MESSAGE_TIMEOUT = 10000
    AVG_WIND_SPEED = 10.0
    SEND_CALLBACKS = 0
    MSG_TXT = "{\"deviceId\": \"MyFirstPythonDevice\",\"windSpeed\": %.2f}"    
    
  5. Aggiungere il codice seguente per definire un callback di conferma di invio.Add the following code to define a send confirmation callback.

    def send_confirmation_callback(message, result, user_context):
        global SEND_CALLBACKS
        print ( "Confirmation[%d] received for message with result = %s" % (user_context, result) )
        map_properties = message.properties()
        print ( "    message_id: %s" % message.message_id )
        print ( "    correlation_id: %s" % message.correlation_id )
        key_value_pair = map_properties.get_internals()
        print ( "    Properties: %s" % key_value_pair )
        SEND_CALLBACKS += 1
        print ( "    Total calls confirmed: %d" % SEND_CALLBACKS )
    
  6. Aggiungere il codice seguente per inizializzare il client del dispositivo.Add the following code to initialize the device client.

    def iothub_client_init():
        # prepare iothub client
        client = IoTHubClient(CONNECTION_STRING, PROTOCOL)
        # set the time until a message times out
        client.set_option("messageTimeout", MESSAGE_TIMEOUT)
        client.set_option("logtrace", 0)
        client.set_option("product_info", "HappyPath_Simulated-Python")
        return client
    
  7. Aggiungere la funzione seguente al formato e inviare un messaggio dal dispositivo simulato all'hub IoT.Add the following function to format and send a message from your simulated device to your IoT hub.

    def iothub_client_telemetry_sample_run():
    
        try:
            client = iothub_client_init()
            print ( "IoT Hub device sending periodic messages, press Ctrl-C to exit" )
            message_counter = 0
    
            while True:
                msg_txt_formatted = MSG_TXT % (AVG_WIND_SPEED + (random.random() * 4 + 2))
                # messages can be encoded as string or bytearray
                if (message_counter & 1) == 1:
                    message = IoTHubMessage(bytearray(msg_txt_formatted, 'utf8'))
                else:
                    message = IoTHubMessage(msg_txt_formatted)
                # optional: assign ids
                message.message_id = "message_%d" % message_counter
                message.correlation_id = "correlation_%d" % message_counter
                # optional: assign properties
                prop_map = message.properties()
                prop_text = "PropMsg_%d" % message_counter
                prop_map.add("Property", prop_text)
    
                client.send_event_async(message, send_confirmation_callback, message_counter)
                print ( "IoTHubClient.send_event_async accepted message [%d] for transmission to IoT Hub." % message_counter )
    
                status = client.get_send_status()
                print ( "Send status: %s" % status )
                time.sleep(30)
    
                status = client.get_send_status()
                print ( "Send status: %s" % status )
    
                message_counter += 1
    
        except IoTHubError as iothub_error:
            print ( "Unexpected error %s from IoTHub" % iothub_error )
            return
        except KeyboardInterrupt:
            print ( "IoTHubClient sample stopped" )
    
  8. Aggiungere infine la funzione main.Finally, add the main function.

    if __name__ == '__main__':
        print ( "Simulating a device using the Azure IoT Hub Device SDK for Python" )
        print ( "    Protocol %s" % PROTOCOL )
        print ( "    Connection string=%s" % CONNECTION_STRING )
    
        iothub_client_telemetry_sample_run()
    
  9. Salvare e chiudere il file SimulatedDevice.py.Save and close the SimulatedDevice.py file. A questo punto è possibile eseguire l'app.You are now ready to run this app.

Nota

Per semplicità, in questa esercitazione non si implementa alcun criterio di ripetizione dei tentativi.To keep things simple, this tutorial does not implement any retry policy. Nel codice di produzione è consigliabile implementare criteri per i tentativi, ad esempio un backoff esponenziale, come illustrato nell'articolo di MSDN Transient Fault Handling (Gestione degli errori temporanei).In production code, you should implement retry policies (such as an exponential backoff), as suggested in the MSDN article Transient Fault Handling.

Ricevere messaggi dal dispositivo simulatoReceive messages from your simulated device

Per ricevere messaggi di telemetria dal dispositivo, è necessario usare un endpoint compatibile con Hub eventi esposto dall'hub IoT, che legge i messaggi dal dispositivo al cloud.To receive telemetry messages from your device, you need to use an Event Hubs-compatible endpoint exposed by the IoT Hub, which reads the device-to-cloud messages. Per informazioni su come elaborare i messaggi dagli hub eventi per l'endpoint compatibile con hub eventi dell'hub IoT, vedere l'esercitazione Introduzione agli hub eventi.Read the Get Started with Event Hubs tutorial for information on how to process messages from Event Hubs for your IoT hub's Event Hub-compatible endpoint. Gli hub eventi non supportano ancora la telemetria in Python. È quindi possibile creare un'app console di Node.js o .NET basata sugli hub eventi per leggere i messaggi dal dispositivo al cloud dall'hub IoT.Event Hubs does not support telemetry in Python yet, so you can either create a Node.js or a .NET Event Hubs-based console app to read the device-to-cloud messages from IoT Hub. Questa esercitazione mostra come usare lo strumento IoT Hub Explorer per leggere questi messaggi del dispositivo.This tutorial shows how you can use the IoT Hub Explorer tool to read these device messages.

  1. Aprire un prompt dei comandi e installare IoT Hub Explorer.Open a command prompt and install the IoT Hub Explorer.

    npm install -g iothub-explorer
    
  2. Eseguire il comando seguente nel prompt dei comandi per avviare il monitoraggio dei messaggi dal dispositivo al cloud dal dispositivo.Run the following command on the command prompt, to begin monitoring the device-to-cloud messages from your device. Usare la stringa di connessione dell'hub IoT nel segnaposto dopo --login.Use your IoT hub's connection string in the placeholder after --login.

    iothub-explorer monitor-events MyFirstPythonDevice --login "[IoTHub connection string]"
    
  3. Aprire un nuovo prompt dei comandi e passare alla directory contenente il file SimulatedDevice.py.Open a new command prompt and navigate to the directory containing the SimulatedDevice.py file.

  4. Eseguire il file SimulatedDevice.py, che invia periodicamente dati di telemetria all'hub IoT.Run the SimulatedDevice.py file, which periodically sends telemetry data to your IoT hub.

    python SimulatedDevice.py
    
  5. Osservare i messaggi del dispositivo nel prompt dei comandi eseguendo lo strumento IoT Hub Explorer dalla sezione precedente.Observe the device messages on the command prompt running the IoT Hub Explorer from the previous section.

    Messaggi dal dispositivo Python al cloud

Passaggi successiviNext steps

In questa esercitazione è stato configurato un nuovo hub IoT nel Portale di Azure ed è stata quindi creata un'identità del dispositivo nel registro di identità dell'hub IoT.In this tutorial, you configured a new IoT hub in the Azure portal, and then created a device identity in the IoT hub's identity registry. Questa identità del dispositivo è stata usata per consentire all'app per dispositivo simulato di inviare all'hub IoT messaggi dispositivo a cloud.You used this device identity to enable the simulated device app to send device-to-cloud messages to the IoT hub. Sono stati osservati i messaggi ricevuti dall'hub IoT tramite lo strumento IoT Hub Explorer.You observed the messages received by the IoT hub with the help of the IoT Hub Explorer tool.

Per esplorare Python SDK per ottenere informazioni approfondite sull'utilizzo dell'hub IoT di Azure, vedere questo repository di GitHub.To explore the Python SDK for Azure IoT Hub usage in depth, visit this Git Hub repo. Per verificare le funzionalità di messaggistica di Azure IoT Hub Service SDK per Python, è possibile scaricare ed eseguire iothub_messaging_sample.py.To review the messaging capabilities of the Azure IoT Hub Service SDK for Python, you can download and run iothub_messaging_sample.py. Per la simulazione lato dispositivo con Azure IoT Hub Device SDK per Python, è possibile scaricare ed eseguire iothub_client_sample.py.For device side simulation using the Azure IoT Hub Device SDK for Python, you can download and run the iothub_client_sample.py.

Per altre informazioni sulle attività iniziali con l'hub IoT e per esplorare altri scenari IoT, vedere:To continue getting started with IoT Hub and to explore other IoT scenarios, see:

Per informazioni sull'estensione della soluzione IoT e l'elaborazione di messaggi dispositivo a cloud su vasta scala, vedere l'esercitazione Elaborare messaggi dispositivo a cloud.To learn how to extend your IoT solution and process device-to-cloud messages at scale, see the Process device-to-cloud messages tutorial.

Per altre informazioni sulle attività iniziali con l'hub IoT di Azure e per esplorare altri scenari IoT, vedere:To continue to get started with Azure IoT Hub and to explore other IoT scenarios, see the following: