我正在使用提供的功能通过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中找到该消息以及其他一些混乱的东西(请参见下图,其中包含默认的字符串消息)
答案 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中心支持的每种协议中的体现方式:
答案 2 :(得分:-1)
另请参阅 IoT-Hub 的待处理功能请求: feature request