Share via


Inicio rápido: implementar un centro de IoT de Azure y una cuenta de almacenamiento mediante una plantilla de ARM

En esta guía de inicio rápido, usará una plantilla de Azure Resource Manager (plantilla de ARM) para crear un centro de IoT, una cuenta de Azure Storage y una ruta para enviar mensajes del centro de IoT 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.

Una plantilla de Azure Resource Manager es un archivo de notación de objetos JavaScript (JSON) que define tanto la infraestructura como la configuración de un proyecto. La plantilla usa sintaxis declarativa. Se describe la implementación deseada sin escribir la secuencia de comandos de programación para crear la implementación.

Si su entorno cumple los requisitos previos y está familiarizado con el uso de plantillas de Resource Manager, seleccione el botón Implementar en Azure. La plantilla se abre en Azure Portal.

Deploy To Azure

Requisitos previos

Revisión de la plantilla

La plantilla usada en esta guía de inicio rápido se llama 101-iothub-auto-route-messages y forma parte de las plantillas de inicio rápido de Azure.

En la plantilla se definen dos recursos de Azure:

{
  "$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')]"
    }
  }
}

Implementación de la plantilla

En esta sección se proporcionan los pasos para implementar la plantilla de ARM.

  • Cree los recursos mediante la implementación de la plantilla de ARM.

    Deploy To Azure

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 la plantilla configuró en el centro de IoT solo envía mensajes al almacenamiento si contienen la propiedad de 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.

  1. 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
    
  2. Copie el nombre del centro de IoT desde la salida. Debe tener el formato de contosoHub{randomidentifier}.

  3. Agregue un dispositivo al centro.

    az iot hub device-identity create --device-id contosoDevice --hub-name {YourIoTHubName} 
    
  4. 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.

  5. 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 mensaje level=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 los recursos implementados

  1. Inicie sesión en Azure Portal y seleccione el grupo de recursos y, después, la cuenta de almacenamiento.

  2. Explore en profundidad la cuenta de almacenamiento hasta que encuentre los archivos.

    Look at the storage account files

  3. 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.

  4. Al abrir el archivo, cada fila corresponde a un mensaje diferente; también se cifra el cuerpo de cada mensaje. Debe estar en orden para que pueda realizar consultas sobre el cuerpo del mensaje.

    View the sent messages

    Nota:

    Estos mensajes se codifican en UTF-32 y Base 64. Si va a leer el mensaje, tendrá que descodificarlo de Base 64 y UTF-32 para poder 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 desde la parte superior de esa carpeta: ./iothub/device/samples/getting started/RoutingTutorial/SimulatedDevice/Program.cs. Establezca el valor booleano readTheFile en true y codifique de forma rígida la ruta de acceso al archivo en el disco; se abrirá y traducirá la primera fila del archivo.

En este inicio rápido, ha implementado una plantilla de ARM para crear un centro de IoT y una cuenta de almacenamiento y, a continuación, ha ejecutado 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

Para eliminar los recursos agregados durante esta guía de inicio rápido, inicie sesión en Azure Portal. Seleccione Grupos de recursos y, a continuación, busque el grupo de recursos que ha utilizado para esta guía de inicio rápido. Seleccione el grupo de recursos y, a continuación, seleccione Eliminar. Cuando se elimina el grupo, también se eliminan todos los recursos del grupo.

Pasos siguientes