Я пытаюсь отправить кадр с камеры 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, но каждый раз то же самое поведение ...: (