Snabbstart: Distribuera en Azure IoT-hubb och ett lagringskonto med hjälp av en ARM-mall
I den här snabbstarten använder du en Azure Resource Manager-mall (ARM-mall) för att skapa en IoT-hubb, ett Azure Storage-konto och en väg för att skicka meddelanden från IoT-hubben till lagringen. Hubben är konfigurerad så att meddelanden som skickas till hubben automatiskt dirigeras till lagringskontot om de uppfyller routningsvillkoret. I slutet av den här snabbstarten kan du öppna lagringskontot och se meddelandena som skickas.
En Azure Resource Manager-mall är en JSON-fil (JavaScript Object Notation) som definierar infrastrukturen och konfigurationen för projektet. Mallen använder deklarativ syntax. Du beskriver den avsedda distributionen utan att skriva sekvensen med programmeringskommandon för att skapa distributionen.
Om din miljö uppfyller förhandskraven och du är van att använda ARM-mallar väljer du knappen Distribuera till Azure. Mallen öppnas i Azure Portal.
Förutsättningar
- Om du inte har en Azure-prenumeration kan du skapa ett kostnadsfritt Azure-konto innan du börjar.
Granska mallen
Mallen som används i den här snabbstarten anropas 101-iothub-auto-route-messages
från Azure-snabbstartsmallar.
Två Azure-resurser definieras i mallen:
- Microsoft.Storage/storageAccounts: Ett lagringskonto med en container.
- Microsoft.Devices/IotHubs: En IoT-hubb med en slutpunkt som pekar på lagringscontainern och en väg för att skicka filtrerade meddelanden till slutpunkten.
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.26.54.24096",
"templateHash": "1111741482289134864"
}
},
"parameters": {
"projectName": {
"type": "string",
"defaultValue": "contoso",
"minLength": 1,
"maxLength": 11,
"metadata": {
"description": "Define the project name or prefix for all objects."
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "The datacenter to use for the deployment."
}
},
"skuName": {
"type": "string",
"defaultValue": "S1",
"metadata": {
"description": "The SKU to use for the IoT Hub."
}
},
"skuUnits": {
"type": "int",
"defaultValue": 1,
"metadata": {
"description": "The number of IoT Hub units."
}
},
"d2cPartitions": {
"type": "int",
"defaultValue": 4,
"metadata": {
"description": "Partitions used for the event stream."
}
}
},
"variables": {
"iotHubName": "[format('{0}Hub{1}', parameters('projectName'), uniqueString(resourceGroup().id))]",
"storageAccountName": "[format('{0}{1}', toLower(parameters('projectName')), uniqueString(resourceGroup().id))]",
"storageEndpoint": "[format('{0}StorageEndpont', parameters('projectName'))]",
"storageContainerName": "[format('{0}results', toLower(parameters('projectName')))]"
},
"resources": [
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage",
"properties": {
"allowBlobPublicAccess": false,
"minimumTlsVersion": "TLS1_2",
"supportsHttpsTrafficOnly": true
}
},
{
"type": "Microsoft.Storage/storageAccounts/blobServices/containers",
"apiVersion": "2023-01-01",
"name": "[format('{0}/default/{1}', variables('storageAccountName'), variables('storageContainerName'))]",
"properties": {
"publicAccess": "None"
},
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.Devices/IotHubs",
"apiVersion": "2023-06-30",
"name": "[variables('iotHubName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[parameters('skuName')]",
"capacity": "[parameters('skuUnits')]"
},
"properties": {
"eventHubEndpoints": {
"events": {
"retentionTimeInDays": 1,
"partitionCount": "[parameters('d2cPartitions')]"
}
},
"routing": {
"endpoints": {
"storageContainers": [
{
"connectionString": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};AccountKey={2}', variables('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-01').keys[0].value)]",
"containerName": "[variables('storageContainerName')]",
"fileNameFormat": "{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}",
"batchFrequencyInSeconds": 100,
"maxChunkSizeInBytes": 104857600,
"encoding": "JSON",
"name": "[variables('storageEndpoint')]"
}
]
},
"routes": [
{
"name": "ContosoStorageRoute",
"source": "DeviceMessages",
"condition": "level=\"storage\"",
"endpointNames": [
"[variables('storageEndpoint')]"
],
"isEnabled": true
}
],
"fallbackRoute": {
"name": "$fallback",
"source": "DeviceMessages",
"condition": "true",
"endpointNames": [
"events"
],
"isEnabled": true
}
},
"messagingEndpoints": {
"fileNotifications": {
"lockDurationAsIso8601": "PT1M",
"ttlAsIso8601": "PT1H",
"maxDeliveryCount": 10
}
},
"enableFileUploadNotifications": false,
"cloudToDevice": {
"maxDeliveryCount": 10,
"defaultTtlAsIso8601": "PT1H",
"feedback": {
"lockDurationAsIso8601": "PT1M",
"ttlAsIso8601": "PT1H",
"maxDeliveryCount": 10
}
}
},
"dependsOn": [
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
}
],
"outputs": {
"name": {
"type": "string",
"value": "[variables('iotHubName')]"
},
"resourceId": {
"type": "string",
"value": "[resourceId('Microsoft.Devices/IotHubs', variables('iotHubName'))]"
},
"resourceGroupName": {
"type": "string",
"value": "[resourceGroup().name]"
},
"location": {
"type": "string",
"value": "[parameters('location')]"
}
}
}
Distribuera mallen
Det här avsnittet innehåller stegen för att distribuera ARM-mallen.
Skicka meddelanden från enhet till moln
I det här avsnittet registrerar du en enhet i din nya IoT-hubb och skickar sedan meddelanden från den enheten till IoT Hub. Den väg som mallen som konfigurerats i IoT-hubben skickar bara meddelanden till lagringen om de innehåller meddelandeegenskapen level=storage
. För att testa att det här routningsvillkoret fungerar som förväntat skickar vi några meddelanden med den egenskapen och några utan.
Dricks
Den här snabbstarten använder den simulerade Azure CLI-enheten för enkelhetens skull. Ett kodexempel på hur du skickar meddelanden från enhet till moln med meddelandeegenskaper för routning finns i HubRoutingSample i Azure IoT SDK för .NET.
Hämta namnet på den IoT-hubb som mallen skapade åt dig.
Om du använde standardkommandona i föregående avsnitt skapades dina resurser i resursgruppen ContosoResourceGrp . Om du använde en annan resursgrupp uppdaterar du följande kommando så att det matchar.
az iot hub list --resource-group ContosoResourceGrp --output table
Kopiera namnet på din IoT-hubb från utdata. Den ska formateras som
contosoHub{randomidentifier}
Lägg till en enhet i hubben.
az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName}
Simulera enheten och skicka meddelanden från enhet till moln.
Med
--data
parametern kan vi ange meddelandetexten.az iot device simulate \ --device-id contosoDevice \ --hub-name {YourIoTHubName} \ --data "This message won't be routed."
Simulatorn skickar 100 meddelanden och kopplar sedan från. Du behöver inte vänta på alla 100 i den här snabbstarten.
Dricks
Azure CLI skriver inte ut meddelandena när de skickas. Om du vill se meddelandena när du kommer till din hubb kan du installera Azure IoT Hub-tillägget för Visual Studio Code och använda det för att övervaka den inbyggda slutpunkten.
Skicka meddelanden från enhet till moln som ska dirigeras till lagring.
Med
--properties
parametern kan vi lägga till egenskaper för meddelande, program eller system i standardmeddelandet. För den här snabbstarten letar vägen i din IoT-hubb efter meddelanden som innehåller meddelandeegenskapenlevel=storage
.az iot device simulate \ --device-id contosoDevice \ --hub-name {YourIoTHubName} \ --properties level=storage \ --data "This message will be routed to storage."
Granska distribuerade resurser
Logga in på Azure Portal och välj resursgruppen och välj sedan lagringskontot.
Öka detaljnivån i lagringskontot tills du hittar filer.
Välj en av filerna och välj Ladda ned och ladda ned filen till en plats som du kan hitta senare. Den har ett namn som är numeriskt, till exempel 47. Lägg till .txt i slutet och dubbelklicka sedan på filen för att öppna den.
När du öppnar filen är varje rad för ett annat meddelande. brödtexten i varje meddelande krypteras också. Det måste vara för att du ska kunna utföra frågor mot meddelandets brödtext.
Kommentar
Dessa meddelanden kodas i UTF-32 och base64. Om du läser tillbaka meddelandet måste du avkoda det från base64 och utf-32 för att kunna läsa det som ASCII. Om du är intresserad kan du använda metoden ReadOneRowFromFile i routningsguiden för att läsa en för från en av dessa meddelandefiler och avkoda den till ASCII. ReadOneRowFromFile finns på IoT C# SDK-lagringsplatsen som du har packat upp för den här snabbstarten. Här är sökvägen överst i mappen: ./iothub/device/samples/getting started/RoutingTutorial/SimulatedDevice/Program.cs. Ange det booleska
readTheFile
värdet till true och hårdkoda sökvägen till filen på disken, så öppnas och översätts den första raden i filen.
I den här snabbstarten distribuerade du en ARM-mall för att skapa en IoT-hubb och ett lagringskonto och kör sedan ett program för att skicka meddelanden till hubben. Meddelandena dirigeras baserat på deras meddelandeegenskaper och lagras i lagringskontot där de kan visas.
Rensa resurser
Om du vill ta bort de resurser som lades till under den här snabbstarten loggar du in på Azure Portal. Välj Resursgrupper och leta sedan reda på den resursgrupp som du använde för den här snabbstarten. Välj resursgruppen och välj sedan Ta bort. När gruppen tas bort är alla resurser i gruppen också det.