Ошибка IoT GCP при отправке новой конфигурации устройства: «Ошибка 413 (слишком большой объект запроса) !!» - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь отправить новому устройству GCP IoT новую конфигурацию. Двоичная строка в кодировке Base64 имеет длину приблизительно 15 КБ. Ограничение размера конфигурации устройства ICP GCP составляет 64 КБ в соответствии с документами . Но я все еще получаю ошибку 413 (запрос слишком большой). Что я делаю неправильно? 15k кажется невероятно крошечным, чтобы выдавать такую ​​ошибку. Спасибо за любую помощь.

Вот код JavaScript, который отправляет данные конфигурации:

  sendDeviceConfig(deviceId, configPayload) {
    const parentName = `projects/${this.projectId}/locations/${this.cloudRegion}`;
    const registryName = `${parentName}/registries/${this.registryId}`;

    const binaryData = Buffer.from(configPayload).toString('base64');
    const request = {
      name: `${registryName}/devices/${deviceId}`,
      versionToUpdate: 0,
      binaryData: binaryData,
    };

    return new Promise((resolve, reject)=>{
      this.client.projects.locations.registries.devices.modifyCloudToDeviceConfig(
        request,
        (err) => {
          if (err) {
            this.logger.error('Could not update config:', deviceId);
            reject(err);
          } else {
            resolve();
          }
        }
      );
    });
  }

... И часть ответа об ошибке в формате HTML (wtf?):

<html lang=en>
  <meta charset=utf-8>
  <meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
  <title>Error 413 (Request Entity Too Large)!!1</title>
  ...
  </style>
  <a href=//www.google.com/><span id=logo aria-label=Google></span></a>
  <p><b>413.</b> <ins>That’s an error.</ins>
  <p>Your client issued a request that was too large.

Ответы [ 2 ]

1 голос
/ 01 мая 2019

Я думаю, что полезная нагрузка будет ~ 22,4 КБ с кодировкой base64.

Однако, если конфиг больше 16 КБ и помещен в заголовок запроса, Google вернет 413. Он должен быть в теле Поста.

0 голосов
/ 30 апреля 2019

Похоже, что устаревшая клиентская библиотека может делать что-то странное, следующий код, используемый в качестве вставки для примера кода, работает для меня с более крупными полезными нагрузками конфигурации:

  const iot = require('@google-cloud/iot');

  const newclient = new iot.v1.DeviceManagerClient({
    // optional auth parameters.
  });

  const parentName = `projects/${projectId}/locations/${cloudRegion}`;
  const registryName = `${parentName}/registries/${registryId}`;
  const binaryData = Buffer.from(data).toString('base64');
  const request = {
    name: `${registryName}/devices/${deviceId}`,
    binaryData: binaryData,
  };
  newclient.modifyCloudToDeviceConfig(request)
    .then(responses => {
      const response = responses[0];
      // doThingsWith(response)
    })
    .catch(err => {
      console.error(err);
    });
...