如何使用 Azure IoT C SDK 为 AMQP 协议设置某些系统属性,以及它们在 EventHub 中的最终位置?
How do I set certain system properties with the Azure IoT C SDK for the AMQP protocol and where do they end up in the EventHub?
编辑:添加更多信息,见结尾
在 C# IoT SDK 中,我可以在 C SDK 中设置 message class. There are no equivalent options at Message Handles 的某些属性。
如何使用 C SDK 设置以下属性:
- 到
- 用户名
此外,如何通过 EventData Class 和带有 EventData Class 的 C SDK 在 C# 中的接收端访问它们?在 C# class 中,消息属性分为系统属性和属性,而在 Cclass 中只有属性。当我使用 C IoT Hub 时,我只能在 属性 映射中设置这些属性。
我似乎无法在系统属性映射中找到以下键的条目:
- "user-id"
- "to"
不过,我可以在普通 属性 地图中找到它们。当我使用专门的 setter 在 C# SDK 中设置它们时,它们应该出现在系统属性映射中。
为什么会发生这种情况,我怎样才能让它在这两种情况下都起作用? C# 消息 class 设置器与 EventHub 系统属性和属性之间的实际映射是什么?
编辑:
也许我应该更具体一些。我正在使用 AMQP 协议并根据标准第 74-78 页(抱歉,由于缺少声誉,我不能 post a link)消息包含 "properties",即我可以使用 SetCorrelationId 和 "application properties" 设置,这是我可以使用 Map_AddOrUpdate 方法设置的属性。
我希望得到以下结果:
当使用 EventHub 接收消息时,我希望在系统属性映射中包含字段 "to" 和 "user-id",因为这些是标准中提到的名称。通过调试,我能够在系统属性映射中看到条目,这些条目在语义上符合我的预期,但名称不同。
因为这意味着属性可能已发送,所以必须有某种映射对应于:
- AMQP 标准 属性 名称 <-> Eventhub 系统 属性 名称
- C SDK "system properties" 名称(是否自动推断)<-> Eventhub 系统属性名称
可以参考C SDK的official sample,设置属性如下:
static char UseridText[15] = "userid prop";
static char propUserid[10] = "user-id";
static char toText[10] = "to prop";
static char propTo[10] = "to";
if (Map_AddOrUpdate(propMap, propTo, toText) != MAP_OK)
{
(void)printf("ERROR: Map_AddOrUpdate Failed!\r\n");
}
if (Map_AddOrUpdate(propMap, propUserid, UseridText) != MAP_OK)
{
(void)printf("ERROR: Map_AddOrUpdate Failed!\r\n");
}
并通过 EventData Class 在 C# 的接收方访问它们,如以下代码片段。有关使用兼容端点读取设备到云消息的完整示例,您可以参考 here.
if (eventData.Properties.ContainsKey("to"))
{
object value;
eventData.Properties.TryGetValue("to", out value);
Console.WriteLine("property key: 'to' value: '{0}'", value.ToString());
}
if (eventData.Properties.ContainsKey("user-id"))
{
object value;
eventData.Properties.TryGetValue("user-id", out value);
Console.WriteLine("property key: 'user-id' value: '{0}'", value.ToString());
}
至于使用 EventData Class 在 C SDK 的接收方访问它们,您可以使用 EventData_Properties()
。这是你可以参考的receive sample
2017.03.07:
在当前时间点,这似乎是 IoT 中心文档、AMQP 规范、C 和 C# SDK 之间的错误/不匹配。参见 github issue。
如需解决方法,请查看@RitaHan-MSFT 的回答。
编辑:添加更多信息,见结尾
在 C# IoT SDK 中,我可以在 C SDK 中设置 message class. There are no equivalent options at Message Handles 的某些属性。
如何使用 C SDK 设置以下属性:
- 到
- 用户名
此外,如何通过 EventData Class 和带有 EventData Class 的 C SDK 在 C# 中的接收端访问它们?在 C# class 中,消息属性分为系统属性和属性,而在 Cclass 中只有属性。当我使用 C IoT Hub 时,我只能在 属性 映射中设置这些属性。
我似乎无法在系统属性映射中找到以下键的条目:
- "user-id"
- "to"
不过,我可以在普通 属性 地图中找到它们。当我使用专门的 setter 在 C# SDK 中设置它们时,它们应该出现在系统属性映射中。
为什么会发生这种情况,我怎样才能让它在这两种情况下都起作用? C# 消息 class 设置器与 EventHub 系统属性和属性之间的实际映射是什么?
编辑:
也许我应该更具体一些。我正在使用 AMQP 协议并根据标准第 74-78 页(抱歉,由于缺少声誉,我不能 post a link)消息包含 "properties",即我可以使用 SetCorrelationId 和 "application properties" 设置,这是我可以使用 Map_AddOrUpdate 方法设置的属性。
我希望得到以下结果:
当使用 EventHub 接收消息时,我希望在系统属性映射中包含字段 "to" 和 "user-id",因为这些是标准中提到的名称。通过调试,我能够在系统属性映射中看到条目,这些条目在语义上符合我的预期,但名称不同。
因为这意味着属性可能已发送,所以必须有某种映射对应于:
- AMQP 标准 属性 名称 <-> Eventhub 系统 属性 名称
- C SDK "system properties" 名称(是否自动推断)<-> Eventhub 系统属性名称
可以参考C SDK的official sample,设置属性如下:
static char UseridText[15] = "userid prop";
static char propUserid[10] = "user-id";
static char toText[10] = "to prop";
static char propTo[10] = "to";
if (Map_AddOrUpdate(propMap, propTo, toText) != MAP_OK)
{
(void)printf("ERROR: Map_AddOrUpdate Failed!\r\n");
}
if (Map_AddOrUpdate(propMap, propUserid, UseridText) != MAP_OK)
{
(void)printf("ERROR: Map_AddOrUpdate Failed!\r\n");
}
并通过 EventData Class 在 C# 的接收方访问它们,如以下代码片段。有关使用兼容端点读取设备到云消息的完整示例,您可以参考 here.
if (eventData.Properties.ContainsKey("to"))
{
object value;
eventData.Properties.TryGetValue("to", out value);
Console.WriteLine("property key: 'to' value: '{0}'", value.ToString());
}
if (eventData.Properties.ContainsKey("user-id"))
{
object value;
eventData.Properties.TryGetValue("user-id", out value);
Console.WriteLine("property key: 'user-id' value: '{0}'", value.ToString());
}
至于使用 EventData Class 在 C SDK 的接收方访问它们,您可以使用 EventData_Properties()
。这是你可以参考的receive sample
2017.03.07:
在当前时间点,这似乎是 IoT 中心文档、AMQP 规范、C 和 C# SDK 之间的错误/不匹配。参见 github issue。
如需解决方法,请查看@RitaHan-MSFT 的回答。