GCP IoTCore не будет анализировать полезную нагрузку с помощью шлюзов и HTTP-моста

Предпринятые шаги

  1. Создайте новую пару ключей и используйте ее для шлюза, который будет создан.
  2. Создайте шлюз, назовем его my_first_gateway
  3. Создайте новое устройство, назовем его gw_device_1
  4. Свяжите gw_device_1 с my_first_gateway

Пока работает нормально.

Теперь я хочу использовать HTTP-мост для отправки данных состояния gw_device_1 в IoTCore через мой шлюз, используя закрытый ключ my_first_gateway, следуя этому руководству: https://cloud.google.com/iot/docs/how-tos/gateways/http-bridge#setting_device_state_through_the_gateway

Observation1: URL-адрес в этом руководстве кажется неверно отформатированным, в конце «delegated_device_id» отсутствует двойная кавычка:

curl -X POST -H 'authorization: Bearer GATEWAY_JWT' -H 'content-type: application/json' --data '{"binary_data": "DATA", "gateway_info": {"delegated_device_id: "device-id"}}' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/{project-id}/locations/{cloud-region}/registries/{registry-id}/devices/{gateway-id}:setState'

Когда я теперь заменяю все заполнители и заменяю "DATA", скажем, "ewogICJhUHJvcCI6ICJhVmFsdWUiCn0", я выполняю следующий curl (токен явно не настоящий):

curl -X POST -H 'authorization: Bearer GW_JWT_TOKEN' -H 'content-type: application/json' --data '{"binary_data": "ewogICJhUHJvcCI6ICJhVmFsdWUiCn0=", "gateway_info": {"delegated_device_id": "gw_device_1"}}' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/my_project_id/locations/europe-west1/registries/my_registry/devices/my_first_gateway:setState'

Я получаю такую ​​ошибку:

{
  "error": {
    "code": 400,
    "message": "Invalid JSON payload received. Unknown name \"binary_data\": Cannot find field.",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "description": "Invalid JSON payload received. Unknown name \"binary_data\": Cannot find field."
          }
        ]
      }
    ]
  }
}

Самое интересное: есть еще одна «конечная точка», которая используется для публикации событий в IoTCore. У него такая же подпись, но вместо setState она заканчивается publishEvent (см. https://cloud.google.com/iot/docs/how-tos/gateways/http-bridge#publishing_the_devices_telemetry_events_through_the_gateway). Выполнение того же самого запроса с помощью этого метода работает нормально:

curl -X POST -H 'authorization: Bearer GW_JWT_TOKEN' -H 'content-type: application/json' --data '{"binary_data": "ewogICJhUHJvcCI6ICJhVmFsdWUiCn0=", "gateway_info": {"delegated_device_id": "gw_device_1"}}' -H 'cache-control: no-cache' 'https://cloudiotdevice.googleapis.com/v1/projects/my_project_id/locations/europe-west1/registries/my_registry/devices/my_first_gateway:publishEvent'

Я что-то упускаю? Любая помощь приветствуется.


person Florian Hansen    schedule 18.07.2019    source источник


Ответы (1)


На самом деле завиток, который предоставляет Google, неверен. Полезная нагрузка должна быть немного адаптирована, строка binary_data должна быть обернута в объект, называемый 'состоянием'

{ "state": { "binary_data": "ewogICJhUHJvcCI6ICJhVmFsdWUiCn0=" }, "gateway_info": {"delegated_device_id": "gw_device_1"}}

Затем завиток работает должным образом.

person Florian Hansen    schedule 18.07.2019