Esercitazione: Usare un modello di Azure Resource Manager per configurare il routing dei messaggi per l'hub IoTTutorial: Use an Azure Resource Manager template to configure IoT Hub message routing

Il routing dei messaggi consente l'invio dei dati di telemetria dai dispositivi IoT agli endpoint compatibili con Hub eventi predefiniti o agli endpoint personalizzati, ad esempio l'archiviazione BLOB, le code del bus di servizio, gli argomenti del bus di servizio e Hub eventi.Message routing enables sending telemetry data from your IoT devices to built-in Event Hub-compatible endpoints or custom endpoints such as blob storage, Service Bus Queues, Service Bus Topics, and Event Hubs. Per configurare il routing dei messaggi personalizzato, creare query di routing per personalizzare la route che corrisponde a una determinata condizione.To configure custom message routing, you create routing queries to customize the route that matches a certain condition. Una volta impostati, i dati in ingresso vengono automaticamente indirizzati agli endpoint dall'hub IoT.Once set up, the incoming data is automatically routed to the endpoints by the IoT Hub. Se un messaggio non corrisponde ad alcuna delle query di routing definita, viene indirizzato all'endpoint predefinito.If a message doesn't match any of the defined routing queries, it is routed to the default endpoint.

In questa esercitazione in due parti, si apprenderà come configurare e usare le query di routing personalizzate con l'hub IoT.In this 2-part tutorial, you learn how to set up and use these custom routing queries with IoT Hub. Si indirizzano i messaggi di routing da un dispositivo IoT a uno degli endpoint multipli, compresa l'archiviazione BLOB e una coda del bus di servizio.You route messages from an IoT device to one of multiple endpoints, including blob storage and a Service Bus queue. I messaggi per la coda del bus di servizio saranno prelevati da un'App per la logica e inviati tramite posta elettronica.Messages to the Service Bus queue are picked up by a Logic App and sent via e-mail. I messaggi per cui non è stato definito il routing personalizzato vengono inviati all'endpoint predefinito, selezionati da Analisi di flusso di Azure e visualizzati in una visualizzazione di Power BI.Messages that do not have custom message routing defined are sent to the default endpoint, then picked up by Azure Stream Analytics and viewed in a Power BI visualization.

Per completate la prima e la seconda parte di questa esercitazione, eseguire le seguenti attività:To complete Parts 1 and 2 of this tutorial, you perform the following tasks:

Parte I: Creare risorse e configurare il routing dei messaggiPart I: Create resources, set up message routing

  • Creare le risorse, ossia un hub IoT, un account di archiviazione, una coda del bus di servizio e un dispositivo simulato.Create the resources -- an IoT hub, a storage account, a Service Bus queue, and a simulated device. A tale scopo, usare il portale di Azure, un modello di Azure Resource Manager, l'interfaccia della riga di comando di Azure o Azure PowerShell.This can be done using the Azure portal, an Azure Resource Manager template, the Azure CLI, or Azure PowerShell.
  • Configurare gli endpoint e le route dei messaggi nell'hub IoT per l'account di archiviazione e la coda del bus di servizio.Configure the endpoints and message routes in IoT Hub for the storage account and Service Bus queue.

Parte II: Inviare messaggi all'hub e visualizzare i risultati instradatiPart II: Send messages to the hub, view routed results

  • Creare un'app per la logica che viene attivata e che invia e-mail quando viene aggiunto un messaggio alla coda del Bus di servizio.Create a Logic App that is triggered and sends e-mail when a message is added to the Service Bus queue.
  • Scaricare ed eseguire un'app che simuli un dispositivo IoT che invia messaggi all'hub per le diverse opzioni di routing.Download and run an app that simulates an IoT Device sending messages to the hub for the different routing options.
  • Creare una visualizzazione di Power BI per i dati inviati all'endpoint predefinito.Create a Power BI visualization for data sent to the default endpoint.
  • Visualizzare i risultati...View the results ...
  • ...nella Coda del bus di servizio e nei messaggi di posta elettronica....in the Service Bus queue and e-mails.
  • ...nell'account di archiviazione....in the storage account.
  • ... nella visualizzazione di Power BI....in the Power BI visualization.

PrerequisitiPrerequisites

  • Per la prima parte di questa esercitazione:For Part 1 of this tutorial:

    • È necessario disporre di una sottoscrizione di Azure.You must have an Azure subscription. Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.If you don't have an Azure subscription, create a free account before you begin.
  • Per la seconda parte di questa esercitazione:For Part 2 of this tutorial:

    • È necessario aver completato la prima parte di questa esercitazione e avere ancora a disposizione le risorse.You must have completed Part 1 of this tutorial, and have the resources still available.
    • Installare Visual Studio.Install Visual Studio.
    • Avere accesso a un account di Power BI per analizzare l'analisi di flusso dell'endpoint predefinito.Have access to a Power BI account to analyze the default endpoint's stream analytics. (Provare gratuitamente Power BI.)(Try Power BI for free.)
    • Disporre di un account aziendale o dell'istituto di istruzione per l'invio di notifiche tramite posta elettronica.Have a work or school account for sending notification e-mails.
    • Assicurarsi che la porta 8883 sia aperta nel firewall.Make sure that port 8883 is open in your firewall. L'esempio di questa esercitazione usa il protocollo MQTT, che comunica tramite la porta 8883.The sample in this tutorial uses MQTT protocol, which communicates over port 8883. Questa porta potrebbe essere bloccata in alcuni ambienti di rete aziendali e didattici.This port may be blocked in some corporate and educational network environments. Per altre informazioni e soluzioni alternative per questo problema, vedere Connettersi all'hub IoT (MQTT).For more information and ways to work around this issue, see Connecting to IoT Hub (MQTT).

Usare Azure Cloud ShellUse Azure Cloud Shell

Azure Cloud Shell è un ambiente di shell interattivo ospitato in Azure e usato tramite il browser.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. È possibile usare Bash o PowerShell con Cloud Shell per usare i servizi di Azure.You can use either Bash or PowerShell with Cloud Shell to work with Azure services. È possibile usare i comandi preinstallati di Cloud Shell per eseguire il codice contenuto in questo articolo senza dover installare strumenti nell'ambiente locale.You can use the Cloud Shell preinstalled commands to run the code in this article without having to install anything on your local environment.

Per avviare Azure Cloud Shell:To start Azure Cloud Shell:

OpzioneOption Esempio/CollegamentoExample/Link
Selezionare Prova nell'angolo superiore destro di un blocco di codice.Select Try It in the upper-right corner of a code block. La selezione di Prova non comporta la copia automatica del codice in Cloud Shell.Selecting Try It doesn't automatically copy the code to Cloud Shell. Esempio di Prova per Azure Cloud Shell
Passare a https://shell.azure.com o selezionare il pulsante Avvia Cloud Shell per aprire Cloud Shell nel browser.Go to https://shell.azure.com, or select the Launch Cloud Shell button to open Cloud Shell in your browser. Avviare Cloud Shell in una nuova finestraLaunch Cloud Shell in a new window
Selezionare il pulsante Cloud Shell nella barra dei menu nell'angolo in alto a destra del portale di Azure.Select the Cloud Shell button on the menu bar at the upper right in the Azure portal. Pulsante Cloud Shell nel portale di Azure

Per eseguire il codice di questo articolo in Azure Cloud Shell:To run the code in this article in Azure Cloud Shell:

  1. Avviare Cloud Shell.Start Cloud Shell.

  2. Selezionare il pulsante Copia in un blocco di codice per copiare il codice.Select the Copy button on a code block to copy the code.

  3. Incollare il codice nella sessione di Cloud Shell premendo CTRL+MAIUSC+V in Windows e Linux o CMD+MAIUSC+V in macOS.Paste the code into the Cloud Shell session by selecting Ctrl+Shift+V on Windows and Linux or by selecting Cmd+Shift+V on macOS.

  4. Premere INVIO per eseguire il codice.Select Enter to run the code.

Creare le risorse di baseCreate base resources

Prima di poter configurare il routing dei messaggi, è necessario creare un hub IoT, un account di archiviazione e una coda del bus di servizio.Before you can configure the message routing, you need to create an IoT hub, a storage account, and a Service Bus queue. Queste risorse possono essere create usando uno dei quattro articoli disponibili nella prima parte di questa esercitazione: il portale di Azure, un modello di Azure Resource Manager, l'interfaccia della riga di comando di Azure o Azure PowerShell.These resources can be created using one of the four articles that are available for Part 1 of this tutorial: the Azure portal, an Azure Resource Manager template, the Azure CLI, or Azure PowerShell.

Usare lo stesso gruppo di risorse e lo stesso percorso per tutte le risorse.Use the same resource group and location for all of the resources. Alla fine, poi, è possibile rimuovere tutte le risorse in un unico passaggio tramite l'eliminazione del gruppo di risorse.Then at the end, you can remove all of the resources in one step by deleting the resource group.

Di seguito è riportato un riepilogo dei passaggi da eseguire nelle sezioni seguenti:Below is a summary of the steps to be performed in the following sections:

  1. Creare un gruppo di risorse.Create a resource group.

  2. Creare un hub IoT nel livello S1.Create an IoT hub in the S1 tier. Aggiungere un gruppo di consumer all'hub IoTAdd a consumer group to your IoT hub. Il gruppo di consumer è usato da Analisi di flusso di Azure quando si recuperano i dati.The consumer group is used by the Azure Stream Analytics when retrieving data.

    Nota

    Per completare questa esercitazione, è necessario utilizzare un hub IoT in un livello a pagamento.You must use an Iot hub in a paid tier to complete this tutorial. Il livello gratuito consente solo di configurare un endpoint e questa esercitazione ne richiede di più.The free tier only allows you to set up one endpoint, and this tutorial requires multiple endpoints.

  3. Creare un account di archiviazione V1 standard con la replica Standard_LRS.Create a standard V1 storage account with Standard_LRS replication.

  4. Creare uno spazio dei nomi del bus di servizio e una codaCreate a Service Bus namespace and queue.

  5. Creare un'identità del dispositivo per il dispositivo simulato che invia messaggi all'hub dell'utente.Create a device identity for the simulated device that sends messages to your hub. Salvare la chiave per la fase del test.Save the key for the testing phase. Se si crea un modello di Resource Manager, questa operazione viene eseguita dopo la distribuzione del modello.(If creating a Resource Manager template, this is done after deploying the template.)

Routing dei messaggiMessage routing

Si stanno per inviare messaggi a diverse risorse in base alle proprietà allegate al messaggio dal dispositivo simulato.You are going to route messages to different resources based on properties attached to the message by the simulated device. I messaggi che non sono indirizzati in modo personalizzato vengono inviati all'endpoint predefinito (messaggi/eventi).Messages that are not custom routed are sent to the default endpoint (messages/events). Nella prossima esercitazione, si inviano messaggi all'hub IoT per poi visualizzarli indirizzati a destinazioni diverse.In the next tutorial, you send messages to the IoT Hub and see them routed to the different destinations.

valoreValue RisultatoResult
level="storage"level="storage" Scrivere ad archiviazione di AzureWrite to Azure Storage.
level="critical"level="critical" Scrivere a una coda del bus di servizio.Write to a Service Bus queue. Un'app per la logica recupera il messaggio dalla coda e usa Office 365 per inviare il messaggio con posta elettronica.A Logic App retrieves the message from the queue and uses Office 365 to e-mail the message.
defaultdefault Visualizzare questi dati con Power BI.Display this data using Power BI.

Il primo passaggio consiste nell'impostare l'endpoint a cui verranno instradati i dati.The first step is to set up the endpoint to which the data will be routed. Il secondo passaggio consiste nel configurare la route di messaggi che usa tale endpoint.The second step is to set up the message route that uses that endpoint. Dopo aver configurato il routing, è possibile visualizzare gli endpoint e le route di messaggi nel portale.After setting up the routing, you can view the endpoints and message routes in the portal.

Scaricare il modello e il file dei parametriDownload the template and parameters file

Per la seconda parte di questa esercitazione, scaricare ed eseguire un'applicazione di Visual Studio per inviare messaggi all'hub IoT.For the second part of this tutorial, you download and run a Visual Studio application to send messages to the IoT Hub. Il download include una cartella contenente il modello di Azure Resource Manager e il file di parametri, oltre agli script dell'interfaccia della riga di comando di Azure e di PowerShell.There is a folder in that download that contains the Azure Resource Manager template and parameters file, as well as the Azure CLI and PowerShell scripts.

Procedere a scaricare gli esempi in C# di IoT di Azure.Go ahead and download the Azure IoT C# Samples now. Estrarre il file master.zip.Unzip the master.zip file. Il modello di Resource Manager e il file di parametri, denominati template_iothub.json e template_iothub_parameters.json, si trovano nel percorso /iot-hub/Tutorials/Routing/SimulatedDevice/resources/.The Resource Manager template and the parameters file are in /iot-hub/Tutorials/Routing/SimulatedDevice/resources/ as template_iothub.json and template_iothub_parameters.json.

Creare le risorseCreate your resources

Per creare tutte le risorse, verrà usato un modello di Azure Resource Manager.You're going to use an Azure Resource Manager (RM) template to create all of your resources. Gli script dell'interfaccia della riga di comando di Azure e di PowerShell possono essere eseguiti alcune righe alla volta.The Azure CLI and PowerShell scripts can be run a few lines at a time. Il modello di Resource Manager viene distribuito in un unico passaggio.An RM template is deployed in one step. Questo articolo illustra le sezioni separatamente per una maggiore comprensibilità di ognuna.This article shows you the sections separately to help you understand each one. Quindi mostrerà come distribuire il modello e creare il dispositivo virtuale per i test.Then it will show you how to deploy the template, and create the virtual device for testing. Dopo la distribuzione del modello, è possibile visualizzare la configurazione del routing dei messaggi nel portale.After the template is deployed, you can view the message routing configuration in the portal.

Diversi nomi di risorse devono essere univoci globali, come il nome dell'hub IoT e il nome dell'account di archiviazione.There are several resource names that must be globally unique, such as the IoT Hub name and the storage account name. Per semplificare la denominazione delle risorse, ai nomi viene aggiunto un valore alfanumerico casuale generato dalla data/ora corrente.To make naming the resources easier, those resource names are set up to append a random alphanumeric value generated from the current date/time.

Se si esamina il modello, si vedrà dove sono configurate le variabili per queste risorse che accettano il parametro passato e lo concatenano con randomValue.If you look at the template, you'll see where variables are set up for these resources that take the parameter passed in and concatenate randomValue to the parameter.

La sezione seguente descrive i parametri usati.The following section explains the parameters used.

ParametriParameters

La maggior parte di questi parametri hanno valori predefiniti.Most of these parameters have default values. Quelli che terminano con _in sono concatenati con randomValue per renderli univoci globali.The ones ending with _in are concatenated with randomValue to make them globally unique.

randomValue: un valore generato dalla data/ora corrente quando si distribuisce il modello.randomValue: This value is generated from the current date/time when you deploy the template. Questo campo non si trova nel file di parametri e viene generato dal modello stesso.This field is not in the parameters file, as it is generated in the template itself.

subscriptionId: viene impostato automaticamente sulla sottoscrizione in cui viene distribuito il modello.subscriptionId: This field is set for you to the subscription into which you are deploying the template. Non si trova nel file di parametri perché viene impostato automaticamente.This field is not in the parameters file since it is set for you.

IoTHubName_in: il nome dell'hub IoT di base, concatenato con randomValue per renderlo univoco globale.IoTHubName_in: This field is the base IoT Hub name, which is concatenated with the randomValue to be globally unique.

location: l'area di Azure in cui si esegue la distribuzione, ad esempio "westus".location: This field is the Azure region into which you are deploying, such as "westus".

consumer_group: il gruppo di consumer impostato per i messaggi trasferiti attraverso l'endpoint di routing.consumer_group: This field is the consumer group set for messages coming through the routing endpoint. Viene usato per filtrare i risultati in Analisi di flusso di Azure.It is used to filter results in Azure Stream Analytics. È ad esempio possibile scegliere di recuperare tutti i contenuti nell'intero flusso oppure, nel caso di dati in arrivo con consumer_group impostato su Contoso, configurare un flusso di Analisi di flusso di Azure (e un report di Power BI) per mostrare solo queste voci.For example, there is the whole stream where you get everything, or if you have data coming through with consumer_group set to Contoso, then you can set up an Azure Stream Analytics stream (and Power BI report) to show only those entries. Questo campo viene usato nella seconda parte dell'esercitazione.This field is used in part 2 of this tutorial.

sku_name: il livello per l'hub IoT.sku_name: This field is the scaling for the IoT Hub. Il valore deve essere S1 o superiore; un livello gratuito non funziona con questa esercitazione perché non consente molteplici endpoint.This value must be S1 or above; a free tier does not work for this tutorial because it does not allow multiple endpoints.

sku_units: associato a sku_name, rappresenta il numero di unità dell'hub IoT che è possibile usare.sku_units: This field goes with the sku_name, and is the number of IoT Hub units that can be used.

d2c_partitions: il numero di partizioni usate per il flusso di eventi.d2c_partitions: This field is the number of partitions used for the event stream.

storageAccountName_in: il nome dell'account di archiviazione da creare.storageAccountName_in: This field is the name of the storage account to be created. I messaggi vengono instradati a un contenitore nell'account di archiviazione.Messages are routed to a container in the storage account. Questo campo è concatenato con randomValue per renderlo univoco globale.This field is concatenated with the randomValue to make it globally unique.

storageContainerName: il nome del contenitore in cui vengono archiviati i messaggi instradati nell'account di archiviazione.storageContainerName: This field is the name of the container in which the messages routed to the storage account are stored.

storage_endpoint: il nome dell'endpoint dell'account di archiviazione usato per il routing dei messaggi.storage_endpoint: This field is the name for the storage account endpoint used by the message routing.

service_bus_namespace_in: il nome dello spazio dei nomi del bus di servizio da creare.service_bus_namespace_in: This field is the name of the Service Bus namespace to be created. Questo valore viene concatenato con randomValue per renderlo univoco globale.This value is concatenated with the randomValue to make it globally unique.

service_bus_queue_in: il nome della coda del bus di servizio usata per il routing dei messaggi.service_bus_queue_in: This field is the name of the Service Bus queue used for routing messages. Questo valore viene concatenato con randomValue per renderlo univoco globale.This value is concatenated with the randomValue to make it globally unique.

AuthRules_sb_queue: indica le regole di autorizzazione per la coda del bus di servizio, usate per recuperare la stringa di connessione per la coda.AuthRules_sb_queue: This field is the authorization rules for the service bus queue, used to retrieve the connection string for the queue.

variablesVariables

Questi valori vengono usati nel modello e derivano prevalentemente dai parametri.These values are used in the template, and are mostly derived from parameters.

queueAuthorizationRuleResourceId: il valore ResourceId per la regola di autorizzazione per la coda del bus di servizio.queueAuthorizationRuleResourceId: This field is the ResourceId for the authorization rule for the Service Bus queue. ResourceId viene a sua volta usato per recuperare la stringa di connessione per la coda.ResourceId is in turn used to retrieve the connection string for the queue.

iotHubName: il nome dell'hub IoT dopo la concatenazione con randomValue.iotHubName: This field is the name of the IoT Hub after having randomValue concatenated.

StorageAccountName: il nome dell'account di archiviazione dopo la concatenazione con randomValue.storageAccountName: This field is the name of the storage account after having randomValue concatenated.

service_bus_namespace: lo spazio dei nomi dopo la concatenazione con randomValue.service_bus_namespace: This field is the namespace after having randomValue concatenated.

service_bus_queue: il nome della coda del bus di servizio dopo la concatenazione con randomValue.service_bus_queue: This field is the Service Bus queue name after having randomValue concatenated.

sbVersion: la versione dell'API del bus di servizio da usare.sbVersion: The version of the Service Bus API to use. In questo caso è "2017-04-01".In this case, it is "2017-04-01".

Risorse: account di archiviazione e contenitoreResources: Storage account and container

La prima risorsa da creare è l'account di archiviazione, insieme al contenitore in cui vengono instradati i messaggi.The first resource created is the storage account, along with the container to which messages are routed. Il contenitore è una risorsa all'interno dell'account di archiviazione.The container is a resource under the storage account. Include una clausola dependsOn per l'account di archiviazione, che richiede che l'account di archiviazione venga creato prima del contenitore.It has a dependsOn clause for the storage account, requiring the storage account be created before the container.

La sezione è illustrata di seguito:Here's what this section looks like:

{
    "type": "Microsoft.Storage/storageAccounts",
    "name": "[variables('storageAccountName')]",
    "apiVersion": "2018-07-01",
    "location": "[parameters('location')]",
    "sku": {
        "name": "Standard_LRS",
        "tier": "Standard"
    },
    "kind": "Storage",
    "properties": {},
    "resources": [
        {
        "type": "blobServices/containers",
        "apiVersion": "2018-07-01",
        "name": "[concat('default/', parameters('storageContainerName'))]",
        "properties": {
            "publicAccess": "None"
            } ,
        "dependsOn": [
            "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
            ]
        }
    ]
}

Risorse: spazio dei nomi e coda del bus di servizioResources: Service Bus namespace and queue

La seconda risorsa da creare è lo spazio dei nomi del bus di servizio, insieme alla coda corrispondente in cui vengono instradati i messaggi.The second resource created is the Service Bus namespace, along with the Service Bus queue to which messages are routed. Lo SKU è impostato su Standard.The SKU is set to standard. La versione dell'API viene recuperata dalle variabili.The API version is retrieved from the variables. È inoltre impostato per attivare lo spazio dei nomi del bus di servizio quando distribuisce questa sezione (stato: Active).It is also set to activate the Service Bus namespace when it deploys this section (status:Active).

{
    "type": "Microsoft.ServiceBus/namespaces",
    "comments": "The Sku should be 'Standard' for this tutorial.",
    "sku": {
        "name": "Standard",
        "tier": "Standard"
    },
    "name": "[variables('service_bus_namespace')]",
    "apiVersion": "[variables('sbVersion')]",
    "location": "[parameters('location')]",
    "properties": {
        "provisioningState": "Succeeded",
        "metricId": "[concat('a4295411-5eff-4f81-b77e-276ab1ccda12:', variables('service_bus_namespace'))]",
        "serviceBusEndpoint": "[concat('https://', variables('service_bus_namespace'),'.servicebus.windows.net:443/')]",
        "status": "Active"
    },
    "dependsOn": []
}

Questa sezione crea la coda del bus di servizio.This section creates the Service Bus queue. Questa parte dello script include una clausola dependsOn che assicura che lo spazio dei nomi venga creato prima della coda.This part of the script has a dependsOn clause that ensures the namespace is created before the queue.

{
    "type": "Microsoft.ServiceBus/namespaces/queues",
    "name": "[concat(variables('service_bus_namespace'), '/', variables('service_bus_queue'))]",
    "apiVersion": "[variables('sbVersion')]",
    "location": "[parameters('location')]",
    "scale": null,
    "properties": {},
    "dependsOn": [
        "[resourceId('Microsoft.ServiceBus/namespaces', variables('service_bus_namespace'))]"
    ]
}

Risorse: hub IoT e routing dei messaggiResources: Iot Hub and message routing

Dopo aver creato l'account di archiviazione e la coda del bus di servizio, creare l'hub IoT per il routing dei messaggi al loro interno.Now that the storage account and Service Bus queue have been created, you create the IoT Hub that routes messages to them. Il modello di Resource Manager usa la clausola dependsOn per evitare che l'hub venga creato prima della creazione delle risorse del bus di servizio e dell'account di archiviazione.The RM template uses dependsOn clauses so it doesn't try to create the hub before the Service Bus resources and the storage account have been created.

Ecco la prima parte della sezione dell'hub IoT.Here's the first part of the IoT Hub section. Questa parte del modello configura le dipendenze e inizia dalle proprietà.This part of the template sets up the dependencies and starts with the properties.

{
    "apiVersion": "2018-04-01",
    "type": "Microsoft.Devices/IotHubs",
    "name": "[variables('IoTHubName')]",
    "location": "[parameters('location')]",
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]",
        "[resourceId('Microsoft.ServiceBus/namespaces', variables('service_bus_namespace'))]",
        "[resourceId('Microsoft.ServiceBus/namespaces/queues', variables('service_bus_namespace'), variables('service_bus_queue'))]"
    ],
    "properties": {
        "eventHubEndpoints": {}
            "events": {
                "retentionTimeInDays": 1,
                "partitionCount": "[parameters('d2c_partitions')]"
                }
            },

La sezione successiva riguarda la configurazione del routing dei messaggi per l'hub IoT.The next section is the section for the message routing configuration for the Iot Hub. La prima sezione è relativa agli endpoint.First is the section for the endpoints. Questa parte del modello configura gli endpoint di routing per la coda del bus di servizio e l'account di archiviazione, incluse le stringhe di connessione.This part of the template sets up the routing endpoints for the Service Bus queue and the storage account, including the connection strings.

Per creare la stringa di connessione per la coda, è necessario il valore di queueAuthorizationRulesResourcedId, recuperato inline.To create the connection string for the queue, you need the queueAuthorizationRulesResourcedId, which is retrieved inline. Per creare la stringa di connessione per l'account di archiviazione, recuperare la chiave di archiviazione primaria e quindi usarla nel formato per la stringa di connessione.To create the connection string for the storage account, you retrieve the primary storage key and then use it in the format for the connection string.

Durante la configurazione degli endpoint viene anche impostato il formato del BLOB su AVRO o JSON.The endpoint configuration is also where you set the blob format to AVRO or JSON.

Nota

È possibile scrivere i dati nell'archiviazione BLOB in formato Apache Avro, che è quello predefinito, oppure in formato JSON (anteprima).The data can be written to blob storage in either the Apache Avro format, which is the default, or JSON (preview).

La funzionalità di codifica del formato JSON è in anteprima in tutte le aree in cui è disponibile l'hub IoT, a eccezione degli Stati Uniti orientali, degli Stati Uniti occidentali e dell'Europa occidentale.The capability to encode JSON format is in preview in all regions in which IoT Hub is available, except East US, West US and West Europe. Il formato di codifica può essere impostato solo al momento della configurazione dell'endpoint di archiviazione BLOB.The encoding format can be only set at the time the blob storage endpoint is configured. Non è possibile modificare il formato di un endpoint già configurato.The format cannot be changed for an endpoint that has already been set up. Quando si usa la codifica JSON è necessario impostare contentType su JSON e contentEncoding su UTF-8 nelle proprietà di sistema del messaggio.When using JSON encoding, you must set the contentType to JSON and the contentEncoding to UTF-8 in the message system properties.

Per informazioni più dettagliate sull'uso di un endpoint di archiviazione BLOB, vedere le indicazioni sul routing all'archiviazione.For more detailed information about using a blob storage endpoint, please see guidance on routing to storage.

"routing": {
   "endpoints": {
       "serviceBusQueues": [
       {
           "connectionString": "[Concat('Endpoint=sb://',variables('service_bus_namespace'),'.servicebus.windows.net/;SharedAccessKeyName=',parameters('AuthRules_sb_queue'),';SharedAccessKey=',listkeys(variables('queueAuthorizationRuleResourceId'),variables('sbVersion')).primaryKey,';EntityPath=',variables('service_bus_queue'))]",
           "name": "[parameters('service_bus_queue_endpoint')]",
           "subscriptionId": "[parameters('subscriptionId')]", 
           "resourceGroup": "[resourceGroup().Name]"
       }
       ],
       "serviceBusTopics": [],
       "eventHubs": [],
       "storageContainers": [
           {
               "connectionString": 
               "[Concat('DefaultEndpointsProtocol=https;AccountName=',variables('storageAccountName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), providers('Microsoft.Storage', 'storageAccounts').apiVersions[0]).keys[0].value)]",
               "containerName": "[parameters('storageContainerName')]",
               "fileNameFormat": "{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}",
               "batchFrequencyInSeconds": 100,
               "maxChunkSizeInBytes": 104857600,
               "encoding": "avro",
               "name": "[parameters('storage_endpoint')]",
               "subscriptionId": "[parameters('subscriptionId')]",
               "resourceGroup": "[resourceGroup().Name]"
           }
       ]
   },

La sezione successiva riguarda le route dei messaggi verso gli endpoint.This next section is for the message routes to the endpoints. È necessario configurarne una per ogni endpoint, quindi una per la coda del bus di servizio e una per il contenitore dell'account di archiviazione.There is one set up for each endpoint, so there is one for the Service Bus queue and one for the storage account container.

Tenere presente che la condizione di query per i messaggi da instradare nell'account di archiviazione è level="storage", mentre quella per i messaggi da instradare nella coda del bus di servizio è level="critical".Remember that the query condition for the messages being routed to storage is level="storage", and the query condition for the messages being routed to the Service Bus queue is level="critical".

"routes": [
    {
        "name": "contosoStorageRoute",
        "source": "DeviceMessages",
        "condition": "level=\"storage\"",
        "endpointNames": [
            "[parameters('storage_endpoint')]"
            ],
        "isEnabled": true
    },
    {
        "name": "contosoSBQueueRoute",
        "source": "DeviceMessages",
        "condition": "level=\"critical\"",
        "endpointNames": [
            "[parameters('service_bus_queue_endpoint')]"
            ],
        "isEnabled": true
    }
],

Questo codice JSON mostra il resto della sezione dell'hub IoT, che contiene le informazioni predefinite e lo SKU per l'hub.This json shows the rest of the IoT Hub section, which contains default information and the SKU for the hub.

            "fallbackRoute": {
                "name": "$fallback",
                "source": "DeviceMessages",
                "condition": "true",
                "endpointNames": [
                    "events"
                ],
                "isEnabled": true
            }
        },
        "storageEndpoints": {
            "$default": {
                "sasTtlAsIso8601": "PT1H",
                "connectionString": "",
                "containerName": ""
            }
        },
        "messagingEndpoints": {
            "fileNotifications": {
                "lockDurationAsIso8601": "PT1M",
                "ttlAsIso8601": "PT1H",
                "maxDeliveryCount": 10
            }
        },
        "enableFileUploadNotifications": false,
        "cloudToDevice": {
            "maxDeliveryCount": 10,
            "defaultTtlAsIso8601": "PT1H",
            "feedback": {
                "lockDurationAsIso8601": "PT1M",
                "ttlAsIso8601": "PT1H",
                "maxDeliveryCount": 10
            }
        }
    },
    "sku": {
        "name": "[parameters('sku_name')]",
        "capacity": "[parameters('sku_units')]"
    }
}

Risorse: regole di autorizzazione per la coda del bus di servizioResources: Service Bus queue authorization rules

La regola di autorizzazione per la coda del bus di servizio viene usata per recuperare la stringa di connessione per la coda del bus di servizio.The Service Bus queue authorization rule is used to retrieve the connection string for the Service Bus queue. Include una clausola dependsOn per assicurare che non venga creata prima dello spazio dei nomi del bus di servizio e della coda del bus di servizio.It uses a dependsOn clause to ensure it is not created before the Service Bus namespace and the Service Bus queue.

{
    "type": "Microsoft.ServiceBus/namespaces/queues/authorizationRules",
    "name": "[concat(variables('service_bus_namespace'), '/', variables('service_bus_queue'), '/', parameters('AuthRules_sb_queue'))]",
    "apiVersion": "[variables('sbVersion')]",
    "location": "[parameters('location')]",
    "scale": null,
    "properties": {
        "rights": [
            "Send"
        ]
    },
    "dependsOn": [
        "[resourceId('Microsoft.ServiceBus/namespaces', variables('service_bus_namespace'))]",
        "[resourceId('Microsoft.ServiceBus/namespaces/queues', variables('service_bus_namespace'), variables('service_bus_queue'))]"
    ]
},

Risorse: Gruppo di consumerResources: Consumer group

In questa sezione viene creato il gruppo di consumer per i dati dell'hub IoT che verranno usati da Analisi di flusso di Azure nella seconda parte dell'esercitazione.In this section, you create a Consumer Group for the IoT Hub data to be used by the Azure Stream Analytics in the second part of this tutorial.

{
    "type": "Microsoft.Devices/IotHubs/eventHubEndpoints/ConsumerGroups",
    "name": "[concat(variables('iotHubName'), '/events/',parameters('consumer_group'))]",
    "apiVersion": "2018-04-01",
    "dependsOn": [
        "[concat('Microsoft.Devices/IotHubs/', variables('iotHubName'))]"
    ]
}

Risorse: OutputResources: Outputs

Se si vuole inviare un valore allo script di distribuzione da visualizzare, usare una sezione di output.If you want to send a value back to the deployment script to be displayed, you use an output section. Questa parte del modello restituisce la stringa di connessione per la coda del bus di servizio.This part of the template returns the connection string for the Service Bus queue. Non è necessario che venga restituito un valore. L'esempio viene incluso solo per illustrare come vengono restituiti i risultati allo script chiamante.Returning a value isn't required, it's included as an example of how to return results to the calling script.

"outputs": {
    "sbq_connectionString": {
      "type": "string",
      "value": "[Concat('Endpoint=sb://',variables('service_bus_namespace'),'.servicebus.windows.net/;SharedAccessKeyName=',parameters('AuthRules_sb_queue'),';SharedAccessKey=',listkeys(variables('queueAuthorizationRuleResourceId'),variables('sbVersion')).primaryKey,';EntityPath=',variables('service_bus_queue'))]"
    }
  }

Distribuire il modello di Resource ManagerDeploy the RM template

Per distribuire il modello in Azure, caricarlo insieme al file di parametri in Azure Cloud Shell, quindi eseguire uno script.To deploy the template to Azure, upload the template and the parameters file to Azure Cloud Shell, and then execute a script to deploy the template. Aprire Azure Cloud Shell e accedere.Open Azure Cloud Shell and sign in. In questo esempio viene usato PowerShell.This example uses PowerShell.

Per caricare i file, selezionare l'icona Carica/Scarica file sulla barra dei menu, quindi scegliere Carica.To upload the files, select the Upload/Download files icon in the menu bar, then choose Upload.

Screenshot che evidenzia l'icona Carica/Scarica file.

Usare la finestra di Esplora file visualizzata per trovare i file nel disco locale e selezionarli, quindi scegliere Apri.Use the File Explorer that pops up to find the files on your local disk and select them, then choose Open.

Dopo il caricamento dei file, viene visualizzata una finestra di dialogo dei risultati simile a quella dell'immagine seguente.After the files are uploaded, a results dialog shows something like the following image.

Cloud Shell barra dei menu con i risultati di caricamento/download evidenziati

I file vengono caricati nella condivisione usata dall'istanza di Cloud Shell.The files are uploaded to the share used by your Cloud Shell instance.

Eseguire lo script per avviare la distribuzione.Run the script to perform the deployment. L'ultima riga dello script recupera la variabile da restituire, ossia la stringa di connessione della coda del bus di servizio.The last line of this script retrieves the variable that was set up to be returned -- the Service Bus queue connection string.

Lo script imposta e usa queste variabili:The script sets and uses these variables:

$RGName è il nome del gruppo di risorse in cui viene distribuito il modello.$RGName is the resource group name to which to deploy the template. Questo campo viene creato prima della distribuzione del modello.This field is created before deploying the template.

$location è l'area di Azure da usare per il modello, ad esempio "westus".$location is the Azure location to be used for the template, such as "westus".

deploymentname è un nome assegnato alla distribuzione per recuperare il valore della variabile da restituire.deploymentname is a name you assign to the deployment to retrieve the returning variable value.

Ecco lo script di PowerShell.Here's the PowerShell script. Copiare questo script di PowerShell e incollarlo nella finestra Cloud Shell, quindi premere INVIO per eseguirlo.Copy this PowerShell script and paste it into the Cloud Shell window, then hit Enter to run it.

$RGName="ContosoResources"
$location = "westus"
$deploymentname="contoso-routing"

# Remove the resource group if it already exists. 
#Remove-AzResourceGroup -name $RGName 
# Create the resource group.
New-AzResourceGroup -name $RGName -Location $location 

# Set a path to the parameter file. 
$parameterFile = "$HOME/template_iothub_parameters.json"
$templateFile = "$HOME/template_iothub.json"

# Deploy the template.
New-AzResourceGroupDeployment `
    -Name $deploymentname `
    -ResourceGroupName $RGName `
    -TemplateParameterFile $parameterFile `
    -TemplateFile $templateFile `
    -verbose

# Get the returning value of the connection string.
(Get-AzResourceGroupDeployment -ResourceGroupName $RGName -Name $deploymentname).Outputs.sbq_connectionString.value

Se si verificano errori dello script, è possibile modificarlo in locale, ricaricarlo in Cloud Shell ed eseguirlo di nuovo.If you have script errors, you can edit the script locally, upload it again to the Cloud Shell, and run the script again. Al termine dell'esecuzione dello script, continuare con il passaggio successivo.After the script finishes running successfully, continue to the next step.

Creare un dispositivo simulatoCreate simulated device

Successivamente, creare un'identità del dispositivo e salvare la chiave per un uso successivo.Next, create a device identity and save its key for later use. Questa identità del dispositivo viene usata dall'applicazione di simulazione per inviare messaggi all'hub IoT.This device identity is used by the simulation application to send messages to the IoT hub. Questa funzionalità non è disponibile in PowerShell o quando si usa un modello di Azure Resource Manager.This capability is not available in PowerShell or when using an Azure Resource Manager template. La procedura seguente illustra la creazione del dispositivo simulato usando il portale di Azure.The following steps tell you how to create the simulated device using the Azure portal.

  1. Aprire il portale di Azure ed eseguire l'accesso all'account di Azure.Open the Azure portal and log into your Azure account.

  2. Selezionare Gruppi di risorse e quindi scegliere il proprio gruppo di risorse.Select Resource groups and then choose your resource group. Questa esercitazione usa ContosoResources.This tutorial uses ContosoResources.

  3. Nell'elenco delle risorse selezionare l'hub IoT.In the list of resources, select your IoT hub. Questa esercitazione usa ContosoTestHub.This tutorial uses ContosoTestHub. Selezionare dispositivi IoT dal riquadro Hub.Select IoT Devices from the Hub pane.

  4. Selezionare + Nuovo.Select + New. Nel riquadro Aggiungi dispositivo, immettere l'ID del dispositivo.On the Add Device pane, fill in the device ID. Questa esercitazione usa Contoso-Test-Device.This tutorial uses Contoso-Test-Device. Lasciare vuote le chiavi e controllare Genera chiavi automaticamente.Leave the keys empty, and check Auto Generate Keys. Assicurarsi che Connetti dispositivo all'hub IoT sia abilitata.Make sure Connect device to IoT hub is enabled. Selezionare Salva.Select Save.

    Schermata Aggiungi dispositivi

  5. Ora che è stato creato, selezionare il dispositivo per visualizzare le chiavi generate.Now that it's been created, select the device to see the generated keys. Selezionare l'icona Copia sulla chiave primaria e salvarla in un punto, ad esempio nel Blocco note per la fase di test di questa esercitazione.Select the Copy icon on the Primary key and save it somewhere such as Notepad for the testing phase of this tutorial.

    Dettagli del dispositivo, comprese le chiavi

Visualizzare il routing dei messaggi nel portaleView message routing in the portal

Dopo aver configurato gli endpoint e le route dei messaggi è possibile visualizzarne la configurazione nel portale.Now that your endpoints and message routes are set up, you can view their configuration in the portal. Accedere al portale di Azure e passare a Gruppi di risorse.Sign in to the Azure portal and go to Resource Groups. In seguito, selezionare il gruppo di risorse e quindi selezionare l'hub (il cui nome inizia per ContosoTestHub in questa esercitazione).Next, select your resource group, then select your hub (the hub name starts with ContosoTestHub in this tutorial). Viene visualizzato il riquadro dell'hub IoT.You see the IoT Hub pane.

Schermata proprietà dell'hub IoT

Nelle opzioni dell'hub IoT, selezionare Routing dei messaggi.In the options for the IoT Hub, select Message Routing. Vengono visualizzate le route correttamente configurate.The routes you have set up successfully are displayed.

Le route configurate dall'utente

Nella schermata Routing dei messaggi selezionare Endpoint personalizzati per visualizzare gli endpoint definiti per le route.On the Message routing screen, select Custom Endpoints to see the endpoints you have defined for the routes.

Gli endpoint configurati per le route

Passaggi successiviNext steps

Dopo aver configurato tutte le risorse e le route dei messaggi, procedere con l'esercitazione successiva per scoprire come elaborare e visualizzare le informazioni sui messaggi instradati.Now that you have all of the resources set up and the message routes are configured, advance to the next tutorial to learn how to process and display the information about the routed messages.