FastBot. Обсуждение библиотеки

timi

✩✩✩✩✩✩✩
5 Дек 2019
2
0
Добрый вечер.
С первым ботом разобрался, решил изучить FastBot2, запускаю минимальный пример на проверку и получаю ошибку, и где взять этот StreamDev.h никак не пойму. Ide 1.8.19
C++:
In file included from D:\doc\Ardu\libraries\GyverHTTP-main\src/utils/ServerBase.h:8:0,
                 from D:\doc\Ardu\libraries\GyverHTTP-main\src/utils/Server.h:2,
                 from D:\doc\Ardu\libraries\GyverHTTP-main\src/GyverHTTP.h:6,
                 from D:\doc\Ardu\libraries\FastBot2-main\src/core/Fetcher.h:3,
                 from D:\doc\Ardu\libraries\FastBot2-main\src/core/core.h:11,
                 from D:\doc\Ardu\libraries\FastBot2-main\src/FastBot2Client.h:2,
                 from D:\doc\Ardu\libraries\FastBot2-main\src/FastBot2.h:13,
                 from D:\doc\Ardu\sketch_oct28a\sketch_oct28a.ino:8:
D:\doc\Ardu\libraries\GyverHTTP-main\src/StreamWriter.h:5:23: fatal error: StreamDev.h: No such file or directory
 #include <StreamDev.h>
                       ^
compilation terminated.
exit status 1
Ошибка компиляции для платы LOLIN(WEMOS) D1 R2 & mini.
 

timi

✩✩✩✩✩✩✩
5 Дек 2019
2
0
@Att, если бы ее не было, то Ide на неё ругалась, а так конечно проверял, стоит последняя версия.
 

Att

✩✩✩✩✩✩✩
14 Фев 2024
15
2
@timi,
cores/esp8266/StreamDev.h Это файл ядра esp8266.
Вероятно ядро устарело. Нужно зайти в "платы" и и обновить esp8266 на версию выше или до актуальной.

ЗЫ Лучше запомнить текущую. версию перед обновлением, чтобы потом не пришлось гадать какая стояла. Возможно после обновления перестанут собираться другие скетчи. Проще будет вернутся на нужною версию или понять что именно в коде нужно поменять, чтобы он заработал на новой версии ядра.
 
Изменено:

JesseOcean

✩✩✩✩✩✩✩
31 Окт 2024
10
2

Продублирую вопрос тут...

Как в Fastbot2 отправить файл?
 

Att

✩✩✩✩✩✩✩
14 Фев 2024
15
2
@JesseOcean,
C++:
String fname = "file.txt";
File myFile = SD.open(fname);
if (myFile) {
    fb::File f(fname, fb::File::Type::document, myFile);
    f.chatID = TG_USER_ID;
    bot.sendMessage(fb::Message("Preparing File... Wait ...", TG_USER_ID)); 
    bot.sendFile(f,false);                         
    myFile.close();
} else {
    bot.sendMessage(fb::Message("No File!", TG_USER_ID));
}
SD.open работает в синхронном режиме. Т.е. при отправке файла основная программа блокируется. Следите за WDG.
Из особенностей... файлы до 2Мб передаются быстрее. 2Мб+ передаются значительно дольше.
ESP32 передает примерно 3 минуты 10 сек файл 10 мб, при хорошем уровне WiFi. Если нужно быстрее, то лучше использовать ESP32C6.там скорость передачи будет +30-50%.
PS из личного опыта
 

JesseOcean

✩✩✩✩✩✩✩
31 Окт 2024
10
2
@Att,


C++:
void LOGread()                                   // отправка лога по команде //
{
  if (!SD.begin(4))
  {
    send_alert("ERROR: Ошибка инициализации SD карты");
  }

  String file_name = object_TimeDate.get_DateFULL() + ".txt";
  File myFile = SD.open(file_name);

  if (myFile)
  {
    fb::File f(file_name, fb::File::Type::document, myFile);
    f.chatID = object_array_users[users_array_index].get_id();

    bot_main.sendMessage(fb::Message("Отправляю файл... Ожидайте...", object_array_users[users_array_index].get_id()));
    bot_main.sendFile(f, false);
  }

  else
  {
    send_alert("ERROR: Ошибка чтения SD карты");
  }

  myFile.close();
}
Не работает почему-то... Сообщение "Отправляю файл... Ожидайте..." приходит, а файл нет)

Пробовал ставить выбирать по очереди всё режимы Sync/Async/Long - не работает нигде...
 
Изменено:

Att

✩✩✩✩✩✩✩
14 Фев 2024
15
2
@JesseOcean, Понятия не имею. Приведенный мной код - 100% рабочий вариант. Я не знаю ваших входящих данных. Что за файл. Заблокирован ли он записью при попытке открыть и прочитать его. Кто такие object_array_users и в каком виде. Размер файла, какая ESP.. Падает в перезагрузку ESP или нет. На ваш вопрос однозначного ответа быть и не может. Это гадание на кофейной гуще.

C++:
    bot_main.sendMessage(fb::Message("Тест1", object_array_users[users_array_index].get_id()));
    bot_main.sendFile(f, false);
    bot_main.sendMessage(fb::Message("Тест2", object_array_users[users_array_index].get_id()));
Это поможет понять не падает ли он. Если Тест2 не приходит через разумное время, то значит смотри консоль почему падает. Может файл жирный, памяти не хватает или отрабатывает WDG.

Если Тест2 приходит, то смотри доступен ли файл. его размер, память.
PS myFile.close() нужен только в случае удачного открытия файла. У тебя он вызывается всегда.
 

JesseOcean

✩✩✩✩✩✩✩
31 Окт 2024
10
2
[
PS myFile.close() нужен только в случае удачного открытия файла. У тебя он вызывается всегда.
Спасибо, не знал!


Esp8266 nodemcu.

Не, не падает она, wdt не срабатывает, файл 50кб.

Программа отправляет сообщение, но не отправляет файл. Не крэшится.

Файл читает правильно - отправлял его через Юниверсал, плюс в консоль вывести его могу...

Именно не отправляется... Почему - не знаю!
 

Att

✩✩✩✩✩✩✩
14 Фев 2024
15
2
@JesseOcean,
Можно посмотреть что сервер отвечает. Может серверу не нравится что-то
C++:
void LOGread()                                 
{
  if (!SD.begin(4))
  {
    send_alert("ERROR: Ошибка инициализации SD карты");
  }

  String file_name = object_TimeDate.get_DateFULL() + ".txt";
  File myFile = SD.open(file_name);

  if (myFile)
  {
    fb::File f(file_name, fb::File::Type::document, myFile);
    f.chatID = object_array_users[users_array_index].get_id();

    bot_main.sendMessage(fb::Message("Отправляю файл... Ожидайте...", object_array_users[users_array_index].get_id()));
    fb::Result res = bot_main.sendFile(f, false);
    myFile.close();
    Serial.println(res.getRaw());          // вывести ответ сервера в консоль
    bot_main.sendMessage(fb::Message(res.getRaw(), object_array_users[users_array_index].get_id()));      // вывести ответ сервера в ТГ
    bot_main.sendMessage(fb::Message("Вроде отправил файл 🤷‍♂️", object_array_users[users_array_index].get_id()));    
  }
  else
  {
    send_alert("ERROR: Ошибка чтения SD карты");
  }
}
@JesseOcean, Создай пустой файл. Добавь 1 строку, с одним символом. Проверь. Отсюда уже и пляши... от результата
 

JesseOcean

✩✩✩✩✩✩✩
31 Окт 2024
10
2
@Att,


C++:
void LOGread()                                   // отправка лога по команде //
{
  if (!SD.begin(4))
  {
    send_alert("ERROR: Ошибка инициализации SD карты");
  }
 
  String file_name = "123.txt";
  File myFile = SD.open(file_name);

  if (myFile)
  {
    fb::File f(file_name, fb::File::Type::document, myFile);
    f.chatID = object_array_users[users_array_index].get_id();

    bot_main.sendMessage(fb::Message("Отправляю файл: " + file_name + " содержание: " + String(myFile) , object_array_users[users_array_index].get_id()));
    bot_main.sendFile(f, false);

    myFile.close();
  }

  else
  {
    send_alert("ERROR: Ошибка чтения SD карты");
  }
}
Не работает нифига именно отправка файла

@Att,
Не заметил сообщение #110, Спасибо

Вот, что получается:

Logs + LED BOT, [2024-10-31 20:57]
Отправляю файл... Ожидайте...

Logs + LED BOT, [2024-10-31 20:57]
Вроде отправил файл 🤷‍♂️

=))

В консоль выводит пустую строчку)

@Att,

Всё заработало, ответ написал на гите, не буду копипастить.

 

Вложения

Att

✩✩✩✩✩✩✩
14 Фев 2024
15
2
@JesseOcean, так а к боту это какое отношение имеет? Кто ж там знает, что возвращает твой .get_id().

Чтобы избегать таких непоняток, устанавливай явный тип для преобразования в f.chatID.
C++:
f.chatID = (uint32_t)object_array_users[users_array_index].get_id();
 

Att

✩✩✩✩✩✩✩
14 Фев 2024
15
2
@JesseOcean, Все равно не понимаю при чем тут бот.
Вообще на месте автора сделал бы явный тип для chatID. Ибо он так или иначе всегда int32_t или uint32_t (если не общий чат или группа ТГ адресат). Создается только лишняя путаница. В данном конкретном параметре.

Это это дело автора, конечно.
 

JesseOcean

✩✩✩✩✩✩✩
31 Окт 2024
10
2
@JesseOcean, Все равно не понимаю при чем тут бот.
Ну а я то откуда знал в чем проблема пока её не нашел...

Еще другой вопрос... В целом не сильно напрягает, но можно ли это как-то ускорить:

Если обрабатывается входящее сообщение через .tick и в .attachUpdate подключен обработчик, то через обработчик отправляется сообщение через .sendMessage очень быстро (100-200мс)

но если ЕСП сама вызывает где-то в функции .sendMessage то на такую отправку уйдёт 1500-2000мс.
 

Zabolotnyi

✩✩✩✩✩✩✩
18 Ноя 2024
5
1
Это какая-то мистика....
Wemos D1 mini периодически отправляет текстовые сообщения двум адресатам - мне и жене.
#define CHAT_ID "1234,5678" (1234 - мой, 5678 - жены)
bot.setChatID(CHAT_ID); в сетапе
bot.sendMessage("бла-бла-бла"); в лупе
Иногда раз в неделю, иногда 2-3 раза в день (по сути сигнализация).
Жене (у нее iPhone) всегда приходят все сообщения.
Мне (у меня Samsung) - первое сообщение за день теряется, иногда и второе.
Каких-либо проблем с неполучением сообщений из других ботов не замечал...
После перезаливки скетча какое-то время (день-два) приходят все сообщения. потом опять начинается....
Клиенты Телеграма на смартфонах актуальные, библиотека FastBot последняя (2.27.3), Arduino IDE 1.8.18.
Куда копать? В чем косяк? Как пофиксить?
1-2 раза в сутки отправлять пинг-сообщение - не вариант....

Опытным путем установил чтот сервер Телеграма по-разному обрабатывает отправку, отправка сообщений занимает разное время
повторное сообщение через 2 секунды = 100-120 мс
повторное сообщение через 13 минут = 100-120 мс
повторное сообщение через 15 минут и более = 1200 мс
 
Изменено:

JesseOcean

✩✩✩✩✩✩✩
31 Окт 2024
10
2
@Zabolotnyi,

Я бы не копал в ошибки связанные с версией библиотек/телеграмма/операционной системы.

Дело либо в плохо написанном обработчике, либо в неправильных настройках библиотеки.

Разное время ответа скорее всего связано с тем, что опять же настройки неправильные.

1200мс - норм при переподключение между поллинг...
 

Zabolotnyi

✩✩✩✩✩✩✩
18 Ноя 2024
5
1
@JesseOcean,
Хм.... А какие настройки библиотеки?
С входящими сообщениями не работаю, bot.attach(newMsg) и bot.tick(); не использую в скетче.
 

JesseOcean

✩✩✩✩✩✩✩
31 Окт 2024
10
2
Может всё проще и вы поставили режим поллинг и отправляете сообщение, когда вздумается? Поставьте async и не будет проблем
 

Zabolotnyi

✩✩✩✩✩✩✩
18 Ноя 2024
5
1
@JesseOcean,
Да, отправляю сообщения когда вздумается ))))
Режим не трогал нигде, где его потрогать?
(читаю гитхаб по библиотеке, не нахожу там ничего такого)
 

Att

✩✩✩✩✩✩✩
14 Фев 2024
15
2
@Zabolotnyi, почему бы не попробовать отправлять сообщения отдельно для каждого получателя? По крайней мере для проверки это сделать можно.