Azure IoT 中心、EventHub 和函数
Azure IoT Hub, EventHub and Functions
我有一个带有 route 的 IoTHub,它指向一个触发函数的 EventHub。
我在从事件对象获取 DeviceId 和其他 IoT 中心属性时遇到问题,而没有将它们显式添加到负载中。
如果我将输入类型设置为 string
(或自定义类型):
public static void Run(string iotMessage, TraceWriter log) {
log.Info($"C# Event Hub trigger function processed a message: {iotMessage}");
}
我只得到没有任何其他 IoT 中心属性的负载,例如 DeviceId、CorrelationId 或 MessageId.
我尝试将类型设置为 EventData
:
public static void Run(EventData iotMessage, TraceWriter log) {
log.Info($"C# Event Hub trigger function processed a message: {JsonConvert.SerializeObject(iotMessage)}");
}
现在我可以通过两个 getter 访问 IoT 中心属性:Properties 和 SystemProperties。例如,我可以像这样访问 DeviceId iotMessage.SystemProperties["iothub-connection-device-id"]
。但它不会暴露有效载荷。
那么如何访问 IoT 中心属性和负载?
如果除了负载之外还需要访问详细的事件属性,那么这是推荐的方法。 string
等的 simple/default 绑定在您不需要访问这些事件属性的情况下很有用。我们的运行时在幕后为您调用 EventData.GetBytes()
并将数据转换为您指定的输入类型。
我确实认为我们可以进行改进以促进这些场景。我已经在我们的 repo 中记录了一个错误 here 来跟踪这个。
我在 EventData 的文档中遗漏了一个东西。它有一个名为 GetBytes() 的方法和 returns 作为字节数组的正文。同时获取 IoT 中心属性和正文的示例:
public static async void Run(EventData telemetryMessage, TraceWriter log)
{
var deviceId = GetDeviceId(telemetryMessage);
var payload = GetPayload(telemetryMessage.GetBytes());
log.Info($"C# Event Hub trigger function processed a message. deviceId: { deviceId }, payload: { JsonConvert.SerializeObject(payload) }");
}
private static Payload GetPayload(byte[] body)
{
var json = System.Text.Encoding.UTF8.GetString(body);
return JsonConvert.DeserializeObject<Payload>(json);
}
private static string GetDeviceId(EventData message)
{
return message.SystemProperties["iothub-connection-device-id"].ToString();
}
有些upcoming updates会简单的按照这个:
Added first class binding data support for many of the important
ServiceBus and EventHub message/event properties. For EventHub:
- PartitionContext
- PartitionKey
- Offset
- SequenceNumber
- EnqueuedTimeUtc
- Properties
- SystemProperties
For ServiceBus:
- DeliveryCount
- DeadLetterSource
- ExpiresAtUtc
- EnqueuedTimeUtc
- MessageId
- ContentType
- ReplyTo
- SequenceNumber
- To
- Label
- CorrelationId
- Properties
所以您应该能够绑定到这些属性以及负载。
我有一个带有 route 的 IoTHub,它指向一个触发函数的 EventHub。
我在从事件对象获取 DeviceId 和其他 IoT 中心属性时遇到问题,而没有将它们显式添加到负载中。
如果我将输入类型设置为 string
(或自定义类型):
public static void Run(string iotMessage, TraceWriter log) {
log.Info($"C# Event Hub trigger function processed a message: {iotMessage}");
}
我只得到没有任何其他 IoT 中心属性的负载,例如 DeviceId、CorrelationId 或 MessageId.
我尝试将类型设置为 EventData
:
public static void Run(EventData iotMessage, TraceWriter log) {
log.Info($"C# Event Hub trigger function processed a message: {JsonConvert.SerializeObject(iotMessage)}");
}
现在我可以通过两个 getter 访问 IoT 中心属性:Properties 和 SystemProperties。例如,我可以像这样访问 DeviceId iotMessage.SystemProperties["iothub-connection-device-id"]
。但它不会暴露有效载荷。
那么如何访问 IoT 中心属性和负载?
如果除了负载之外还需要访问详细的事件属性,那么这是推荐的方法。 string
等的 simple/default 绑定在您不需要访问这些事件属性的情况下很有用。我们的运行时在幕后为您调用 EventData.GetBytes()
并将数据转换为您指定的输入类型。
我确实认为我们可以进行改进以促进这些场景。我已经在我们的 repo 中记录了一个错误 here 来跟踪这个。
我在 EventData 的文档中遗漏了一个东西。它有一个名为 GetBytes() 的方法和 returns 作为字节数组的正文。同时获取 IoT 中心属性和正文的示例:
public static async void Run(EventData telemetryMessage, TraceWriter log)
{
var deviceId = GetDeviceId(telemetryMessage);
var payload = GetPayload(telemetryMessage.GetBytes());
log.Info($"C# Event Hub trigger function processed a message. deviceId: { deviceId }, payload: { JsonConvert.SerializeObject(payload) }");
}
private static Payload GetPayload(byte[] body)
{
var json = System.Text.Encoding.UTF8.GetString(body);
return JsonConvert.DeserializeObject<Payload>(json);
}
private static string GetDeviceId(EventData message)
{
return message.SystemProperties["iothub-connection-device-id"].ToString();
}
有些upcoming updates会简单的按照这个:
Added first class binding data support for many of the important ServiceBus and EventHub message/event properties. For EventHub:
- PartitionContext
- PartitionKey
- Offset
- SequenceNumber
- EnqueuedTimeUtc
- Properties
- SystemProperties
For ServiceBus:
- DeliveryCount
- DeadLetterSource
- ExpiresAtUtc
- EnqueuedTimeUtc
- MessageId
- ContentType
- ReplyTo
- SequenceNumber
- To
- Label
- CorrelationId
- Properties
所以您应该能够绑定到这些属性以及负载。