Подключение Eclipse Hono к Ditto - описание: проверьте, все ли обязательные поля JSON установлены.}, Status: 400} "Ошибка

Мне удалось успешно подключить Hono к Ditto с помощью адаптеров AMQP, и я получил следующие сообщения в журнале. Значение, отправленное с демонстрационного устройства, зарегистрированного в Hono, успешно получено и обновлено в Ditto.

connectivity_1_ad306c4c315b | 2019-07-08 21:12:05,434 INFO  [ID:AMQP_NO_PREFIX:TelemetrySenderImpl-35]  o.e.d.s.c.m.a.AmqpPublisherActor akka://ditto-cluster/system/sharding/connection/1/Insight-connection-1/pa/$a/c1/amqpPublisherActor2 - Response dropped, missing replyTo address: UnmodifiableExternalMessage [headers={orig_adapter=hono-http, device_id=4716, correlation-id=ID:AMQP_NO_PREFIX:TelemetrySenderImpl-35, content-type=application/vnd.eclipse.ditto+json, etag="hash:18694a24", orig_address=/telemetry, source=nginx:ditto}, response=true, error=false, authorizationContext=null, topicPath=ImmutableTopicPath [namespace=org.eclipse.ditto, id=4716, group=things, channel=twin, criterion=commands, action=modify, subject=null, path=org.eclipse.ditto/4716/things/twin/commands/modify], enforcement=null, headerMapping=null, sourceAddress=null, payloadType=TEXT, textPayload={"topic":"org.eclipse.ditto/4716/things/twin/commands/modify","headers":{"orig_adapter":"hono-http","device_id":"4716","correlation-id":"ID:AMQP_NO_PREFIX:TelemetrySenderImpl-35","content-type":"application/vnd.eclipse.ditto+json","etag":"\"hash:18694a24\"","orig_address":"/telemetry","source":"nginx:ditto"},"path":"/features","value":null,"status":204}, bytePayload=null']
things-search_1_8f2ad3dda4bf | 2019-07-08 21:12:05,593 INFO  [] o.e.d.s.t.p.w.s.EnforcementFlow  - Updating search index of <1> things
things-search_1_8f2ad3dda4bf | 2019-07-08 21:12:05,598 INFO  [] o.e.d.s.t.p.w.s.EnforcementFlow  - Got SudoRetrieveThingResponse <1> times
things-search_1_8f2ad3dda4bf | 2019-07-08 21:12:05,725 INFO  [] a.s.Materializer akka.stream.Log(akka://ditto-cluster/user/thingsSearchRoot/searchUpdaterRoot/StreamSupervisor-21) - [SearchUpdaterStream/BulkWriteResult] Element: BulkWriteResult[matched=1,upserts=0,inserted=0,modified=1,deleted=0]

Но когда я попытался установить новое соединение (Hono - установлен на другом сервере и то же самое размещено на том же сервере, где установлено вышеупомянутое успешное соединение). Соединение установлено, а также когда я пытаюсь отправить сообщения с демонстрационных устройств, зарегистрированных в Hono, на Ditto. Получаю следующий ответ.

vigkam@srvgal89:~$ curl -X POST -i -u sensor0101@tenantAdapters:mylittle -H 'Content-Type: application/json' -d '{"temp": 23.09, "hum": 45.85}'  http://srvgal89.deri.ie:8080/telemetry
HTTP/1.1 202 Accepted
content-length: 0

И когда я пытаюсь получить метрики подключения, я вижу увеличение количества метрик по сравнению с количеством сообщений, отправленных из Hono.

Но единственная проблема заключается в том, что значения датчика (температура и влажность, как в приведенной выше команде curl) не обновляются в том же самом.

Я получил следующее сообщение об ошибке в журнале, в котором говорится "описание": "Проверить, все ли обязательные поля JSON были установлены."}, "Status": 400} "

connectivity_1_ad306c4c315b | 2019-07-08 21:34:17,640 INFO  [ID:AMQP_NO_PREFIX:TelemetrySenderImpl-13] o.e.d.s.c.m.a.AmqpPublisherActor akka://ditto-cluster/system/sharding/connection/23/Gal-Connection-10/pa/$a/c1/amqpPublisherActor2 - Response dropped, missing replyTo address: UnmodifiableExternalMessage [headers={content-type=application/vnd.eclipse.ditto+json, orig_adapter=hono-http, orig_address=/telemetry, device_id=4816, correlation-id=ID:AMQP_NO_PREFIX:TelemetrySenderImpl-13}, response=true, error=true, authorizationContext=null, topicPath=ImmutableTopicPath [namespace=unknown, id=unknown, group=things, channel=twin, criterion=errors, action=null, subject=null, path=unknown/unknown/things/twin/errors], enforcement=null, headerMapping=null, sourceAddress=null, payloadType=TEXT, textPayload={"topic":"unknown/unknown/things/twin/errors","headers":{"content-type":"application/vnd.eclipse.ditto+json","orig_adapter":"hono-http","orig_address":"/telemetry","device_id":"4816","correlation-id":"ID:AMQP_NO_PREFIX:TelemetrySenderImpl-13"},"path":"/","value":{"status":400,"error":"json.field.missing","message":"JSON did not include required </path> field!","description":"Check if all required JSON fields were set."},"status":400}, bytePayload=null']

Пожалуйста, дайте мне знать, если я что-то упускаю. Заранее спасибо.!!

Дополнительная информация: идентификатор вещи в Ditto - org.eclipse.ditto: 4816, идентификатор клиента в Hono - tenantAdapters, устройство, зарегистрированное в Hono - 4816 (tenantAdapters), идентификатор устройства - sensor0101, ConnectionId между Хоно и Дитто - Gal-Connection-10


person VigKam    schedule 08.07.2019    source источник


Ответы (2)


Сообщения, обрабатываемые Eclipse Ditto через AMQP (например, Hono), должны быть в так называемом протоколе Ditto является протоколом на основе JSON, который помимо других полей JSON содержит поле path, которое отсутствует в вашем JSON (отсюда и сообщение об ошибке "JSON did not include required </path> field!").

Итак, у вас есть как минимум 2 варианта действий:

  1. Вместо формата JSON {"temp": 23.09, "hum": 45.85} отправьте сообщение в протоколе Ditto, например пример можно найти здесь
  2. Используйте функцию сопоставления полезной нагрузки Ditto, чтобы указать функцию JavaScript для вызова на всех входящих сообщениях от Hono, чтобы преобразовать их в действительное сообщение протокола Ditto.
person Thomas Jäckle    schedule 09.07.2019
comment
Благодарю за ваш ответ. Я отправил сообщение, используя протокол Ditto, и получил вышеуказанное сообщение. Раньше для mappingEngine был задан Java, я изменил его на Javascript. Это единственное изменение, которое я сделал, и оно работает должным образом. - person VigKam; 09.07.2019

вероятно, вы получаете этот сбой, поскольку Ditto не может анализировать сообщения протокола, отличного от того же. Читая ваши журналы, я думаю, что ваша вещь Ditto в настоящее время выглядит так:

{
  "thingId": "org.eclipse.ditto:4716",
  "features": null
}

Вы можете проверить это с помощью запроса GET к http://<your-ditto-address>:<your-ditto-gateway-port>/api/2/things/org.eclipse.ditto:4716.

Поскольку вы, вероятно, захотите сохранить температуру и влажность в качестве характеристики вашей вещи, было бы лучше не использовать функции как null, но уже предоставить функцию с идентификатором для значения. Сделайте это, создав функцию, например с идентификатором "среда" через PUT в http://<your-ditto-address>:<your-ditto-gateway-port>/api/2/things/org.eclipse.ditto:4716/features/environment и содержимое {}. После этого ваша вещь, вероятно, должна выглядеть так:

{
    "thingId": "org.eclipse.ditto:4716",
    "features": {
        "environment": {}
    }
}

Теперь вернемся к вашему первоначальному вопросу: Ditto будет понимать только сообщения протокола ditto и, следовательно, не знает, что делать с вашим объектом JSON.

Чтобы решить эту проблему, у вас есть два варианта: 1. добавить сценарий сопоставления полезной нагрузки для входящих сообщений в ваше соединение. 2. публикация сообщения протокола то же самое вместо простого объекта JSON. Тогда это будет выглядеть примерно так:

vigkam@srvgal89:~$ curl -X POST -i -u sensor0101@tenantAdapters:mylittle -H 'Content-Type: application/json' -d '{ "topic": "org.eclipse.ditto/4716/things/twin/commands/modify", "path": "/features/environment", "value": {"temp": 23.09, "hum": 45.85} }'  http://srvgal89.deri.ie:8080/telemetry

Обратите внимание, что я указал путь /features/environment, который обновит значение функции среды вашего объекта.

person Florian    schedule 09.07.2019