Azure IoT Hub,EventHub和Functions

Kim*_*men 7 azure azure-eventhub azure-iot-hub azure-functions

我有一个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}");
}
Run Code Online (Sandbox Code Playgroud)

我只获得有效负载而没有任何其他IoT Hub属性,如DeviceId,CorrelationIdMessageId.

我尝试将类型设置为EventData:

public static void Run(EventData iotMessage, TraceWriter log) {
    log.Info($"C# Event Hub trigger function processed a message: {JsonConvert.SerializeObject(iotMessage)}");
}
Run Code Online (Sandbox Code Playgroud)

现在我可以通过两个getter访问IoT Hub属性:Properties和SystemProperties.例如,我可以像这样访问DeviceId iotMessage.SystemProperties["iothub-connection-device-id"].但它不会暴露有效载荷.

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

Kim*_*men 2

我错过了 EventData 文档中的一件事。它有一个名为 GetBytes() 的方法,并将主体作为字节数组返回。获取 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();
}
Run Code Online (Sandbox Code Playgroud)