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

Хочу зашить экранчик Nextion при помощи ESP8266WebServer

capsolo

New member
Добрый день коллеги!
У меня есть веб страничка на ESP, которая содержит форму отправки файла.
Мне необходимо побить этот файл по 4 килобайта и засунуть в серийник, к которому подключен экранчик Nextion. Вариант скачать файл целиком, к примеру, в SPIFFS, а потом присунуть в экранчик - не подходит. Файл прошивки слишком жирный. Надо читать файл и писать его в серийник "на лету", управляя передачей файла со стороны ЕСП. Вот такая у меня красивая фиолетовая страничка:

Код:
html_header= "<!DOCTYPE html><html lang='ru'><head><meta http-equiv='Content-Type' content='text/html; charset=UTF-8'/><meta name='viewport' content='width=device-width, initial-scale=1, maximum-scale=1.0 user-scalable=no'/><meta http-equiv='X-UA-Compatible' content='IE=edge'/><meta name='msapplication-tap-highlight' content='no'/><meta name='theme-color' content='#5c6bc0'/><title>Home</title><style>body {background-color:#5c6bc0; color:#ffffff; text-shadow: 0px 2px 6px rgba(0,0,0,0.4); font-family: Sans-Serif, Arial, Helvetica;}</style></head>";
serverIndex = "<form method='POST' action='/update' enctype='multipart/form-data'><input type='file' name='update'><input type='submit' value='Обновить контроллер'></form><br>"
"<form method='POST' action='/updateHMI' enctype='multipart/form-data'><input type='file' name='updatehmi'><input type='submit' value='Обновить экран'></form><br>"
"<form method='POST' action='/wifisettings'enctype='application/x-www-form-urlencoded'>"
"SSID:       <input type='text' name='ssid' value='"+station_ssid+"'><br>"
"Пароль:<input type='password' name='password' value='"+station_psk+"'><br><br>"
"<input type='submit' value='Применить'><br>"
"</form>";
А вот такой обработчик дергания за ссылку /updateHMI
Код:
 void updatehmi(void)
{
  HTTPUpload& hmiupload = httpserver.upload();
  int len = hmiupload.totalSize;
  FileSize = len;
  //SendToTelnet("Contacting Nextion...");
  //SendToTelnet((String)FileSize);
  int Parts = (len/4096) + 1;
  int c;
  uint8_t buff[128] = {};
   if (hmiupload.status == UPLOAD_FILE_START) {
        Serial.flush();
        //SendToTelnet("Contacting Nextion...");
        Serial.printf("%sconnect%s", ter, ter );
        //delay(500);
        Serial.printf("whmi-wri %u,9600,0",FileSize); //whmi-wri 666,9600,0
        Serial.write(ter,3);
        //delay(500);
        ackString = "";
   } else if (hmiupload.status == UPLOAD_FILE_WRITE) {
          //SendToTelnet("Starting Download...\n");
          while((len > 0 || len == -1)) {
                            // get available data size
                            size_t sizehmi = hmiupload.currentSize;
                            //SendToTelnet((String)sizehmi);
                            if(sizehmi) {
                                // read up to 128 byte
                                //int c = stream->readBytes(buff, ((size > sizeof(buff)) ? sizeof(buff) : size));
                                // write it to Serial
                                c=hmiupload.currentSize;
                                count += hmiupload.currentSize;
                                Serial.write(hmiupload.buf, hmiupload.currentSize);
                                                       
                                if (count == 4096) {
                                  partNum ++;
                                  total += count;
                                  pCent = (total * 100) / FileSize;
                                  count = 0;
                                  delay (250);
                                  SendToTelnet("Part: %u Bytes: %u Progress %u%%\n");
                                  SendToTelnet(partNum+"\n");
                                  SendToTelnet(total+"\n");
                                  SendToTelnet(pCent+"\n");                        
                                }
                                if(len > 0) {
                                    len -= c;
                                }
                            }
                            delay(1);
                        }
                        partNum ++;
                        delay (250);
                        total += count;
                        //SendToTelnet("Last Part: %d Total Bytes: %d Progress 100%%\n\n");
                        //SendToTelnet(partNum+"\n");
                        //SendToTelnet(total+"\n");
                        //SendToTelnet("Size request: %d\n\n");
   } else if (hmiupload.status == UPLOAD_FILE_END) {
                        SendToTelnet((String)FileSize);
                        if (total == FileSize) SendToTelnet("Server Byte count is Good !\n\n");
                else SendToTelnet("Oh no, somethin' went wrong :(\n\n");               
                SendToTelnet("[HTTP] connection closed or file end.\n\n");
 
}
}
Не робит, зараза! спотыкаюсь на самом начале, когда хочу узнать размер файла. Он начинает расти вместе с закачкой, а мне его надо знать сразу. Ну и похоже браузер хочет мне весь файл целиком в память впихнуть, на что ЕСПшке становится очень очень плохо.....

Что делать, куда копать?
В качестве альтернативы я поднял телнет мост к порту экранчика, думаю теперь при помощи какой технологии с веб странички впихнуть прошивку хотя бы в телнетовский порт...
 

capsolo

New member
Экранчик сам не может. На ESP вебсервер крутится с формой пост запроса. У меня не получается корректно обработать пост запрос, чтобы узнать размер предлагаемого клиентом файла и по 4к залить в серийник экранчика.
 
Сверху Снизу