Arduino Mega Server

Модератор: Alex

serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server

Сообщение serghei » Вт апр 28, 2020 11:14 pm

Нет , не накладываются. Так исторически получилось , что логирование и графики на одной странице. Просто разрабатывали одновременно и параллельно )) По уму эту страницу надо разделить на две.
Так библа amcharts и так локально лежит. Быстрее не получится обработать. Может , конечно , и новее есть. Три года всё таки прошло.
Кстати , если гафкнуть на название графика на странице - он исчезнет. Вот с полосой прокрутки глюк вышел - там картинка лежит во вложенной папке , а АМС я так и не научил работать с новой библиотекой SD/ карты. Хотя ser009 вроде бы её заменил на новую.

Сам дистрибутив АМС - по сути это и есть движек для рисования сайтов. 98 % кода только этим и занимается.

Далласы работают на всех платформах - и библиотека тут ни причём. Просто надо их ID правильно вписать в код - в сериале при старте они видны.

С библиотекой для FTP не понятный глюк - Отдельно на ESP32 работает прекрасно. Скорость приличная. 20 метров файл влетает за несколько секунд. А вот в составе сервера не хочет работать. Как только устанавливаю соединение - сервер сбрасывается. Почему - я не знаю. Это Егорку пытать надо.

К тому же сейчас заливка файлов по воздуху нативно работает очень шустро. ( на есп32 ))
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Smeech
Сообщения: 12
Зарегистрирован: Сб мар 21, 2020 9:28 am
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Smeech » Ср апр 29, 2020 12:15 am

Все получилось, графики увидел, архив сообщений тоже. Даже свой лог сегодняшний подредактировал под нужный формат, подсунул, увидел отрисованные графики. Благодарствую ))
serghei писал(а):
Вт апр 28, 2020 11:14 pm
Нет , не накладываются. Так исторически получилось , что логирование и графики на одной странице. Просто разрабатывали одновременно и параллельно )) По уму эту страницу надо разделить на две.
Так библа amcharts и так локально лежит. Быстрее не получится обработать. Может , конечно , и новее есть. Три года всё таки прошло.
Там сейчас красота ваще... Последняя версия текущая, amCharts 4, такое позволяет рисовать и так круто выглядит, прям руки чешутся.. ;)
serghei писал(а):
Вт апр 28, 2020 11:14 pm

Вот с полосой прокрутки глюк вышел - там картинка лежит во вложенной папке , а АМС я так и не научил работать с новой библиотекой SD/ карты. Хотя ser009 вроде бы её заменил на новую.
Угу, обратил внимание. Еще и картинка какая-то необычная, *.svg расширение, первый раз такое вижу.
serghei писал(а):
Вт апр 28, 2020 11:14 pm
Далласы работают на всех платформах - и библиотека тут ни причём. Просто надо их ID правильно вписать в код - в сериале при старте они видны.
Ну не знаю.. Вроде обращался по адресам, помню что в момент инициализации они находились, и на этом все заканчивалось. Установка разрешения уже не работала, и дальше по ходу работы АМС стабильно -127 выдавали показания.
serghei писал(а):
Вт апр 28, 2020 11:14 pm
К тому же сейчас заливка файлов по воздуху нативно работает очень шустро. ( на есп32 ))
Это же или сама прошивка, или файлы в SPIFFS. А если на SD карту надо?
eGorka
Сообщения: 182
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 5 раз
Поблагодарили: 25 раз

Re: Arduino Mega Server

Сообщение eGorka » Ср апр 29, 2020 6:52 am

Smeech писал(а):
Ср апр 29, 2020 12:15 am
А если на SD карту надо?
ESP8266
SD --> libraries/ESP8266WebServer/examples/SDWebServer
Прошивка --> libraries/ESP8266WebServer/examples/WebUpdate
SPIFFS --> libraries/ESP8266WebServer/examples/FSBrowser

ESP32
SD --> libraries/WebServer/examples/SDWebServer
Прошивка --> libraries/WebServer/examples/WebUpdate
SPIFFS --> libraries/WebServer/examples/FSBrowser
serghei писал(а):
Вт апр 28, 2020 11:14 pm
К тому же сейчас заливка файлов по воздуху нативно работает очень шустро. ( на есп32 ))
Очень шустро!?, да ладно, для сравнения.
СпойлерПоказать

Код: Выделить всё

19:53:28.248 -> *** Test upload WebServer.h ***
19:53:28.248 -> Upload Start: update_test_ESP32.ino.esp32.bin
19:53:39.855 -> SDK: v3.3.1-61-g367c3c09c
19:53:39.855 -> Time UPLOAD: 11.62 sec.
19:53:39.855 -> Speed UPLOAD: 536.85 Kbit/s
19:53:39.855 -> Upload Success: 798768 bytes
19:53:39.855 -> 
19:54:03.161 -> *** Test upload ESPAsyncWebServer.h ***
19:54:03.161 -> Upload Start: update_test_ESP32.ino.esp32.bin
19:54:04.050 -> SDK: v3.3.1-61-g367c3c09c
19:54:04.050 -> Time UPLOAD: 0.92 sec.
19:54:04.050 -> Speed UPLOAD: 6775.65 Kbit/s
19:54:04.050 -> Upload Success: 798768 bytes
update_test_ESP32.7z
(627.09 КБ) 202 скачивания
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server

Сообщение serghei » Ср апр 29, 2020 10:47 pm

ace.js.gz
(96.62 КБ) 221 скачивание
Smeech писал(а):
Ср апр 29, 2020 12:15 am
Это же или сама прошивка, или файлы в SPIFFS. А если на SD карту надо?
Заливать по воздуху можно как саму прошивку , так и файлы. К тому же файлы можно редактировать прямо в браузере. Но осторожно! , после такого редактирования не будет файла в исходнике!
Для ESP32 c SD картой забрось на карту 5 файлов именно АРХИВАМИ!
ace.js.gz
(96.62 КБ) 221 скачивание
mode-css.js.gz
(5.96 КБ) 225 скачиваний
mode-html.js.gz
(16.64 КБ) 203 скачивания
mode-javascript.js.gz
(6.17 КБ) 230 скачиваний
Так же страницу edit.htm с заменой старой
edit.zip
(6.05 КБ) 241 скачивание
Так же сам код в ЕСП32 с картой

Код: Выделить всё

/*
  Modul HTTP
  part of Arduino Mega Server project

*/
#ifdef HTTP_FEATURE

#include "WebServer.h"
#include "Update.h"

#define HTTP_PORT 8080
WebServer HTTP(HTTP_PORT);

File fsUploadFile;

String getContentType(String filename){
  if(HTTP.hasArg("download")) return "application/octet-stream";
  else if(filename.endsWith(".htm")) return "text/html";
  else if(filename.endsWith(".html")) return "text/html";

  else if(filename.endsWith(".css")) return "text/css";
  else if(filename.endsWith(".csv")) return "text/plain";
  else if(filename.endsWith(".cfg")) return "text/plain";
  else if(filename.endsWith(".js")) return "application/javascript";
  else if(filename.endsWith(".png")) return "image/png";
  else if(filename.endsWith(".gif")) return "image/gif";
  else if(filename.endsWith(".jpg")) return "image/jpeg";
  else if(filename.endsWith(".ico")) return "image/x-icon";
  else if(filename.endsWith(".xml")) return "text/xml";
  else if(filename.endsWith(".pdf")) return "application/x-pdf";
  else if(filename.endsWith(".zip")) return "application/x-zip";
  else if(filename.endsWith(".gz")) return "application/x-gzip";
  return "text/plain";
}

bool handleFileRead(String path){
  Serial.println("handleFileRead: " + path);
  if(path.endsWith("/")) path += "index.htm";
  String contentType = getContentType(path);
  String pathWithGz = path + ".gz";
  if(SD.exists(pathWithGz) || SD.exists(path)){
    if(SD.exists(pathWithGz)) 
      path += ".gz";
    File file = SD.open(path, "r");
    HTTP.streamFile(file, contentType);
    file.close();
    return true;
  }
  return false;
}

void handleFileUpload() {
  if(HTTP.uri() != "/edit") return;
  HTTPUpload& upload = HTTP.upload();
  if(upload.status == UPLOAD_FILE_START){
    String filename = upload.filename;
    if(!filename.startsWith("/")) filename = "/"+filename;
    fsUploadFile = SD.open(filename, "w");
    filename = String();
  } else if(upload.status == UPLOAD_FILE_WRITE){
    if(fsUploadFile)
      fsUploadFile.write(upload.buf, upload.currentSize);
  } else if(upload.status == UPLOAD_FILE_END){
    if(fsUploadFile)
      fsUploadFile.close();
  }
} // handleFileUpload()

void handleFileDelete() {
  if(HTTP.args() == 0) return HTTP.send(500, "text/plain", "BAD ARGS");
  String path = HTTP.arg(0);
  if(path == "/")
    return HTTP.send(500, "text/plain", "BAD PATH");
  if(!SD.exists(path))
    return HTTP.send(404, "text/plain", "FileNotFound");
  SD.remove(path);
  HTTP.send(200, "text/plain", "");
  path = String();
} // handleFileDelete()

void handleFileCreate() {
  if(HTTP.args() == 0)
    return HTTP.send(500, "text/plain", "BAD ARGS");
  String path = HTTP.arg(0);
  if(path == "/")
    return HTTP.send(500, "text/plain", "BAD PATH");
  if(SD.exists(path))
    return HTTP.send(500, "text/plain", "FILE EXISTS");
  File file = SD.open(path, "w");
  if(file)
    file.close();
  else
    return HTTP.send(500, "text/plain", "CREATE FAILED");
  HTTP.send(200, "text/plain", "");
  path = String();
} // handleFileCreate();

void handleFileList() {
  if(!HTTP.hasArg("dir")) {HTTP.send(500, "text/plain", "BAD ARGS"); return;}
  String path = HTTP.arg("dir");
  if(path != "/" && !SD.exists((char *)path.c_str())) {HTTP.send(500, "text/plain", "BAD PATH"); return;}
  File dir = SD.open((char *)path.c_str());
  path = String();
  if(!dir.isDirectory()){
    dir.close();
    HTTP.send(500, "text/plain", "BAD DIR");
    return;
  }
  dir.rewindDirectory();
  HTTP.setContentLength(CONTENT_LENGTH_UNKNOWN);
  HTTP.send(200, "text/json", "");

  HTTP.sendContent("[");
  for (int cnt = 0; true; ++cnt) {
    File entry = dir.openNextFile();
    if (!entry)
    break;

    String output;
    if (cnt > 0)
    output = ',';
    output += "{\"type\":\"";
    output += (entry.isDirectory()) ? "dir" : "file";
    output += "\",\"name\":\"";
    output += String(entry.name()).substring(1);
    output += "\"";
    output += "}";
    HTTP.sendContent(output);
    entry.close();
    Serial.println(output);//============== вывод в сериал
 }
 HTTP.sendContent("]");
 dir.close();
} // handleFileList()

String Fail = "<!DOCTYPE html><html><head><meta http-equiv='Content-type' content='text/html; charset=utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'></head><style>body{background:#FFA07A;}</style><body><h3>Firmware update:</h3><h2>&emsp;&ensp;FAIL</h2><h3>&ensp;&ensp;Restart ESP</h3></body></html>";

String Ok = "<!DOCTYPE html><html><head><meta http-equiv='Content-type' content='text/html; charset=utf-8'><meta name='viewport' content='width=device-width, initial-scale=1'><meta http-equiv='refresh' content='15;update.htm'></head><style>body{background:#E0EEE0;}</style><body><h3>Firmware update:</h3><h2>&emsp;&ensp;OK!</h2></body></html>";

void updateInit() {
  HTTP.on("/update", HTTP_POST, [](){
  HTTP.sendHeader("Connection", "close");
  HTTP.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK");
  ESP.restart();
  },[](){
    HTTPUpload& upload = HTTP.upload();
    if(upload.status == UPLOAD_FILE_START){
      uint32_t maxSketchSpace = 0x140000;
      if(!Update.begin(maxSketchSpace)){
        Update.printError(Serial);
      }
    } else if(upload.status == UPLOAD_FILE_WRITE){
      if(Update.write(upload.buf, upload.currentSize) != upload.currentSize){
        Update.printError(Serial);
      }
    } else if(upload.status == UPLOAD_FILE_END){
      if(Update.end(true)){
        Serial.printf("Update Success: %u B\nDownload time: %d sec.\nRebooting...\n", upload.totalSize);
      } else {
        Update.printError(Serial);
      }
    }
    yield();
  });
} // updateInit()

void initHttp() {
  HTTP.on("/list", HTTP_GET, handleFileList);
  HTTP.on("/edit", HTTP_GET, []() { if (!handleFileRead("edit.htm")) HTTP.send(404, "text/plain", "FileNotFound"); });
  HTTP.on("/edit", HTTP_PUT, handleFileCreate);
  HTTP.on("/edit", HTTP_DELETE, handleFileDelete);
  HTTP.on("/edit", HTTP_POST, []() { HTTP.send(200, "text/plain", ""); }, handleFileUpload);
  HTTP.onNotFound([]() { if (!handleFileRead(HTTP.uri())) HTTP.send(404, "text/plain", "FileNotFound"); });

  updateInit();
  HTTP.begin();
  timeStamp();
  printValue("HTTP port", String(HTTP_PORT));
  moduleHTTP = ENABLE;
  started(F("Http"), true);
} // initHttp()

void httpWork() {
  HTTP.handleClient();
}

#endif // HTTP_FEATURE 
Вызов страницы - ВАШ IP:8080/edit.htm Для заливки прошивки заменить файл
update.zip
(1.14 КБ) 212 скачиваний
Предварительно скомпилировать *.bin файл , на странице выбрать его ( он будет в папке скетча )
Для ESP32 с SPIFFS системой скетч выше )

PS / В хроме может не корректно открываться страница edit ( не будет списка файлов в левой части). Попробуй фаер фокс или оперу
Вложения
worker-html.js.gz
(48.85 КБ) 206 скачиваний
За это сообщение автора serghei поблагодарил:
Smeech (Ср апр 29, 2020 11:06 pm)
Рейтинг: 1.16%
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
Smeech
Сообщения: 12
Зарегистрирован: Сб мар 21, 2020 9:28 am
Благодарил (а): 6 раз
Поблагодарили: 0

Re: Arduino Mega Server

Сообщение Smeech » Ср апр 29, 2020 11:02 pm

SDWebServer - да, вроде как позволяет заливать файлы на флешку. Даже что-то вроде дерева файлов и текстового редактора в браузере в примере есть, правда я так до конца и не разобрался, как оно работает. Но хотелось бы все же фтп - я привык открывать файл, скажем, .htm или .jss в текстовом редакторе прямо с сервера через фтп-соединение, и с ним работать. Внес изменения, нажал кнопку сохранить, в браузере нажал кнопку перегрузить страницу - и вуаля, результат налицо.
Попутно вопрос - а почему асинхронный этот веб-сервер, ESPAsyncWebServer.h на порядок быстрее? Просто в силу особенностей кода самой библиотеки? Пробовал я тут погуглить на счет связи двух и более есп32 по http, и в первой же статье наткнулся именно на пример с этой асинхронной библиотекой.
Попутно еще вопрос - а есть на примете пример реализации связи двух и более есп32 по http? Глянул мельком на примеры в MySensors, там есть все что угодно, кажись, но не вайфай и хттп. Может не особо внимательно смотрел, конечно, боюсь увлекшись далеко в сторону забрести.. :)
serghei
Сообщения: 2575
Зарегистрирован: Пт ноя 06, 2015 10:22 am
Откуда: Кишинёв
Благодарил (а): 303 раза
Поблагодарили: 282 раза

Re: Arduino Mega Server

Сообщение serghei » Ср апр 29, 2020 11:36 pm

Сумбурно , но по порядку.
Когда то , когда небо было синее и трава зеленее Alexsis_76 показывал тут на форуме весь вред HTTP реквеста - пакеты размером 118 байт имеют полезную нагрузку 1 байт. То есть чтобы загрузить страницу в 1 кило надо прокачать 118 кило по сети. Это особенность протокола. Подробности надо спрашивать у него. Как костыль - в каком то коде встречал такую реализацию - сначала набиваем буфер в 60 байт и затем его передаём.

По FTP я уже говорил - взял первую попавшуюся библу с гита , залил и всё заработало. НО в составе АМС нет.

По поводу связи двух ЕСП. На форуме есть пример реализации Тут. Но если честно - у меня не получилось с ним разобраться.

Если есть MQTT брокер , то можно связать любое количество ЕСР . писать сценарии прямо в браузере и видеть результат в приложении. Реализация в телеге https://t.me/esp_zigbee

MySensors - это отдельная песня. Главный смысл - собрать данные с кучи ардуин на радио модулях и куда нибудь отправить. там есть и ESP8266 и 32 . HTTP там нет .
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
eGorka
Сообщения: 182
Зарегистрирован: Чт ноя 24, 2016 10:47 am
Благодарил (а): 5 раз
Поблагодарили: 25 раз

Re: Arduino Mega Server

Сообщение eGorka » Чт апр 30, 2020 6:42 am

Smeech писал(а):
Ср апр 29, 2020 11:02 pm
Попутно вопрос - а почему асинхронный этот веб-сервер, ESPAsyncWebServer.h на порядок быстрее?
ESPAsyncWebServer писал человек знающий протоколы обмена на уровне разработчика, и кстати благодаря ему же WebServer начал загружать файлы на адекватной скорости.
alexsis_76
Сообщения: 791
Зарегистрирован: Пт янв 22, 2016 10:08 am
Благодарил (а): 6 раз
Поблагодарили: 63 раза

Re: Arduino Mega Server

Сообщение alexsis_76 » Чт апр 30, 2020 10:49 am

Добрый день друзья!!!
Очень рад услышать голоса идущих вперед последователей славной АМС )))
Когда то , когда небо было синее и трава зеленее Alexsis_76 показывал тут на форуме весь вред HTTP реквеста - пакеты размером 118 байт имеют полезную нагрузку 1 байт. То есть чтобы загрузить страницу в 1 кило надо прокачать 118 кило по сети. Это особенность протокола
Это не особенности протокола, это написанный кем то и повторенный последователями корявый код))). Что бы увеличить эффективность передачи нужно набить буфер пакета максимально возможным количеством данных.

Как костыль - в каком то коде встречал такую реализацию - сначала набиваем буфер в 60 байт и затем его передаём.
Это не костыль, просто у меги очень сильно мало оперативной памяти, так что это скорее компромисс))).

Попутно еще вопрос - а есть на примете пример реализации связи двух и более есп32 по http?
Примеры можно черпать из практически неограниченного источника- Интернета и папки Ардуино с примерами, смысл в том что в контексте сетевого взаимодействия существует два субъекта- Клиент и Сервер. Cервер это тот кто слушает порт и может отвечать на входящие соединения, в сети играет пассивную роль. Клиент- более интересная реализация, выступает инициатором соединения(передает запросы).
Например браузер будет клиентом, ардуина тоже может быть клиентом и отправлять запросы вида GET/script?val1=value&val2=value, есть класс
HTTPClient собсвенно им и надо воспользоваться, примеры там-же.
Вот в принципе все вводные данные что бы построить модель Клиент-Сервер
Аватара пользователя
Coolblaster
Сообщения: 12
Зарегистрирован: Вс июн 07, 2020 9:26 am
Благодарил (а): 14 раз
Поблагодарили: 5 раз

Re: Arduino Mega Server

Сообщение Coolblaster » Вт июн 09, 2020 10:36 pm

Всем привет!!!
Осилил таки все 324 страницы за 3 дня. Хочу сказать огромное СПАСИБО Alex и всем кто принимал участие в данном проекте.

Я так понимаю что до полноценной версии 1.0 (если до нее дойдет) пройдет еще много времени, но то что уже сделано достойно уважения.

От себя отмечу установил всё "с коробки", поменял IP, часовой пояс, подключил самодельный шилд с DS3231 и nRF24 на борту рядом с Ethernet шилдом. Работает Processing, файлы заливаются нормально. AMS контроллер на nano с nRF24 и далласами на борту заработал после правки переменной и обнулением EEPROM. Посносил кучу не нужных мне модулей, расширил стандартную диагностику портов почти на максимум (для личных нужд).

Все бы ничего, но судя по форуму, велась работа по изменению и улучшению кода самого AMS, но остановилась из-за коммерческой составляющей как я понял, возможно ошибаюсь. Понимаю Алекса, времени потрачено колоссально много и оно должно быть оплачено. Правда не понимаю почему весь код совсем без комментарий. Было бы больше пользы, меньше вопросов как оно работает как для "новичков" так и гуру и удобство поиска по комментариям. А так приходится весь код для себя комментировать.

На сайте http://startingelectronics.org/tutorial ... -tutorial/ написана крутая инструкция, на основе которой был реализован AMS, и я еще лет 6 назад остановил свой выбор на связке MEGA + ETHERNET для реализации сервера "умного дома" по той инструкции. Скажу только что этот сервер работал у меня как часы!!! Но чтобы так заморочиться и сделать полноценный сайт с кучей нужных, продуманных функций у меня просто не было времени.

За прошедшие несколько лет, научился читать и писать код в IDE.
Сейчас наконец взялся за дело и меня радует, что начинаю уже не с нуля!!!
Аватара пользователя
nick7zmail
Сообщения: 7573
Зарегистрирован: Пн окт 28, 2013 8:14 am
Откуда: Екатеринбург
Благодарил (а): 121 раз
Поблагодарили: 2010 раз

Re: Arduino Mega Server

Сообщение nick7zmail » Вт июн 09, 2020 11:27 pm

Ну...проект скорее не дойдёт до 1.0)) Алекса давно не видно...либо частные проекты делает, либо уже забил на эту тему)) хотя сайт его вродь по прежнему жив. А так АМС - да, действительно хороший старт для мультифункциональной системы...хотя в последнее время топлю за зигби-гейты типа sls или zesp, и активно принимаю участие, т.к. девайсы промышленного качества в свободной продаже, придумывать ничего не надо, покупай да подключай...

Отправлено с моего Xperia XZ1 Compact через Tapatalk

Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
:arrow: Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Ответить