ESP8266 зависает, когда БД не отвечает

Тема в разделе "ESP8266, ESP32", создана пользователем BladzheR, 21 янв 2019.

  1. BladzheR

    BladzheR Нерд

    День добрый!
    Столкнулся с проблемой, ESP8266 выполняет периодические mysql запросы, но если в момент запроса БД не отвечает, то ESP8266 зависает. Если связь с БД восстанавливается, то ESP8266 так же висит.

    Код (C++):


    ...
    #include <MySQL_Connection.h>
    #include <MySQL_Cursor.h>
    ...

    void loop()
    {
            row_values *row = NULL;
            long head_count = 0;

            if (WiFi.status() != WL_CONNECTED)
            {
              // reconnect
            }
     
            if (!conn.connected())
            {
              // reconnect
            }

            MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);

            Serial.println("Running ...");
            cur_mem->execute(query); // Зависает на этой строчке
            Serial.println("Сompleted.");

            cur_mem->get_columns();
            do {
                    row = cur_mem->get_next_row();
                    if (row != NULL) {
                            head_count = atol(row->values[0]);
                    }
            } while (row != NULL);

            delete cur_mem;
           
            if (head_count == 0)
            {
                 // какие-то действия
            }
    }

    Может, кто сталкивался с подобным?

    + еще были мысли перед запросом сделать пинг до БД - это решило проблему на % 50, но бывало проскакивало пинг на успех и снова зависало на этой строчке: "cur_mem->execute(query); ".
    Exception как я понял не отловить. Возвращаемого значения с этой строчки, как я понял, не добиться.

    + еще заметил, когда wi-fi сеть пропадает, то WiFi статус меняется не сразу, соответственно код продолжает выполняться и только на 2,3 цикле пишет, что сеть пропала и ждёт восстановления.
     
  2. BladzheR

    BladzheR Нерд

    В общем, в самой библиотеке так сказать "обработки" на это событие нету, разработчики в курсе ситуации.
    Пока, как вариант, это использование WathDog(Сторожевой таймер).

    Первый вариант(я использую его): https://github.com/esp8266/Arduino/issues/1532#issuecomment-176869292
    Второй вариант:
    - сделать самому: https://www.sciencetronics.com/greenphotons/?p=2107
    - готовый вариант: https://iarduino.ru/shop/Expansion-payments/storozhevoy-taymer.html