• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ESP8266 и sqlite3

Записывать тоже научился. Теперь вопрос. У меня есть index.html и страница с конфигурацией configuration.html. Так вот когда я с index.html скажем жму кнопку и отправляю событие \tapbutton оно прекрасно отлавливается
Код:
HTTP.on("/tapbutton", handle_tapbutton);
void handle_tapbutton() {
    Serial.println("test");
    HTTP.send(200, "text/plain", "OK");
}
А вот если я то же самое делаю на странице configuration нифига не срабатывает. Подскажите как записать надо?
 
Народ снова в раздумьях.
Хочу на своей ESP8266 сделать мини БД. Конечно сам бог велел вроде сделать на sqlite3. Как с esp работать с sqlite3 понятно. Но вот как на сайте, созданном на ESP читать sqlite3, так и не нашел(народ там советовал WebSоcket, но насколько я с ним разобрался это не то. Вещь полезная, я ее на сколько мог освоил и задействовал, чтобы данные на страничке были живые без обновления этой странички, но вот прочитать sqlite3 он так же не может. Во всяком случае я не нашел как). Можно конечно с сайта посылать запрос на ESP, там все делать по приходу этого запроса, а потом выводить на страницу. Но правильно ли это?
Еще вроде можно такую мини БД сделать на JSON. Скажем несколько файликов. В одном храница основная история за месяц, три, пол года, это уж потом решу. И еще скажем 8 файликов, куда скидываются данные раз в 5, 10 или 20 минут. Ну типа как в Гисметео с 0 до 3, с 3 до 6 и т.п. Собственно головой понимаю, что нахрен это никому не надо и лазить буду туда только я сам в моменты большой скуки. Ну просто интересно реализовать. Ну и самое интересное. Ну полностью удалять данные из файла по наступлению следующего периода это просто. а вот скажем в основном файле нужно скажем раз в 3 часа удалять самую старую запись и заносить последнюю. Такое возможно?
 

enjoynering

Well-known member
на машине где стоит sqlite3 обычно еще крутится сервер PHP. esp8266 ему GET или POST запрос, а PHP сервер лезет в базу формирует ответ в JSON формате и отправляет esp8266.


Как с esp работать с sqlite3 понятно
пы.сы. если вы спрашиваете такой вопрос то понятно, что ничего вам не понятно.
 

CodeNameHawk

Moderator
Команда форума
(народ там советовал WebSоcket, но насколько я с ним разобрался это не то. Вещь полезная, я ее на сколько мог освоил и задействовал, чтобы данные на страничке были живые без обновления этой странички, но вот прочитать sqlite3 он так же не может
Ну раз WebSоcket сам не читает из базы, то вы прочитайте данные из базы и отдайте ему.
 
на машине где стоит sqlite3 обычно еще крутится сервер PHP. esp8266 ему GET или POST запрос, а PHP сервер лезет в базу формирует ответ в JSON формате и отправляет esp8266.




пы.сы. если вы спрашиваете такой вопрос то понятно, что ничего вам не понятно.
Sqlite3 у меня на esp8266. Сомневаюсь, что туда php влезет.
 
Записываю с esp8266. Читать с неё же конечно можно. Интересно можно ли прочитать с web странички без esp.
 
Я уже веду БД на esp с sqlite и читаю данные из этой БД. Мне же хочется читать данные из БД без esp, я именно этого сделать не могу.
 
Снова за помощью. По попытке записи в sqlite базу стал выдавать:
SQL error: out of memory
При чем непонятно чего не хватает. ВОт это выдает
Память 20608
Общий размер 4194304
БД 0
на следующий запрос:
Код:
    Serial.print("Общий размер ");Serial.println(ESP.getFlashChipSize());
    File f = SPIFFS.open("/weather.sql3", "w");
    if (!f) {
      Serial.println("file open failed");  //  "открыть файл не удалось"
    }   
    Serial.print("БД ");Serial.println(f.size());
    FSInfo fs_info;
    SPIFFS.info(fs_info);
При чем если перекомпилить скетч, снова до 10 записей в базу добавляется и потом снова SQL error: out of memory.

В sqlite запись происходит следующим образом:
Код:
void db_exec(sqlite3 *db, const char *sql) {                               // Основная функция обработки SQL-запросов
   const char *dbf = "/weather.sql3";                                       // Определяем константу со ссылкой на драйвер базы данных в VFS
   char *ErrMsg = 0;                                                       // Переменная для сообщений об ошибках обработки SQL-запросов
   const char* data = 0;                                                   // Константа, содержащая заголовок вывода для функции callback (0 - не используется)
   //Serial.println(sql);
   File db_file_obj;                                                       // Определяем объект типа файл для работы с VFS
   vfs_set_spiffs_file_obj(&db_file_obj);                                  // Инициализируем ссылку на объект в VFS (непосредственно перед открытием файла в SPIFFS)
   if (sqlite3_open(dbf, &db)) {                                           // Инициализируем отрытие базы данных и, если не получилось,
       Serial.print(F("Can't open database: "));                           //  Выводим уведомление об ошибке
       Serial.println(sqlite3_errmsg(db));                                 //  Выводим саму ошибку
       return;                                                             //  Прерываем выполнение функции
   }
   else {Serial.println("DB opened");}
   //Serial.println(sql);                                                    // Выводим полученный запрос
   long start = millis();                                                  // Запоминаем текущее время, прошедшее от начала выполнения программы
   int rc = sqlite3_exec(db, sql, callback, (void*)data, &ErrMsg);         // Вызываем функцию обработки SQL-запроса
   if (rc != SQLITE_OK) {                                                  // Если не удалось обработать запрос,
       Serial.print(F("SQL error: "));                                     //  Выводим сообщение об ошибке
       Serial.println(ErrMsg);                                             //  Выводим детализированную информацию об ошибке
       sqlite3_free(ErrMsg);                                               //  Стираем ошибку
   } else {                                                                // Если запрос успешно обработался
      Serial.print(F("Done. Time taken: "));                              //  Выводим сообщение об успешной обработке запросов
       Serial.print(millis()-start);                                       //  Выводим время, которое заняла обработка запроса, вычитая время старта обработки из текущего времени
       Serial.println(F(" ms"));                                           //  Выводим единицы измерения времени
       Serial.println();                                                   //  Дополнительный перевод строки (для красоты)
   }
   Serial.println(rc);
   sqlite3_close(db);                                                      // Закрываем соединение с базой данных
}
Этот код я содрал вот тут:
вот тут.
 
Народ, подскажите куда рыть. Физическое место на флеш памяти есть. Особенно это понятно после перепрошивки. Записи в БД добавляются. Еще интересный момент, если на компе открывать страницу с выгрузкой БД (ну там самый простой пока запрос типа Select * from table) то она прекрасно открывается. А когда открываю на смартфоне, пишет тоже что памяти нет.
 
failed to fetch data out of memory
вот такую ошибку на смартфоне выдает. При чем даже при 2-3 записях в таблице.
 
Народ, может подскажете куда задать вопрос? Что-то мне кажется с этим sqlite не так, с библиотекой. Как добавил ее и сделал обработку с ней, так памяти стало не хватать для добавления записей и перезагрузки происходят.
Попробую все же наверное типа базы в JSON создать.
 
Еще такой вопрос. Я с помощью утилиты Tools-->ESP8266 Sketch Data Upload загружаю на ESP файлы. В том числе и htm страницы и файл БД. Так вот когда я запрашиваю размер файлов, он выдает 0. Ну если файл БД еще ХЗ, пишется в него что-то или нет, то htm файлы точно не нулевые, а выдает 0.
Код:
    File f = SPIFFS.open("/weather.sql3", "w");
    if (!f) {
      Serial.println("file open failed");  //  "открыть файл не удалось"
    }   
    Serial.print("БД ");Serial.println(f.size());
    File f1 = SPIFFS.open("/settime.htm", "w");
    if (!f) {
      Serial.println("file open failed");  //  "открыть файл не удалось"
    }   
    Serial.print("Settime.htm ");Serial.println(f1.size());
Может я неправильно к файлу БД обращаюсь?
Код:
void db_exec(const char *sql) {                               // Основная функция обработки SQL-запросов
   sqlite3 *db;
   int rc;
   //sqlite3_stmt *res;
   //int rec_count = 0;
   //const char *tail;   
   const char *dbf = "/weather.sql3";                                      // Определяем константу со ссылкой на драйвер базы данных в VFS
   char *ErrMsg = 0;                                                       // Переменная для сообщений об ошибках обработки SQL-запросов
   const char* data = 0;                                                   // Константа, содержащая заголовок вывода для функции callback (0 - не используется)
   Serial.println(sql);
   File db_file_obj;                                                       // Определяем объект типа файл для работы с VFS
   vfs_set_spiffs_file_obj(&db_file_obj);                                  // Инициализируем ссылку на объект в VFS (непосредственно перед открытием файла в SPIFFS)
   if (sqlite3_open(dbf, &db)) {                                           // Инициализируем отрытие базы данных и, если не получилось,
       Serial.print(F("Can't open database: "));                           //  Выводим уведомление об ошибке
       Serial.println(sqlite3_errmsg(db));                                 //  Выводим саму ошибку
       return;                                                             //  Прерываем выполнение функции
   }
   else Serial.println("DB opened");
   rc = sqlite3_exec(db, sql, callback, (void*)data, &ErrMsg);         // Вызываем функцию обработки SQL-запроса
   if (rc != SQLITE_OK) {                                                  // Если не удалось обработать запрос,
       Serial.print(F("SQL error: "));                                     //  Выводим сообщение об ошибке
       Serial.println(ErrMsg);                                             //  Выводим детализированную информацию об ошибке
       sqlite3_free(ErrMsg);                                               //  Стираем ошибку
   }
   Serial.println(rc);
   sqlite3_close(db);                                                      // Закрываем соединение с базой данных
}
 
И в догонку вопрос. Вот загрузить на ESP можно утилитой. А взять оттуда файл можно? Хочется этот файл БД достать и посмотреть на компе, записалось туда что-то или нет. А то я читал на англоговорящих форумах, что при каких-то условиях файл БД может создаваться в виртуальной памяти.
 
Сверху Снизу