
Arduino Mega Server
Модератор: Alex
-
- Сообщения: 792
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза
Re: Arduino Mega Server
Посмотрел сегодня коды AMS честно говоря немного не по себе, вот от чего, сначала открываем 2 сокета, затем браузер спрашивает GET и начинается куча пакетов размером 1 байт полезной нагрузки передается по одному символу, т е первый пакет H второй T третий T и т д,представляете да, блин в шоке, затем начинают грузится картинки, вместо того чтобы грузить сразу по сектору в 512 байт , грузим по 128, надо что то делать 

-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Arduino Mega Server
Ни одного слова не понял. Постарайтесь сформулировать попонятнее — тема актуальная и интересны все дельные предложения по ускорению сетевой работы.Посмотрел сегодня коды AMS честно говоря немного не по себе, вот от чего, сначала открываем 2 сокета, затем браузер спрашивает GET и начинается куча пакетов размером 1 байт полезной нагрузки передается по одному символу, т е первый пакет H второй T третий T и т д,представляете да, блин в шоке, затем начинают грузится картинки, вместо того чтобы грузить сразу по сектору в 512 байт , грузим по 128, надо что то делать
-
- Сообщения: 792
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза
Re: Arduino Mega Server
Alex вот сдесь
и ниже начинается самое интересное, в самом верху пакет размером 118 байт, это я уже переделал и ниже видите пакеты от 192,168,1,37 длинной 60 байт перемежаются с ACK пакетами от 192,168,1,100 в углу можете посмотреть содержимое пакета , как видите полезная нагрузка равна всего 1 байт , загрузите варезшарк все увидите, собственно так по байту они и передаются , ниже картинки по 128 байт
так делают эти функции
cl.print("<"); cl.print(tagBase); cl.print(tagCount); cl.print(">");
передают в сокет байт за байтом
если из заменить на эти
файл server_ajax в архиве, там все увидите.
Да функции в таком виде малопригодны для использования,жрут много памяти,одна и та же строка хранится в контроллере аж в трех местах, строку можно спрятать за PGM, освободив кучку оперативки.
это сетевой сканер видите в самом верху пакеты SYN это браузер открывает 2 потока оба они хотят соединится с портом 80 по исходящим портам 4415 и 4416. затем ниже строка GET/HTTP, это запрос от браузераи ниже начинается самое интересное, в самом верху пакет размером 118 байт, это я уже переделал и ниже видите пакеты от 192,168,1,37 длинной 60 байт перемежаются с ACK пакетами от 192,168,1,100 в углу можете посмотреть содержимое пакета , как видите полезная нагрузка равна всего 1 байт , загрузите варезшарк все увидите, собственно так по байту они и передаются , ниже картинки по 128 байт
так делают эти функции
cl.print("<"); cl.print(tagBase); cl.print(tagCount); cl.print(">");
передают в сокет байт за байтом
если из заменить на эти
то получим пакет длинной 118 байтов.void sendHtmlAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n"));}
void sendCssAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: text/css\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: text/css\r\nConnnection: close\r\n\r\n"));}
void sendJsAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: application/javascript\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: application/javascript\r\nConnnection: close\r\n\r\n"));}
void sendImgAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: image/png\r\nConnnection: close\r\n\r\n"));}
void sendXmlAnswer(EthernetClient cl)
{cl.write("HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\nConnnection: close\r\n\r\n",strlen("HTTP/1.1 200 OK\r\nContent-Type: text/xml\r\nConnnection: close\r\n\r\n"));}
файл server_ajax в архиве, там все увидите.
Да функции в таком виде малопригодны для использования,жрут много памяти,одна и та же строка хранится в контроллере аж в трех местах, строку можно спрятать за PGM, освободив кучку оперативки.
- Вложения
-
- server_ajax.rar
- (4.2 КБ) 193 скачивания
-
- Сообщения: 792
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза
Re: Arduino Mega Server
Нашел еще одну бяку, ту самую,завтра исправлю, поставил размер пакета картинок 512 картинки стали грузится повеселее.
-
- Сообщения: 792
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза
Re: Arduino Mega Server
подредактировал код получилось так
я думаю вполне хороше для контроллера с 16 мгц,код можно еще перетрясти для оптимизации, попрятать глобальные буфера и строки, а так же убрать cl.print.- За это сообщение автора alexsis_76 поблагодарил:
- nick7zmail (Чт апр 21, 2016 11:20 am)
- Рейтинг: 1.16%
-
- Сообщения: 2357
- Зарегистрирован: Пт апр 20, 2012 12:53 pm
- Благодарил (а): 42 раза
- Поблагодарили: 262 раза
Re: Arduino Mega Server
Поскольку вы создаёте полезные решения, то предлагаю оформлять их как можно подробнее и каждое по отдельности с описанием, иначе ни я, ни кто другой не смогут ими воспользоваться.
Например, «ускорение загрузки картинок»
Делаем 1...
Делаем 2...
Делаем 3...
«Избавление от cl.print»
Делаем 1...
Делаем 2...
Делаем 3...
И так далее...
Например, «ускорение загрузки картинок»
Делаем 1...
Делаем 2...
Делаем 3...
«Избавление от cl.print»
Делаем 1...
Делаем 2...
Делаем 3...
И так далее...
- nick7zmail
- Сообщения: 7573
- Зарегистрирован: Пн окт 28, 2013 8:14 am
- Откуда: Екатеринбург
- Благодарил (а): 121 раз
- Поблагодарили: 2010 раз
Re: Arduino Mega Server
Согласен с Алексом...выложите пожалуйста ваши оптимизации...думаю неплохо бы их было включить в релиз амс 0.15...тут, наверное, все за ускорение работы)
Отправлено с моего Xperia Z через Tapatalk
Отправлено с моего Xperia Z через Tapatalk
Raspberry Pi3+Broadlink+esp8266 (blynk)+AMS
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".
Услуги в профиле коннект
>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
Если вам помогло какое-либо сообщение - не забывайте пользоваться кнопкой "СПАСИБО".

>>>>>Мой новый канал на ютутбе, подписывайтесь!<<<<<
-
- Сообщения: 792
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза
Re: Arduino Mega Server
Давайте.
Насчет мелких пакетов , которые по 54 байта на рисунке с сетевого сканера, когда с браузера приходит запрос GET/HTTP amc начинает отдавать ответ, первой следует строка
Насчет мелких пакетов , которые по 54 байта на рисунке с сетевого сканера, когда с браузера приходит запрос GET/HTTP amc начинает отдавать ответ, первой следует строка
сейчас это делается с помощью cl.print, которая передает в канал сообщение побайтно, в результате возникает куча пакетов с полезной нагрузкой 1 байт, с учетом всех заголовков 54 байта, в результате в первом пакете передается первый H,второй T, третий T, четвертый P и т д, на картинке в углу фрагмент такого пакета , внизу надпись TCP SEGMENT DATA (1byte), сделаем так, заодно освобождаем оперативную память от находящейся там строки, дело в том что при данном способе строки хранятся в контроллере в двух экземплярах, сначала строка при прошивке вкомпиливается во флеш память (та которая 256 кб), затем, при запуске бодро копируются в оперативку и висят там до выключения питания, короче говоря место занимают, делаем такHTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n
строка перемещается в память программ(можете проверить), но обычным путем ее оттуда уже не добыть, поэтому описана функцияPSTR("HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnnection: close\r\n\r\n" )
которая может скопировать за раз 512 байт из памяти программ в память данных и передать одним пакетом, в результате получаем пакет длинной 118 байтов где помещается весь ответ, не пугайтесь сильно такого большого значения 512(можно и поменьше), это конечно налагает некоторые ограничения, этот буфер существует только в функции void write_p,создается в момент входа в функцию в стеке и уничтожается при выходе, это необходимо иметь ввиду оставляя необходимое количество свободной памяти иначе не будет работать, учитывая что таких моментов там много , можно наскрести наверное около килобайта бесхозной памяти.в архиве файл которого коснулись данные правки,попозже будет остальное.void write_p(const char *progmem_s,EthernetClient cl){
char c;
char Buf[512];
uint8_t Count=0;
while ((c = pgm_read_byte_near(progmem_s++))) {
Buf[Count]=c;
Count++;
}
cl.write(Buf,Count);
}
- Вложения
-
- server_ajax.rar
- (5.27 КБ) 198 скачиваний
- За это сообщение автора alexsis_76 поблагодарил:
- ipz (Сб май 28, 2016 3:54 pm)
- Рейтинг: 1.16%
-
- Сообщения: 2575
- Зарегистрирован: Пт ноя 06, 2015 10:22 am
- Откуда: Кишинёв
- Благодарил (а): 303 раза
- Поблагодарили: 282 раза
Re: Arduino Mega Server
Попробовал оптимизатор в деле и сразу уперся в две очень неприятные вещи-
1. Так-как скорость выросла до 250 000 в стандартный сериал выводится каша(максимум 115 000). То что АМС работает
вижу только по экрану.
2.Ввиду увеличения буфера обмена в IDE до 1 килобайта у Меги не остается памяти для работы.
Если отключить главный пожиратель оперативы модуль электро-останется 3 килобайта-работать
можно,но мерить температуру такой ценой?
3. У дуи проблем с оперативой нет,но мне пока не удалось добиться заливки файлов.
Выводы. Прога отличная, но надо очень подробную инструкцию по инсталяции и изменений всех файлов!
1. Так-как скорость выросла до 250 000 в стандартный сериал выводится каша(максимум 115 000). То что АМС работает
вижу только по экрану.
2.Ввиду увеличения буфера обмена в IDE до 1 килобайта у Меги не остается памяти для работы.
Если отключить главный пожиратель оперативы модуль электро-останется 3 килобайта-работать
можно,но мерить температуру такой ценой?
3. У дуи проблем с оперативой нет,но мне пока не удалось добиться заливки файлов.
Выводы. Прога отличная, но надо очень подробную инструкцию по инсталяции и изменений всех файлов!
AMS : ESP32 + NRF24 + 1Wire-I2C мост DS2482 + счетчик DS2423 + сеть MySensors + редактирование страниц в браузере + Upload по воздуху + SPIFFS
-
- Сообщения: 792
- Зарегистрирован: Пт янв 22, 2016 10:08 am
- Благодарил (а): 6 раз
- Поблагодарили: 63 раза