• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Библиотека UniversalTelegramBot блокирующая?

baraba

New member
Здравствуйте!
В свой проект на Esp8266 решил добавить управление через telegram для чего использовал библиотеку UniversalTelegramBot. В процессе работы заметил что код начал притормаживать. Подозрение пало на эту библиотеку. В пример идущий с библиотекой добавил пару строк для вычисления времени которое идет на проверку наличия новых сообщений
Код:
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <UniversalTelegramBot.h>

// Wifi network station credentials
#define WIFI_SSID "YOUR_SSID"
#define WIFI_PASSWORD "YOUR_PASSWORD"
// Telegram BOT Token (Get from Botfather)
#define BOT_TOKEN "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"

const unsigned long BOT_MTBS = 1000; // mean time between scan messages

X509List cert(TELEGRAM_CERTIFICATE_ROOT);
WiFiClientSecure secured_client;
UniversalTelegramBot bot(BOT_TOKEN, secured_client);
unsigned long bot_lasttime; // last time messages' scan has been done

const int ledPin = LED_BUILTIN;
int ledStatus = 0;

void handleNewMessages(int numNewMessages)
{
  Serial.print("handleNewMessages ");
  Serial.println(numNewMessages);

  for (int i = 0; i < numNewMessages; i++)
  {
    String chat_id = bot.messages[i].chat_id;
    String text = bot.messages[i].text;

    String from_name = bot.messages[i].from_name;
    if (from_name == "")
      from_name = "Guest";

    if (text == "/ledon")
    {
      digitalWrite(ledPin, LOW); // turn the LED on (HIGH is the voltage level)
      ledStatus = 1;
      bot.sendMessage(chat_id, "Led is ON", "");
    }

    if (text == "/ledoff")
    {
      ledStatus = 0;
      digitalWrite(ledPin, HIGH); // turn the LED off (LOW is the voltage level)
      bot.sendMessage(chat_id, "Led is OFF", "");
    }

    if (text == "/status")
    {
      if (ledStatus)
      {
        bot.sendMessage(chat_id, "Led is ON", "");
      }
      else
      {
        bot.sendMessage(chat_id, "Led is OFF", "");
      }
    }

    if (text == "/start")
    {
      String welcome = "Welcome to Universal Arduino Telegram Bot library, " + from_name + ".\n";
      welcome += "This is Flash Led Bot example.\n\n";
      welcome += "/ledon : to switch the Led ON\n";
      welcome += "/ledoff : to switch the Led OFF\n";
      welcome += "/status : Returns current status of LED\n";
      bot.sendMessage(chat_id, welcome, "Markdown");
    }
  }
}
void setup()
{
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT); // initialize digital ledPin as an output.
  delay(10);
  digitalWrite(ledPin, HIGH); // initialize pin as off (active LOW)

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.print(".");
    delay(500);
  }
  Serial.print("\nWiFi connected. IP address: ");
  Serial.println(WiFi.localIP());

}
void loop()
{
  if (millis() - bot_lasttime > BOT_MTBS)
  {unsigned long b_lasttime=millis();
    int numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    Serial.print("getUpdates= ");Serial.println(millis()-b_lasttime);
    while (numNewMessages)
    {
      Serial.println("got response");
      handleNewMessages(numNewMessages);
      numNewMessages = bot.getUpdates(bot.last_message_received + 1);
    }
    bot_lasttime = millis();
  }
}
В результате получил такой ответ
Код:
etUpdates= 2370
getUpdates= 4347
getUpdates= 2335
getUpdates= 2762
getUpdates= 5120
getUpdates= 3126
getUpdates= 3409
getUpdates= 2345
getUpdates= 2699
getUpdates= 2278
getUpdates= 6890
getUpdates= 3572
getUpdates= 3432
getUpdates= 2627
getUpdates= 2990
getUpdates= 2764
getUpdates= 5426
getUpdates= 3872
getUpdates= 2365
getUpdates= 2537
getUpdates= 3120
getUpdates= 2760
Как видно - на проверку уходит от 2 до 6 секунд. На это время работа остальной части кода останавливается что меня не устраивает. Можно ли как-то избежать этого?
 

Сергей_Ф

Moderator
Команда форума
Здравствуйте!
В свой проект на Esp8266 решил добавить управление через telegram для чего использовал библиотеку UniversalTelegramBot.

На это время работа остальной части кода останавливается что меня не устраивает. Можно ли как-то избежать этого?
Возмтие другую библиотеку. Например AsyncTelegramBot
 

CodeNameHawk

Moderator
Команда форума
Есть asynctelegrambot.
Но и она(и та что у вас) жрёт много памяти, а когда с инета долго не отвечают, память заканчивается.
Остановился на cbot, меньше всего жрёт ресурсов, хоть и не асинхронная.
 

Сергей_Ф

Moderator
Команда форума
Есть asynctelegrambot.
Но и она(и та что у вас) жрёт много памяти, а когда с инета долго не отвечают, память заканчивается.
Остановился на cbot, меньше всего жрёт ресурсов, хоть и не асинхронная.
Память жрёт разбор ответов в json. Чем больше поддерживается и обрабатывается полей ответа, тем больше и жрёт. UTB хоть и прожорлив, но у меня пашет месяцами без перегрузок. При чем с сертификатом, что тоже жрёт немало.
 

Сергей_Ф

Moderator
Команда форума

CodeNameHawk

Moderator
Команда форума
Сертификат и жрёт память.
Вчера сервер, на который сбрасываю показания датчиков, сильно медленно работал.
Библиотека async, простой запрос к серверу подвисает.
Вроде выставил время ожидания в 1 сек., но оно срабатывает, только если сервер вообще не отвечает.
 

Сергей_Ф

Moderator
Команда форума
Сертификат и жрёт память.
Вчера сервер, на который сбрасываю показания датчиков, сильно медленно работал.
Библиотека async, простой запрос к серверу подвисает.
Вроде выставил время ожидания в 1 сек., но оно срабатывает, только если сервер вообще не отвечает.
Насколько заметил, сертификат жрёт только при установке соединения. Потом освобождает. Время соединения тоже зависит от него. Если в insecure то быстро и .. все равно жрёт ;)
 

CodeNameHawk

Moderator
Команда форума
Простое сравнение свот и других, на примере echobot, показывает ~20 kB меньшее потребление.
Esp8266? Проц не на 160 случайно?
Да 8266, на 80 работает, проблемы только если инет соединение тормозит, это бывает редко, пару раз в год.
 
Сверху Снизу