如何在流分析中读取 IoT 中心消息“应用程序属性”?

Posted

技术标签:

【中文标题】如何在流分析中读取 IoT 中心消息“应用程序属性”?【英文标题】:How to read IoT Hub message 'application properties' in Stream Analytics? 【发布时间】:2019-08-08 12:10:59 【问题描述】:

我已根据 Microsoft documentation 丰富了 IoT 中心消息并将其路由到内置端点,然后通过提供 IoT 中心作为其输入让流分析访问这些消息。

IoT 中心消息扩充将扩充数据添加到消息的应用程序属性而不是正文本身,因此我在尝试从流分析获取扩充数据时遇到了挑战 - 因为流分析的输出是 Blob 和它只包含我发送到 IoT 中心的实际消息。

此处的扩充数据是指某些数据(如位置、身份等),我根据设备孪生属性映射到在 IoT 中心注册的设备。

我已经尝试了GetMetadataPropertyValue 和parsing JSON in Stream Analytics 中提到的步骤,但在直接从流分析获取“应用程序属性”方面没有运气。

有人可以帮我弄清楚如何从流分析访问应用程序属性或至少指向正确的资源吗?

谢谢。

【问题讨论】:

docs.microsoft.com/en-us/stream-analytics-query/… 这应该可以。请显示您尝试过但不适合您的代码 感谢您的回复,但没有成功。我附上一些截图。 Screenshot_EnrichmentData - (i.stack.imgur.com/JIa1I.png) Screenshot_IotHub_EnrichMessages - (i.stack.imgur.com/X4fy5.png) Screenshot_SA_query_results - (i.stack.imgur.com/P3INQ.png) 但是,当我将 IoT 中心消息路由到 Blob 时,我可以在文件中的“属性”部分看到丰富数据。不幸的是,这个方法不能作为消息体在这个文件中被编码。 Screenshot_data_stored_in_blob_after_enrichment - (i.stack.imgur.com/8XPVO.jpg) 【参考方案1】:

在您的查询中尝试以下操作:

GetMetadataPropertyValue(iothub, '[User]') as userprops

您的扩充数据将在 userprops 中。

示例:

设备遥测数据:

"counter":29,"time":"2019-08-08T13:42:26.1517415Z","deviceId":"device1","windSpeed":8.2023,"temperature":16.06,"humidity":79.46

发表主题:

devices/device1/messages/events/$.ct=application%2Fjson&$.ce=utf-8&abcd=1234567

IoT 中心丰富消息:

ASA 工作:

select 
    *,
    GetMetadataPropertyValue(iothub, '[User]') as userprops 
into
    outAF
from 
    iothub

Azure 函数上的输出 (outAF):

[
  
    "counter": 29,
    "time": "2019-08-08T13:42:26.1517415Z",
    "deviceId": "device1",
    "windSpeed": 8.2023,
    "temperature": 16.06,
    "humidity": 79.46,
    "EventProcessedUtcTime": "2019-08-08T13:42:25.7495769Z",
    "PartitionId": 1,
    "EventEnqueuedUtcTime": "2019-08-08T13:42:25.568Z",
    "IoTHub": 
      "MessageId": null,
      "CorrelationId": null,
      "ConnectionDeviceId": "device1",
      "ConnectionDeviceGenerationId": "636842046144267242",
      "EnqueuedTime": "2019-08-08T13:42:25.363Z",
      "StreamId": null
    ,
    "User": 
      "abcd": "1234567",
      "status": "inprocess",
      "version": "42"
    ,
    "userprops": 
      "abcd": "1234567",
      "status": "inprocess",
      "version": "42"
    
  
]

以下屏幕 sn-p 显示来自第二个自定义端点的事件消息,用于丰富消息,例如 EventGrid:


  "id": "b983e8bf-88b5-cac3-9370-2c64037b2f1c",
  "topic": "/SUBSCRIPTIONS/00000000-0000-0000-0000-000000000000/RESOURCEGROUPS/myRG/PROVIDERS/MICROSOFT.DEVICES/IOTHUBS/myIOT",
  "subject": "devices/device1",
  "eventType": "Microsoft.Devices.DeviceTelemetry",
  "eventTime": "2019-08-08T13:42:25.363Z",
  "data": 
    "properties": 
      "abcd": "1234567",
      "status": "inprocess",
      "version": "42"
    ,
    "systemProperties": 
      "iothub-content-type": "application/json",
      "iothub-content-encoding": "utf-8",
      "iothub-connection-device-id": "device1",
      "iothub-connection-auth-method": "\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null",
      "iothub-connection-auth-generation-id": "636842046144267242",
      "iothub-enqueuedtime": "2019-08-08T13:42:25.363Z",
      "iothub-message-source": "Telemetry"
    ,
    "body": 
      "counter": 29,
      "time": "2019-08-08T13:42:26.1517415Z",
      "deviceId": "device1",
      "windSpeed": 8.2023,
      "temperature": 16.06,
      "humidity": 79.46
    
  ,
  "dataVersion": "",
  "metadataVersion": "1"

【讨论】:

不,没有用。我附上一些截图。 Screenshot_EnrichmentData - (i.stack.imgur.com/JIa1I.png) Screenshot_IotHub_EnrichMessages - (i.stack.imgur.com/X4fy5.png) Screenshot_SA_query_results - (i.stack.imgur.com/P3INQ.png) 但是,当我将 IoT 中心消息路由到 Blob 时,我可以在文件中的“属性”部分看到丰富数据。不幸的是,这个方法不能作为消息体在这个文件中被编码。 Screenshot_data_stored_in_blob_after_enrichment - (i.stack.imgur.com/8XPVO.jpg) 我再次尝试,但使用 Blob 作为 SA 作业的输出,它成功了!!所以基本上它在我实际运行 SA 作业并使用输出时起作用。但是当我只是尝试在没有实际“运行” SA 作业的情况下测试查询时,“userprops”返回为空,而数据的所有其他部分似乎都很好。知道为什么会发生这种情况吗?另外,您是如何将 SA 作业输出到 Function App 的?我只看到 Blob 和 SQL 作为 Azure 门户中 SA 作业的输出选项。 docs.microsoft.com/en-us/stream-analytics-query/… 描述:无法使用示例数据在 Azure 门户上测试此功能。,对于 SA 作业输出,请参阅以下docs.microsoft.com/en-us/azure/stream-analytics/…【参考方案2】:

您是否按照此处的说明检查了 GetRecordPropertyValue http://learniotwithzain.com/2019/08/alert-engine-using-azure-stream-analytics-and-sql-azure-as-reference-data/

【讨论】:

是的,我做到了,但这似乎不起作用。此外,我试图不在流分析中使用“参考数据”,因为该输入仅限于 300MB,我怀疑这将来会给我带来问题。

以上是关于如何在流分析中读取 IoT 中心消息“应用程序属性”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在流分析作业 ARM 模板中指定数据库表作为输出

在流分析工作并将它们路由到服务总线之后,事件中心中的事件会发生啥?

如何解析Azure IOT中心逻辑应用程序中的消息

在流分析中获取消息对象属性

如何使用数据工厂将 IoT 中心存储的 blob 复制到 Azure SQL

如何将使用者组定义到 Azure IoT 中心?