Как десериализовать Событие из IoT-хаба, которое было передано в Event-хаб? - PullRequest
0 голосов
/ 13 апреля 2020

Я обрабатываю сообщение от EventHub , подключенного к IoT Hub . Я попытаюсь объяснить весь процесс.

Используя терминал, я посылаю следующую команду компоненту IoT, развернутому в Azure:

  curl --request POST \
    --url "https://${IOT_HUB}.azure-devices.net/devices/${DEVICE}/messages/events?api-version=2018-06-30" \
    --header "Accept: application/json" \
    --header "Authorization: ${SAS_TOKEN}" \
    --data "{ \"field1\" : \"12345\", \"field2\" : \"abcde\" }" \
    --verbose

Когда функция Azure получить событие (curl -> IoT hub -> Event-hub <- Azure Function) и распечатать содержимое: </p>

    @FunctionName("processSensorData")
    public void processSensorData(
            @EventHubTrigger(
                    name = "demo",
                    eventHubName = "", // blank because the value is included in the connection string
                    cardinality = Cardinality.ONE,
                    connection = "EventHubConnectionString")
                    String item,
            final ExecutionContext context) {

        context.getLogger().info("Event hub message received: " + item.toString());

В консоли появляется следующее сообщение:

    [
    {
       "id":"xxx",
       "topic":"/SUBSCRIPTIONS/xxx/RESOURCEGROUPS/xxxPROVIDERS/MICROSOFT.DEVICES/IOTHUBS/Txxxx",
       "subject":"devices/xxx",

   "eventType":"Microsoft.Devices.DeviceTelemetry",
   "eventTime":"2020-04-13T15:02:15.253Z",
   "data":{
      "properties":{

      },
      "systemProperties":{
         "iothub-content-type":"application/x-www-form-urlencoded",
         "iothub-content-encoding":"",
         "iothub-connection-device-id":"xxx",
         "iothub-connection-auth-method":"{\"scope\":\"device\",\"type\":\"sas\",\"issuer\":\"iothub\",\"acceptingIpFilterRule\":null}",
         "iothub-connection-auth-generation-id":"xxx",
         "iothub-enqueuedtime":"2020-04-13T15:02:15.253Z",
         "iothub-message-source":"Telemetry"
      },
      "body":"yyy"
   },
   "dataVersion":"",
   "metadataVersion":"1"
}]

но тело выглядит зашифрованным.

Как декодировать тело для возврата исходного запроса?

"{ \"field1\" : \"12345\", \"field2\" : \"abcde\" }"

Заранее большое спасибо

Хуан Антонио

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Вам необходимо настроить свойства системного сообщения, такие как contentType до application / json и contentEncoding до UTF-8 в вашем запросе POST.

0 голосов
/ 13 апреля 2020

Тело имеет кодировку URL base64. Вы должны декодировать его в своем коде, а затем проанализировать объект JSON. Попробуйте этот код для декодирования:

  var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
  var jsonStr = System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
...