为什么无法在存储JSON Blob中正确解码IoT Hub消息?

时间:2019-05-22 12:53:08

标签: azure azure-storage azure-storage-blobs

我正在使用提供的功能通过Azure Sphere开发工具包发送字符串:

AzureIoT_SendMessage("Hello from sample App")

消息被发送到IoT中心,然后路由到具有JSON编码的存储Blob。如果我查看Blob存储,则会得到以下信息:

{"EnqueuedTimeUtc":"2019-05-22T12:33:42.2320000Z","Properties":{},"SystemProperties":{"connectionDeviceId":"fbea*****************6d**********************9c0","connectionAuthMethod":"{\"scope\":\"device\",\"type\":\"x509Certificate\",\"issuer\":\"external\",\"acceptingIpFilterRule\":null}","connectionDeviceGenerationId":"63************22","enqueuedTime":"2019-05-22T12:33:42.2320000Z"},"Body":"SGVsbG8gZnJvbSBzYW1wbGUgQXBw"}

字段“ body”根本不显示发送的字符串(“示例应用程序中的Hello”),但显示“ SGVsbG8gZnJvbSBzYW1wbGUgQXBw”。为什么会这样呢?我该如何解决?

我发现,如果我将存储格式格式化为AVRO(而不是JSON),则字符串将正确显示,但是消息(从字面上看)成为一个blob,并且无法在流式服务(例如powerBI)中使用。但是,可以在Blob中找到该消息以及其他一些混乱的东西(请参见下图,其中包含默认的字符串消息)

enter image description here

3 个答案:

答案 0 :(得分:1)

FWiW,使用PowerBi中的PowerQuery(PQ),我能够解码Azure IoT中心发送给blob的JSON文件的{body:xxxencoded_base64 ...}部分。

我在PowerBI中的步骤: -连接到blob帐户,容器收集JSON文件。 -在PQ中,单击初始二进制列上的双箭头展开 -对我来说,Column10是{body:xxx}列。使用PQ的“替换值”功能,我删除了前缀“ {body:”和最后一个“}”,仅保留了编码字符串。 -使用以下M代码在PQ中创建新列:= Binary.FromText([Column10],BinaryEncoding.Base64) -现在是新的Binary列,单击双箭头并展开二进制。它会显示已解码的JSON表,并完成所有IoT遥测。
HTH

答案 1 :(得分:1)

请参阅Microsoft的IoT中心消息路由文档-特别是Azure Storage部分。它说:“在使用JSON编码时,必须在消息系统属性中将contentType设置为application / json并将contentEncoding设置为UTF-8。这两个值都不区分大小写。如果未设置内容编码,则IoT中心将以base 64编码格式编写邮件。”

This blog post进一步扩展了主题,解释了内容类型和编码需要设置为特定的标头。

设置标题时:

如果使用的是Azure IoT设备SDK,则将消息标题设置为必需的属性非常简单。如果您使用的是第三方协议库,则可以使用此表查看标头在IoT中心支持的每种协议中的体现方式:

Content headers table

答案 2 :(得分:-1)

另请参阅 IoT-Hub 的待处理功能请求: feature request