2017-02-02 3 views
6

У меня есть IoTHub с route, который указывает на EventHub, который запускает функции.Azure IoT Hub, 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 концентраторов, как 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)}"); 
} 

Теперь я могу получить доступ к свойствам IoT концентраторов с помощью двух добытчиков: Свойств и SystemProperties. Например, я могу получить доступ к DeviceId, например, iotMessage.SystemProperties["iothub-connection-device-id"]. Но он не раскрывает полезную нагрузку.

Как я могу получить доступ как к свойствам IoT Hub, так и к полезной нагрузке?

+0

Вы должны отправить свой ответ на исходный вопрос (который вы отмечаете как ОБНОВЛЕНИЕ) в качестве реального ответа. Это нормально, отвечая на его собственные вопросы. Таким образом, будет легче быстро получить ответ на проблему. (Спасибо, в любом случае) –

ответ

0

Я пропустил что-то в документации для 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(); 
} 
1

Это рекомендуемый способ сделать это, если вам нужен доступ к подробным свойствам событий в дополнение к полезной нагрузке. Простые/стандартные привязки для string и т. Д. Полезны в тех случаях, когда вам не нужно обращаться к этим свойствам событий. Наше время выполнения вызывает EventData.GetBytes() для вас за кулисами и преобразует данные в указанный вами тип ввода.

Я действительно думаю, что мы могли бы сделать улучшения для облегчения этих сценариев. Я зарегистрировал ошибку here в нашем репо, чтобы отслеживать это.

1

Есть некоторые upcoming updates, что просто это в соответствии с этим:

Добавлен первый класс привязки поддержки данных для многих важных ServiceBus и события/события EventHub.Для EventHub:

  • PartitionContext
  • PartitionKey
  • Смещение
  • SequenceNumber
  • EnqueuedTimeUtc
  • Свойства
  • SystemProperties

Для ServiceBus:

  • DeliveryCount
  • DeadLetterSource
  • ExpiresAtUtc
  • EnqueuedTimeUtc
  • MessageId
  • ТипСодержимого
  • ReplyTo
  • SequenceNumber
  • К
  • Этикетка
  • CorrelationId
  • Свойства

Таким образом, вы должны быть в состоянии связываться с этими свойствами, а также полезную нагрузку.

Смежные вопросы