你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

将 IoT 数据导出到 Blob 存储

本文介绍了如何配置数据导出以将数据发送到 Blob 存储服务。

使用此功能,可以从 IoT Central 应用程序连续导出已筛选和扩充的 IoT 数据。 数据导出功能将更改准实时地推送到云解决方案的其他部分,以提供暖路径见解、分析和存储。

例如,你能够:

  • 近实时连续导出 JSON 格式的遥测、属性更改、设备连接、设备生命周期、设备模板生命周期和审核日志数据。
  • 筛选数据流,以导出与自定义条件匹配的数据。
  • 使用设备中的自定义值和属性值来扩充数据流。
  • 转换数据流以修改其形状和内容。

提示

如果启用数据导出功能,则只能获取自启用此功能以后的数据。 若要保留更多的历史数据,请尽早启用数据导出功能。 要在数据导出关闭时手动导出数据,请参阅如何使用 IoT Central REST API 查询设备

注意

在某些情况下,最多可能需要 60 秒才能导出消息。 这个时间是从 IoT Central 从基础 IoT 中心接收消息开始,到消息被传递到目标终结点的时间。

先决条件

若要使用数据导出功能,必须拥有数据导出权限。

若要了解如何使用 IoT Central REST API 管理数据导出,请参阅如何使用 IoT Central REST API 管理数据导出

设置 Blob 存储导出目标

IoT Central 每分钟导出一次数据,每个文件包含自上次导出以来的一批更改。 导出的数据以 JSON 格式保存。 导出的数据在存储帐户中的默认路径为:

  • 遥测:{container}/{app-id}/{partition_id}/{YYYY}/{MM}/{dd}/{hh}/{mm}/{filename}
  • 属性更改:{container}/{app-id}/{partition_id}/{YYYY}/{MM}/{dd}/{hh}/{mm}/{filename}

若要在 Azure 门户中浏览导出的文件,请转到文件,然后选择“编辑 blob”

连接选项

BLOB 存储目标允许你使用连接字符串或托管标识来配置连接。

提示

如果 Blob 存储目标受防火墙保护,则必须使用托管标识连接到它。

托管标识更安全,原因如下:

  • 不会将资源的凭据存储在 IoT Central 应用程序中的连接字符串中。
  • 凭据会自动与 IoT Central 应用程序的生存期相关联。
  • 托管标识会定期自动轮换其安全密钥。

IoT Central 目前仅支持系统分配的托管标识

配置托管标识时,配置包括范围和角色

  • 范围定义可以使用托管标识的地方。 例如,可以使用 Azure 资源组作为范围。 在这种情况下,IoT Central 应用程序和目标必须位于同一资源组中。
  • 该角色定义了 IoT Central 应用程序在目标服务中被授予的权限。 例如,若要使 IoT Central 应用程序将数据发送到事件中心,托管标识需要 Azure 事件中心数据发送方角色分配

以下视频提供有关系统分配的托管标识的详细信息:

注意

若要导出到 blob 存储,请不要使用视频中显示的“存储帐户参与者”。 请改用“存储 Blob 数据参与者”角色。

创建 Azure Blob 存储目标

本文介绍如何使用 Azure CLI 创建托管标识。 还可使用 Azure 门户创建托管标识。

如果没有要将数据导出到其中的现有 Azure 存储帐户,请在 Azure Cloud Shell bash 环境中运行以下脚本。 该脚本创建资源组、Azure 存储帐户和 Blob 容器。 然后,该脚本为你的 IoT Central 应用程序启用托管标识,并分配它访问存储帐户时所需的角色:

# Replace the storage account name with your own unique value.
SA=yourstorageaccount$RANDOM

# Replace the IoT Central app name with the name of your
# IoT Central application.
CA=your-iot-central-app

CN=exportdata
RG=centralexportresources
LOCATION=eastus

az group create -n $RG --location $LOCATION
SAID=$(az storage account create --name $SA --resource-group $RG --location $LOCATION --sku Standard_LRS --query "id" --output tsv)
az storage container create --account-name $SA --resource-group $RG --name $CN

# This assumes your IoT Central application is in the 
# default `IOTC` resource group.
az iot central app identity assign --name $CA --resource-group IOTC --system-assigned
PI=$(az iot central app identity show --name $CA --resource-group IOTC --query "principalId" --output tsv)

az role assignment create --assignee $PI --role "Storage Blob Data Contributor" --scope $SAID

az role assignment list --assignee $PI --all -o table

echo "Endpoint URI: https://$SA.blob.core.windows.net/"
echo "Container: $CN"

可以详细了解如何创建新的 Azure Blob 存储帐户Azure Data Lake Storage v2 存储帐户。 数据导出功能只能将数据写入到支持块 blob 的存储帐户中。 下表列出了已知的兼容存储帐户类型:

性能层 帐户类型
标准 常规用途 V2
标准 常规用途 V1
标准 Blob 存储
高级 块 blob 存储

若要进一步保护 blob 容器,但仅允许使用托管标识从受信任的服务访问,请参阅将数据导出到 Azure 虚拟网络上的安全目标

若要在 IoT Central 中创建 Blob 存储目标,请在“数据导出”页上执行以下操作:

  1. 选择“+ 新建目标”。

  2. 选择“Azure Blob 存储”作为目标类型。

  3. 选择“系统分配的托管标识”作为授权类型。

  4. 输入存储帐户的终结点 URI 和区分大小写的容器名称。 终结点 URI 如下所示:https://contosowaste.blob.core.windows.net

  5. 选择“保存”。

如果看不见到达目标服务的数据,请参阅排查从 Azure IoT Central 应用程序导出数据的问题

设置数据导出

至此,你已经有了可以将数据导出到的目标;接下来,将在 IoT Central 应用程序中设置数据导出:

  1. 登录到 IoT Central 应用程序。

  2. 在左侧窗格中,选择“数据导出”。

    提示

    如果在左侧窗格中没有看到“数据导出”,则表明你没有在应用中配置数据导出所需的权限。 请与管理员联系以设置数据导出。

  3. 选择“+ 新建导出”。

  4. 为新的导出输入显示名称,并确保数据导出功能处于“已启用”状态。

  5. 选择要导出的数据的类型。 下表列出了支持的数据导出类型:

    数据类型 说明 数据格式
    遥测 准实时地从设备中导出遥测消息。 每个导出的消息都包含原始设备消息的完整内容(经过规范化处理)。 遥测消息格式
    属性更改 准实时地导出设备和云属性的更改。 对于只读设备属性,将导出对报告值的更改。 对于读写属性,报告值和所需值都会被导出。 属性更改消息格式
    设备连接 导出设备已连接和断开连接事件。 设备连接消息格式
    设备生命周期 导出设备已注册、已删除、已预配、已启用、已禁用、displayNameChanged 和 deviceTemplateChanged 事件。 设备生命周期更改消息格式
    设备模板生命周期 导出发布的设备模板更改,包括已创建、已更新和已删除事件。 设备模板生命周期更改消息格式
    审核日志 用户对应用程序中实体发起的更新的日志。 若要了解详细信息,请参阅使用审核日志跟踪 IoT Central 应用程序中的活动 审核日志消息格式
  6. (可选)添加筛选器来减少导出的数据量。 对于每种数据导出类型,都有不同类型的筛选器可用:

    数据类型 可用的过滤器
    遥测
    • 按设备名称、设备 ID、设备模板以及设备是否模拟进行筛选
    • 筛选流以仅包含符合筛选条件的遥测数据
    • 筛选流以仅包含设备中其属性与筛选条件匹配的遥测数据
    • 筛选流以仅包含消息属性符合筛选条件的遥测数据。 消息属性(也称为应用程序属性)是在每个遥测消息上的一个键值对包中发送的。 若要创建消息属性筛选器,请输入要查找的消息属性键,并指定条件。 只导出属性与指定筛选条件匹配的遥测消息。 从 IoT 中心文档中详细了解应用程序属性
    属性更改
    • 按设备名称、设备 ID、设备模板以及设备是否模拟进行筛选
    • 筛选流以仅包含符合筛选条件的属性更改
    设备连接
    • 按设备名称、设备 ID、设备模板、组织以及设备是否模拟进行筛选
    • 筛选流以仅包含设备中其属性与筛选条件匹配的更改
    设备生命周期
    • 按设备名称、设备 ID、设备模板以及设备是否预配、启用或模拟进行筛选
    • 筛选流以仅包含设备中其属性与筛选条件匹配的更改
    设备模板生命周期
    • 按设备模板进行筛选
    审核日志 不适用
  7. (可选)使用额外的键值对元数据来扩充导出的消息。 以下扩充可用于遥测、属性更改、设备连接和设备生命周期数据导出类型:

    • 自定义字符串:向每条消息添加一个自定义静态字符串。 输入任意键,并输入任意字符串值。
    • 属性,将添加到每条消息中:
      • 设备元数据,例如设备名称、设备模板名称、是否启用、组织、预配和模拟。
      • 将当前设备报告的属性或云属性值添加到每条消息中。 如果导出的消息来自没有指定属性的设备,则导出的消息不会得到扩充。

配置导出目标:

  1. 选择“+ 目标”以添加已创建的目标,或选择“新建目标”。

  2. 若要在导出数据之前转换数据,请选择“+ 转换” 若要了解详细信息,请参阅在 IoT Central 应用程序中转换要导出的数据

  3. 选择“+ 目标”可向一个导出中最多添加五个目标。

  4. 设置完导出后,选择“保存”。 几分钟后,数据就会出现在目标中。

监视导出

在 IoT Central 中,可以使用“数据导出”页检查导出的状态。 还可以使用 Azure Monitor 来查看要导出的数据量以及任何导出错误。 可以使用 REST API、PowerShell 中的查询或 Azure CLI 在 Azure 门户的图表中访问导出和设备运行状况指标。 目前,可以在 Azure Monitor 中监视以下数据导出指标:

  • 在应用筛选器之前传入导出的消息数。
  • 通过筛选器的消息数。
  • 已成功导出到目标的消息数。
  • 每秒的错误数。

若要了解详细信息,请参阅监视应用程序运行状况

数据格式

以下各节介绍导出数据的格式:

遥测格式

每个导出的消息都包含设备在消息正文中发送的规范化形式的完整消息。 消息以 JSON 格式编码为 UTF-8。 每个消息中的信息包括:

  • applicationId:IoT Central 应用程序的 ID。
  • messageSource:消息源 - telemetry
  • deviceId:发送遥测消息的设备的 ID。
  • schema:有效负载架构的名称和版本。
  • templateId:分配给设备的设备模板 ID。
  • enqueuedTime:IoT Central 接收此消息的时间。
  • enrichments:在导出中设置的任何扩充。
  • module:发送此消息的 IoT Edge 模块。 仅当消息来自 IoT Edge 模块时才会显示此字段。
  • component:发送此消息的组件。 仅当在消息中发送的功能在设备模板中建模为组件时,才会显示此字段
  • messageProperties:其他由设备随消息一起发送的附加属性。 这些属性有时亦称为“应用程序属性”。 从 IoT 中心文档中了解详细信息

对于 Blob 存储,消息将会分批并每分钟导出一次。

下面的示例展示了导出的遥测消息:


{
    "applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
    "messageSource": "telemetry",
    "deviceId": "1vzb5ghlsg1",
    "schema": "default@v1",
    "templateId": "urn:qugj6vbw5:___qbj_27r",
    "enqueuedTime": "2020-08-05T22:26:55.455Z",
    "telemetry": {
        "Activity": "running",
        "BloodPressure": {
            "Diastolic": 7,
            "Systolic": 71
        },
        "BodyTemperature": 98.73447010562934,
        "HeartRate": 88,
        "HeartRateVariability": 17,
        "RespiratoryRate": 13
    },
    "enrichments": {
      "userSpecifiedKey": "sampleValue"
    },
    "module": "VitalsModule",
    "component": "DeviceComponent",
    "messageProperties": {
      "messageProp": "value"
    }
}

消息属性

遥测消息有用于元数据的属性以及遥测有效负载。 上面的代码片段展示了 deviceIdenqueuedTime 等系统消息的示例。 若要详细了解系统消息属性,请参阅设备到云 IoT 中心消息的系统属性

如果需要向遥测消息中添加自定义元数据,则可以向遥测消息添加属性。 例如,需要在设备创建消息时添加时间戳。

下面的代码片段展示了如何在设备上创建消息时将 iothub-creation-time-utc 属性添加到消息中:

重要

此时间戳的格式必须为 UTC(不含时区信息)。 例如,2021-04-21T11:30:16Z 有效,2021-04-21T11:30:16-07:00 无效。

async function sendTelemetry(deviceClient, index) {
  console.log('Sending telemetry message %d...', index);
  const msg = new Message(
    JSON.stringify(
      deviceTemperatureSensor.updateSensor().getCurrentTemperatureObject()
    )
  );
  msg.properties.add("iothub-creation-time-utc", new Date().toISOString());
  msg.contentType = 'application/json';
  msg.contentEncoding = 'utf-8';
  await deviceClient.sendEvent(msg);
}

属性更改格式

每个消息或记录都表示对设备或云属性的更改。 导出的消息中的信息包括:

  • applicationId:IoT Central 应用程序的 ID。
  • messageSource:消息源 - properties
  • messageTypecloudPropertyChangedevicePropertyDesiredChangedevicePropertyReportedChange
  • deviceId:发送遥测消息的设备的 ID。
  • schema:有效负载架构的名称和版本。
  • enqueuedTime:IoT Central 检测到此更改的时间。
  • templateId:分配给设备的设备模板 ID。
  • properties:已更改的属性的数组,包括已更改的属性和值的名称。 如果属性在组件或 IoT Edge 模块内建模,则包含组件和模块信息。
  • enrichments:在导出中设置的任何扩充。

对于 Blob 存储,消息将会分批并每分钟导出一次。

下面的代码片段展示了导出到 Blob 存储的属性更改消息:

{
    "applicationId": "11112222-bbbb-3333-cccc-4444dddd5555",
    "messageSource": "properties",
    "deviceId": "Pepjmh1Hcc",
    "enqueuedTime": "2023-03-02T10:35:39.281Z",
    "enrichments": {},
    "messageType": "devicePropertyReportedChange",
    "schema": "default@v1",
    "templateId": "dtmi:azureiot:ddzig4ascxz",
    "properties": [
        {
            "component": "device_info",
            "name": "swVersion",
            "value": "12"
        },
        {
            "component": "device_info",
            "name": "osName",
            "value": "Android"
        },
        {
            "component": "device_info",
            "name": "processorArchitecture",
            "value": "arm64-v8a"
        },
        {
            "component": "device_info",
            "name": "processorManufacturer",
            "value": "unknown"
        }
    ]
}

设备连接更改格式

每条消息或记录表示来自单个设备的连接事件。 导出的消息中的信息包括:

  • applicationId:IoT Central 应用程序的 ID。
  • messageSource:消息源 - deviceConnectivity
  • messageTypeconnecteddisconnected
  • deviceId:已更改的设备的 ID。
  • schema:有效负载架构的名称和版本。
  • templateId:分配给设备的设备模板 ID。
  • enqueuedTime:在 IoT Central 中发生此更改的时间。
  • enrichments:在导出中设置的任何扩充。

对于 Blob 存储,消息将会分批并每分钟导出一次。

以下示例演示了在 Azure Blob 存储中收到的已导出设备连接消息。

{
  "applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "messageSource": "deviceConnectivity",
  "messageType": "connected",
  "deviceId": "1vzb5ghlsg1",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-04-05T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

设备生命周期更改格式

每条消息或记录表示对单个设备的一项更改。 导出的消息中的信息包括:

  • applicationId:IoT Central 应用程序的 ID。
  • messageSource:消息源 - deviceLifecycle
  • messageType:发生的更改类型。 registereddeletedprovisionedenableddisableddisplayNameChangeddeviceTemplateChanged 之一。
  • deviceId:已更改的设备的 ID。
  • schema:有效负载架构的名称和版本。
  • templateId:分配给设备的设备模板 ID。
  • enqueuedTime:在 IoT Central 中发生此更改的时间。
  • enrichments:在导出中设置的任何扩充。

对于 Blob 存储,消息将会分批并每分钟导出一次。

以下示例演示了在 Azure Blob 存储中收到的已导出设备生命周期消息。

{
  "applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "messageSource": "deviceLifecycle",
  "messageType": "registered",
  "deviceId": "1vzb5ghlsg1",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-01-01T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

设备模板生命周期更改格式

每条消息或记录表示对单个已发布设备模板的一项更改。 导出的消息中的信息包括:

  • applicationId:IoT Central 应用程序的 ID。
  • messageSource:消息源 - deviceTemplateLifecycle
  • messageTypecreatedupdateddeleted
  • schema:有效负载架构的名称和版本。
  • templateId:分配给设备的设备模板 ID。
  • enqueuedTime:在 IoT Central 中发生此更改的时间。
  • enrichments:在导出中设置的任何扩充。

对于 Blob 存储,消息将会分批并每分钟导出一次。

以下示例演示了在 Azure Blob 存储中收到的已导出设备生命周期消息。

{
  "applicationId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "messageSource": "deviceTemplateLifecycle",
  "messageType": "created",
  "schema": "default@v1",
  "templateId": "urn:qugj6vbw5:___qbj_27r",
  "enqueuedTime": "2021-01-01T22:26:55.455Z",
  "enrichments": {
    "userSpecifiedKey": "sampleValue"
  }
}

审核日志格式

每条审核日志消息都表示用户对 IoT Central 应用程序中的可审核实体发起的更改。 导出的消息中的信息包括:

  • actor:有关修改实体的用户的信息。
  • applicationId:IoT Central 应用程序的 ID。
  • messageSource:消息源 - audit
  • messageType:发生的更改类型。 以下其中之一:updatedcreateddeleted
  • updated:仅当 messageTypeupdated 时存在。 提供有关更新的更多详细信息。
  • resource:修改后的实体的详细信息。
  • schema:有效负载架构的名称和版本。
  • deviceId:已更改的设备的 ID。
  • enqueuedTime:在 IoT Central 中发生此更改的时间。
  • enrichments:在导出中设置的任何扩充。

下面的示例展示了在 Azure Blob 存储中接收到的已导出审核日志消息:

{
  "actor": {
    "id": "test-audit",
    "type": "apiToken"
    },
  "applicationId": "22223333-cccc-4444-dddd-5555eeee6666",
  "enqueuedTime": "2022-07-25T21:54:40.000Z",
  "enrichments": {},
  "messageSource": "audit",
  "messageType": "created",
  "resource": {
    "displayName": "Sensor 1",
    "id": "sensor",
    "type": "device"    
  },
  "schema": "default@v1"
}

后续步骤

你已了解如何导出到 Blob 存储,接下来建议你了解如何导出到服务总线