Как получить свойства данных концентратора IoT, а не только фактическую полезную нагрузку - PullRequest
1 голос
/ 29 апреля 2019

У меня есть iot-hub, который получает как JSON, так и не-JSON (шестнадцатеричные) сообщения. Все это идет в мое приложение Java-функции для декодирования. На основании device-id я звоню в другой декодер.

Я пытаюсь получить фактическое iothub-connection-device-id сообщения, которое я получаю.

public class TranslateEndpoint {
    /**
     * This function will be invoked when an event is received from Event Hub.
     */
    @FunctionName("TranslateEndpoint")
    public void run(
        @EventHubTrigger(name = "message", eventHubName = "NAME-DeviceIntegration", connection = "HostName=HOST;SharedAccessKeyName=NAME;SharedAccessKey=KEY=", consumerGroup = "$Default", cardinality = Cardinality.ONE) EventData message,
        final ExecutionContext context
    ) {
        context.getLogger().info("Java Event Hub trigger function executed.");
        context.getLogger().info("Length:" + message.toString());
        TranslateController temp = new TranslateController();

        // Build up a list with all the data

        context.getLogger().info(message.getSystemProperties().getPublisher());
        context.getLogger().info(message.getSystemProperties().getPartitionKey());
        context.getLogger().info(message.getSystemProperties().get("iothub-connection-device-id").toString());
    }

Код выше вдохновлен неким кодом C #, который я нашел. К сожалению я получаю ошибку Stack: java.lang.RuntimeException: Unable to invoke no-args constructor for interface com.microsoft.azure.eventhubs.EventData. Registering an InstanceCreator with Gson for this type may fix this problem.

До того, как я использовал String и получил только свой фактический груз. Как правильно получить системные свойства моего сообщения?

1 Ответ

0 голосов
/ 12 мая 2019

По крайней мере, в Java свойства метаданных должны извлекаться через дополнительные аннотированные параметры, в данном случае:

//The system properties, including the event data
@BindingName("SystemProperties") Map<String, Object> systemProperties

ИД устройства можно затем извлечь из этого параметра:

String deviceId = (String) systemProperties.get("iothub-connection-device-id");

Параметр message, отмеченный @EventHubTrigger, должен быть строкой или, возможно, байтовым массивом. POJO (или EventData в этом отношении) не может быть отображено в этом случае, так как данные поддержки содержат только полезную нагрузку / значение события.

Итак, функция должна выглядеть так:

public class TranslateEndpoint {
    /**
     * This function will be invoked when an event is received from Event Hub.
     */
    @FunctionName("TranslateEndpoint")
    public void run(
            @BindingName("SystemProperties") Map<String, Object> systemProperties,
            @EventHubTrigger(name = "message", eventHubName = "NAME-DeviceIntegration", connection = "HostName=HOST;SharedAccessKeyName=NAME;SharedAccessKey=KEY=", consumerGroup = "$Default", cardinality = Cardinality.ONE) String message,
            final ExecutionContext context
    ) {
        String deviceId = (String) systemProperties.get("iothub-connection-device-id");
        //decode/parse message string
        //...
    }
}

Документация:

Не могу не сказать, что документация может быть менее громоздкой, так же как API на всех поддерживаемых языках могут быть более согласованными. Я все еще могу что-то упустить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...