Telegram bot и функция отправка документа с SD карты

Forza

✩✩✩✩✩✩✩
31 Июл 2018
6
0
Нужно реализовать отправку текстового файла с sd карты в телеграм бот. В библиотеке Гайвера FastBot и библиотеке UniversalTelegramBot
нету этой функции, в Fastbot есть стикеры, команды а документа нет в универсал_боте есть отправка фото. мне же необходимо project.txt к примеру отправить, данная возможность в боте самом есть https://core.telegram.org/bots/api#sending-files . Есть ли еще библиотеки которые позволяют это сделать или можно реализовать по другому?
 

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
Оформи код соответствующим тэгом
Ответ для потомков. С файлом, который генерит библиотека <SD.h>, библиотека FastBot прекрасно работает. Проверено на ESP8266. Надо учитывать, что библиотека <SD.h> должна быть объявлена до объявления <FastBot.h>, пример:
C++:
#include <SD.h>
#include <FastBot.h>
...
void loop() {   
   myFile = SD.open("myfile.txt"); // дескриптор файла, файл находится в корне SD-карты
    if (myFile ) { // если дескркиптор не равен 0, отправить файл в Телеграм-чат
      bot.sendMessage("Запрашиваю файл...");
      bot.sendFile(myFile, FB_DOC, "myfile.txt", CHAT_ID);
    } else {
      bot.sendMessage("Ошибка доступа к файлу");
    }
    myFile.close(); // закрыть файл
}
И еще один важный нюанс. Если в проекте используется SD-карта, то обновление по OTA (в этой библиотеке в том числе) не работает, ESP ломается. Вечный перезапуск. Не разбирался глубоко, но похоже, что связано это с конфликтом использования объекта FILE. Механика такая. Отправляешь update.bin из чата, начинается обновление, и система крашится. При этом сообщение на сервере Телеграма не отмечается прочитанным, и при следующем запуске вновь идет попытка обновиться. И так далее до бесконечности.
 
Изменено:

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
@Старик Похабыч,

Если правильно понял вопрос, то в настройках платы так:

FS:2MB OTA:~1019KB

Пробовал другие комбинации. OTA приводит к перезагрузке. Если из скетча убрать объект класса FILE, то OTA работает. В дебаг-выводе:

OTA update attempt

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

ctx: cont
sp: 3ffff3e0 end: 5c5c5c5c offset: 01a0
3ffff580: 3ffef500 3fff453c 40100361 00000000
3ffff590: 000354ac 3fff3a40 00001b16 000000dd (и далее длинная портянка до момента wdt reset)
...
40003c20: 720020c0 70708726 fcf75674 0000f00d
40003c30: d9e0c112
ets Jan 8 2013,rst cause:4, boot mode: (3,6)

wdt reset
load 0x4010f000, len 3460, room 16
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4
tail 4
chksum 0xc9
csum 0xc9
v0006f010
~ld
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,263
1,301
Москва
Тут перезагрузка идет по вочдогу, значит где то что то тормозит излишне.
Т.е. у телебота есть определенная обработка на обновление по возуху, то перед update стоит попробовать отключить вочдог. а после наверное можно и не включать, т.к. должна быть перезагрузка.
Для esp32:
#include "soc/rtc_wdt.h"

rtc_wdt_protect_off();
rtc_wdt_disable();
 

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
Пробовал все комбинации FS-OTA - дело не в них. Если не использовать объект File - OTA работает. Чуть позже попробую разобраться, заглянуть внутрь ESP8266httpUpdate.h, т.к. нужны и SD, и OTA
 

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
OTA и SD работают, конфликтов нет, свое предыдущее заключение насчет проблемы сделал поспешно. Проверил на другом скетче. В моем случае причина неработоспособности OTA и SD во фрагментации heap-области из-за злоупотребления String. При вызове OTA В библиотеке ESPhttpUpdate процедура BearSSL пытается передать сертификат на сервер, а он длинный, так сказать.. и для корректной работы надо ~17KB нефрагментированного участка памяти, с большим числом String-объектов это проблема. Примерно так я это понимаю
 
  • Лойс +1
Реакции: Старик Похабыч

gem.ini

✩✩✩✩✩✩✩
28 Сен 2021
12
1
Оптимизация String во всем проекте не принесла положительных результатов. Даже если убрать все переменные String, то в связка OTA + SD + FILE ESP8266 в одном проекте не уживаются. Если вообще убрать FILE - все работает. Корневую причину так и не определил. Решил иначе. Объект FILE создаю не глобально на весь период runtime, а каждый раз локально в области, где он нужен. После выполнения операций с файлом, и выхода из блока кода, объект удаляется автоматически, ОТА работает. HEAP в норме. Решение не элегантное, зато рабочее

p.s. HEAP, берегите heap
 
Изменено: