如何使用 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 时,我只能在 属性 映射中设置这些属性。

我似乎无法在系统属性映射中找到以下键的条目:

不过,我可以在普通 属性 地图中找到它们。当我使用专门的 setter 在 C# SDK 中设置它们时,它们应该出现在系统属性映射中。

为什么会发生这种情况,我怎样才能让它在这两种情况下都起作用? C# 消息 class 设置器与 EventHub 系统属性和属性之间的实际映射是什么?

编辑:

也许我应该更具体一些。我正在使用 AMQP 协议并根据标准第 74-78 页(抱歉,由于缺少声誉,我不能 post a link)消息包含 "properties",即我可以使用 SetCorrelationId 和 "application properties" 设置,这是我可以使用 Map_AddOrUpdate 方法设置的属性。

我希望得到以下结果:

当使用 EventHub 接收消息时,我希望在系统属性映射中包含字段 "to" 和 "user-id",因为这些是标准中提到的名称。通过调试,我能够在系统属性映射中看到条目,这些条目在语义上符合我的预期,但名称不同。

因为这意味着属性可能已发送,所以必须有某种映射对应于:

  1. AMQP 标准 属性 名称 <-> Eventhub 系统 属性 名称
  2. 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 的回答。