Azure IoT Hub,EventHub和函数

时间:2017-02-02 13:34:28

标签: azure azure-functions azure-eventhub azure-iot-hub

我有一个route的IoTHub指向一个触发函数的EventHub。

我在从事件对象获取 DeviceId 和其他IoT Hub属性时遇到问题,而没有明确地将这些属性添加到有效负载中。

如果我将输入类型设置为string(或自定义类型):

public static void Run(string iotMessage, TraceWriter log) {
    log.Info($"C# Event Hub trigger function processed a message: {iotMessage}");
}

我只获得有效负载而没有任何其他IoT Hub属性,例如 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 Hub属性:Properties和SystemProperties。例如,我可以像iotMessage.SystemProperties["iothub-connection-device-id"]一样访问DeviceId。但它不会暴露有效载荷。

那么如何访问IoT Hub属性和有效负载?

3 个答案:

答案 0 :(得分:1)

如果除了有效负载之外还需要访问详细的事件属性,那么这是建议的方法。 string等的简单/默认绑定在您不需要访问这些事件属性的情况下非常有用。我们的运行时在后台为您调用EventData.GetBytes()并将数据转换为您指定的输入类型。

我认为我们可以进行改进以促进这些方案。我在我们的仓库中记录了一个错误here以跟踪此情况。

答案 1 :(得分:1)

我在EventData的文档中遗漏了一件事。它有一个名为GetBytes()的方法,并将主体作为字节数组返回。同时获取IoT Hub属性和正文的示例:

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();
}

答案 2 :(得分:1)

根据这一点,有一些upcoming updates就是这样:

  

添加了许多重要的第一类绑定数据支持   ServiceBus和EventHub消息/事件属性。对于EventHub:

     
      
  • PartitionContext
  •   
  • PartitionKey
  •   
  • 抵消
  •   
  • SequenceNumber
  •   
  • EnqueuedTimeUtc
  •   
  • 属性
  •   
  • SystemProperties
  •   
     

对于ServiceBus:

     
      
  • DeliveryCount
  •   
  • DeadLetterSource
  •   
  • ExpiresAtUtc
  •   
  • EnqueuedTimeUtc
  •   
  • 的MessageId
  •   
  • ContentType
  •   
  • ReplyTo
  •   
  • SequenceNumber
  •   
  •   
  • 标签
  •   
  • CorrelationId
  •   
  • 属性
  •   

因此,您应该能够绑定到这些属性以及有效负载。