Inicio rápido: Implementación de un centro de IoT de Azure y una cuenta de almacenamiento mediante Bicep
En este inicio rápido, usará Bicep para crear un centro de IoT, una cuenta de Azure Storage y una ruta para enviar mensajes desde loT Hub al almacenamiento. El centro se configura de modo que los mensajes enviados al centro se enruten automáticamente a la cuenta de almacenamiento si cumplen la condición de enrutamiento. Al final de esta guía de inicio rápido, podrá abrir la cuenta de almacenamiento y ver los mensajes enviados.
Bicep es un lenguaje específico de dominio (DSL) que usa una sintaxis declarativa para implementar recursos de Azure. Brinda sintaxis concisa, seguridad de tipos confiable y compatibilidad con la reutilización de código. Bicep ofrece la mejor experiencia de creación para sus soluciones de infraestructura como código en Azure.
Requisitos previos
Si no tiene una suscripción a Azure, cree una cuenta gratuita de Azure antes de empezar.
Revisión del archivo de Bicep
El nombre del archivo de Bicep que se usa en este inicio rápido es 101-iothub-auto-route-messages
, y se encuentra en las plantillas de inicio rápido de Azure.
En el archivo Bicep, se definen dos recursos de Azure:
- Microsoft.Storage/storageAccounts: una cuenta de almacenamiento con un contenedor.
- Microsoft.Devices/IotHubs: un centro de IoT con un punto de conexión que apunta al contenedor de almacenamiento y una ruta para enviar mensajes filtrados a ese punto de conexión.
@description('Define the project name or prefix for all objects.')
@minLength(1)
@maxLength(11)
param projectName string = 'contoso'
@description('The datacenter to use for the deployment.')
param location string = resourceGroup().location
@description('The SKU to use for the IoT Hub.')
param skuName string = 'S1'
@description('The number of IoT Hub units.')
param skuUnits int = 1
@description('Partitions used for the event stream.')
param d2cPartitions int = 4
var iotHubName = '${projectName}Hub${uniqueString(resourceGroup().id)}'
var storageAccountName = '${toLower(projectName)}${uniqueString(resourceGroup().id)}'
var storageEndpoint = '${projectName}StorageEndpont'
var storageContainerName = '${toLower(projectName)}results'
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
name: storageAccountName
location: location
sku: {
name: 'Standard_LRS'
}
kind: 'Storage'
properties: {
allowBlobPublicAccess: false
minimumTlsVersion: 'TLS1_2'
supportsHttpsTrafficOnly: true
}
}
resource container 'Microsoft.Storage/storageAccounts/blobServices/containers@2023-01-01' = {
name: '${storageAccountName}/default/${storageContainerName}'
properties: {
publicAccess: 'None'
}
dependsOn: [
storageAccount
]
}
resource IoTHub 'Microsoft.Devices/IotHubs@2023-06-30' = {
name: iotHubName
location: location
sku: {
name: skuName
capacity: skuUnits
}
properties: {
eventHubEndpoints: {
events: {
retentionTimeInDays: 1
partitionCount: d2cPartitions
}
}
routing: {
endpoints: {
storageContainers: [
{
connectionString: 'DefaultEndpointsProtocol=https;AccountName=${storageAccountName};EndpointSuffix=${environment().suffixes.storage};AccountKey=${storageAccount.listKeys().keys[0].value}'
containerName: storageContainerName
fileNameFormat: '{iothub}/{partition}/{YYYY}/{MM}/{DD}/{HH}/{mm}'
batchFrequencyInSeconds: 100
maxChunkSizeInBytes: 104857600
encoding: 'JSON'
name: storageEndpoint
}
]
}
routes: [
{
name: 'ContosoStorageRoute'
source: 'DeviceMessages'
condition: 'level="storage"'
endpointNames: [
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
}
}
}
}
output name string = IoTHub.name
output resourceId string = IoTHub.id
output resourceGroupName string = resourceGroup().name
output location string = location
Implementación del archivo de Bicep
En esta sección se proporcionan los pasos para implementar el archivo de Bicep.
Descargue el archivo main.bicep del repositorio Plantillas de inicio rápido de Azure.
Cree los recursos mediante la implementación del archivo de Bicep mediante la CLI de Azure.
az group create --name ContosoResourceGrp --location eastus az deployment group create --resource-group exampleRG --template-file main.bicep
La implementación tarda varios minutos en completarse. Cuando finalice la implementación, verá la salida que detalla los recursos implementados.
Envío de mensajes del dispositivo a la nube
En esta sección, registrará un dispositivo en el nuevo centro de IoT y, a continuación, enviará mensajes desde ese dispositivo a IoT Hub. La ruta que el archivo de Bicep configurado en el centro de IoT solo envía mensajes al almacenamiento si contienen la propiedad mensaje level=storage
. Para probar que esta condición de enrutamiento funciona según lo previsto, enviaremos algunos mensajes con esa propiedad y algunos sin ella.
Sugerencia
En este inicio rápido se usa el dispositivo simulado de la CLI de Azure para mayor comodidad. Para obtener un ejemplo de código de envío de mensajes del dispositivo a la nube con propiedades de mensaje para el enrutamiento, consulte HubRoutingSample en el SDK de Azure IoT para .NET.
Recupere el nombre del centro de IoT que la plantilla creó automáticamente.
Si usó los comandos predeterminados en la sección anterior, los recursos se crearon en el grupo de recursos ContosoResourceGrp. Si usó otro grupo de recursos, actualice el siguiente comando para que coincida.
az iot hub list --resource-group ContosoResourceGrp --output table
Copie el nombre del centro de IoT desde la salida. Debe tener el formato de
contosoHub{randomidentifier}
.Agregue un dispositivo al centro.
az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName}
Simulación del dispositivo y envío de mensajes del dispositivo a la nube.
El parámetro
--data
nos permite establecer el cuerpo del mensaje.az iot device simulate \ --device-id contosoDevice \ --hub-name {YourIoTHubName} \ --data "This message won't be routed."
El simulador envía 100 mensajes y luego se desconecta. No es necesario esperar a los 100 mensajes a efectos de este inicio rápido.
Sugerencia
La CLI de Azure no imprimirá los mensajes a medida que los envía. Si desea ver los mensajes a medida que llegan al centro, puede instalar la extensión de Azure IoT Hub para Visual Studio Code y usarla para supervisar el punto de conexión integrado.
Envío de mensajes del dispositivo a la nube para enrutarse al almacenamiento.
El parámetro
--properties
permite agregar propiedades de mensaje, aplicación o sistema al mensaje predeterminado. En este inicio rápido, la ruta del centro de IoT busca mensajes que contengan la propiedad de mensajelevel=storage
.az iot device simulate \ --device-id contosoDevice \ --hub-name {YourIoTHubName} \ --properties level=storage \ --data "This message will be routed to storage."
Revisión de mensajes enrutados
Inicie sesión en el Azure portal y seleccione el grupo de recursos y, a continuación, seleccione la cuenta de almacenamiento.
Explore en profundidad la cuenta de almacenamiento hasta que encuentre los archivos.
Seleccione uno de los archivos, seleccione Descargar y descargue el archivo en una ubicación que pueda encontrar más adelante. Tiene un nombre numérico, como 47. Agregue .txt al final y, después, haga doble clic en el archivo para abrirlo.
Al abrir el archivo, cada fila corresponde a un mensaje distinto. El cuerpo de cada mensaje también está cifrado. Debe estar en orden para que pueda realizar consultas sobre el cuerpo del mensaje.
Nota:
Estos mensajes se codifican en UTF-8 y base64. Si vuelve a leer el mensaje, debe descodificarlo de base64 y utf-8 para leerlo como ASCII. Si le interesa, puede usar el método ReadOneRowFromFile del tutorial de enrutamiento para leer estos archivos de mensajes de uno en uno y descodificarlos en ASCII. ReadOneRowFromFile se encuentra en el repositorio del SDK de C# para IoT que descomprimió para este inicio rápido. Esta es la ruta de acceso de la parte superior de esa carpeta: ./iothub/device/samples/how to guides/HubRoutingSample/Program.cs Establece el booleano
readTheFile
a verdadero, y hardcodea la ruta al archivo en disco, y abrirá y traducirá la primera fila del archivo.
En este inicio rápido, ha implementado un archivo de Bicep para crear un centro de IoT y una cuenta de almacenamiento y, a continuación, ejecutar un programa para enviar mensajes al centro. Los mensajes se enrutan en función de sus propiedades de mensaje y se almacenan en la cuenta de almacenamiento, donde se pueden ver.
Limpieza de recursos
Cuando ya no necesite los recursos que ha creado, elimine el grupo de recursos.
az group delete --name exampleRG