Arduino + Java MQTT Изображение отправлено, потерянные байты - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь отправить кадр с камеры ESP32 на сервер Java с pubsubclient MQTT lib.Я могу сделать снимок, но когда я пытаюсь отправить его через MQTT, он отправляет только несколько байтов (83224 байта фотографии и 22950 отправленных байтов).

Это мой метод, берет кадр изкамера и записывает указатель uint8_t на посредника (mosquitto):

  • Я пытался перебирать байты и посылать буфер за байтом:
esp_err_t camera_example_capture() {

  //capture a frame
  camera_fb_t * fb = esp_camera_fb_get();
  if (!fb) {
    Serial.println("Frame buffer could not be acquired");
    ESP_LOGE(TAG, "Frame buffer could not be acquired");
    return ESP_FAIL;
  }

  size_t buf_len = fb->len;
  Serial.println("---Buf Len ");
  Serial.println(buf_len);

  client.beginPublish("topic",  fb->len, false);

  for (int i = 0; i < fb->len; i++) {
     client.write(fb->buf[i]);
  }

  client.endPublish();

  esp_camera_fb_return(fb);
  return ESP_OK;
}
  • Я попробовал этот метод для отправки целого uint8_t указателя:
client.write(fb->buf, fb->len); 
  • Единственный способ, который работаетВот это:
client.publish_P("topic", fb->buf, fb->len, false);

Но вместо SRAM используется PROGMEM, и для передачи изображения требуется несколько минут.

Есть идеи по использованию методов записи и обеспечению безопасности всех байтов?

Спасибо

Редактировать:

Я использую Mosquitto в качестве посредника, и в его журналах я вижу следующее:

1556567535: Sending PUBLISH to paho22444007144826 (d0, q0, r0, m0, 'home/orchard/watcher', ... (200055 bytes))
1556567535: Received PUBLISH from ESP32Client (d0, q0, r0, m0, 'home/orchard/watcher', ... (3447 bytes))
1556567535: Sending PUBLISH to paho22444007144826 (d0, q0, r0, m0, 'home/orchard/watcher', ... (3447 bytes))
1556567535: Socket error on client ESP32Client, disconnecting.
  • Первый вызов выполняется с помощью метода pùblish_P, и передаются все байты.

  • Второй вызов повторяется в байтах:

client.beginPublish("topic",  buf_len, false);

  size_t meison = 0;
  static const size_t bufferSize = 4096;
  static uint8_t buffer[bufferSize] = {0xFF};
  while (buf_len) {
    size_t copy = (buf_len < bufferSize) ? buf_len : bufferSize;
    Serial.println(copy);
    memcpy ( &buffer, &fb->buf[meison], copy );
     client.write(&buffer[0], copy);
    buf_len -= copy;
    meison += copy;
  }
  client.endPublish();

Кажется какая-то ошибка сокета, но я не знаю, что может быть.Я пытался изменить некоторые параметры, такие как MQTT_MAX_TRANSFER_SIZE, но каждый раз то же самое поведение ...: (

...