Начало работы с Termite
В оригинальной статье о прошивке ESP8266 была рекомендована PuTTY; и, если она у вас она есть, и вы хотите её использовать, она здесь будет отлично работать. Тем не менее, Termite в этом плане более удобное приложение и будет использоваться далее в этой статье. Termite бесплатен и для личного, и для коммерческого использования.
В последующих этапах предполагается, что модуль ESP-01 запрограммирован так же, как обычно, поставщиком. Если вы (или кто-то еще) внесли изменения в стандартные настройки программы, вам необходимо будет поэкспериментировать, чтобы определить текущие настройки вашего модуля ESP-01.
После проверки своей схемы программирования ESP-01, как описано выше, включите её. Запустите на своем компьютере Termite и нажмите кнопку Settings (Настройки); вы должны увидеть окно, похожее на приведенное ниже. Убедитесь, что COM порт, к которому подключен USB-TTL конвертер, правильно выбран в окне настроек последовательного порта. Выставьте все остальные параметры, как показано в окне настроек последовательного порта ниже, и нажмите OK, чтобы закрыть окно настроек последовательного порта.
Настройки последовательного порта
На этом этапе курсор должен мигать в нижней части окна Termite; если нет, кликните на нижней части окна Termite, чтобы поместить туда курсор. Введите и нажмите Enter на клавиатуре; если всё хорошо, ESP-01 ответит в окне Termite. Если это произойдет, можете вздохнуть с облегчением, потому что вы только что преодолели главное препятствие.
Затем введите и нажмите Enter. ESP-01 должен ответить чем-то очень похожим, что показано на рисунке ниже.
Отклик модуля ESP-01
Команда говорит ESP8266 сообщить о версии набора AT-команд, который он содержит, какой SDK (Software Development Kit) был загружен в него, какая компания собрала модуль ESP, и когда SDK был загружен в модуль. Наконец, как обычно, ESP8266 завершает свой ответ с помощью .
Если ESP-01 ответил правильно, то можно закончить с Termite (если вы не хотите еще поэкспериментировать). Далее он понадобится снова для подтверждения успешной прошивки.
Шаг 3. Загрузите новый скетч «по воздуху»
А теперь давайте загрузим новый скетч по воздуху, т.е. через Wi-Fi.
Помните! Вам нужно добавлять код для OTA в каждый загружаемый вами скетч. В противном случае вы потеряете возможность прошивки через OTA и не сможете выполнять следующие загрузки через беспроводную сеть. Поэтому рекомендуется изменять приведенный выше код, включая в него ваш новый код.
В качестве примера мы включим простой скетч Blink в код BasicOTA. Не забудьте изменить переменные SSID и пароля на учетные данные вашей сети.
Изменения в программе BasicOTA выделены номерами строк.
В приведенной выше программе мы не использовали для мигания светодиода, потому что ESP8266 во время приостанавливает программу. Если следующий запрос OTA будет сгенерирован, когда ESP8266 приостановлен в ожидании прохождения задержки , ваша программа пропустит этот запрос.
Как только вы скопируете приведенный выше скетч в Arduino IDE, выберите Инструменты → Порт, и вы должны увидеть что-то вроде этого: esp8266-xxxxxx at ip_адрес_вашего_esp. Если подобного не будет, возможно, вам придется перезапустить IDE.
Рисунок 6 – Выберите порт OTA в Arduino IDE
Выберите порт и нажмите кнопку «Загрузить». Через несколько секунд новый скетч будет загружен. И вы должны увидеть на плате мигающий светодиод.
Рисунок 7 – Рабта тестового скетча Blink на ESP8266 NodeMCU
ESP-07
Особенности этого модуля — керамическая антенна и разъем для внешней антенны, металлический экран.
Подключение к IoT
Аппаратная часть
Работа с этим модулем, к сожалению, прошла не слишком гладко. Ни один из возможных вариантов подключения не сработал, и я, уже отчаявшись, решила удалять его описание из статьи. Но тут мне дали новый модуль и сказали попробовать еще раз — о чудо, он заработал с первого раза! В чем было дело и как сломался первый модуль, который я мучила, — неизвестно, но скорее всего он был убит нещадной статикой. Мораль этого лирического отступления такова — если у вас что-то не заработало по инструкции, написанной ниже, не вините инструкцию — сначала прозвоните и проверьте все контакты, а потом попробуйте на другом модуле.
1) Собираем схему
ESP-07 |
USB-Serial |
VCC |
VCC |
CH_PD (рекомендуется через резистор) |
VCC |
TX |
RX |
RX |
TX |
GND |
GND |
GPIO 15 (рекомендуется через резистор) |
GND |
GPIO 0 — сначала не подключен, но будет использоваться для перевода в режим программирования далее, поэтому к нему уже подведен провод |
|
все остальные контакты не подключены |
RTS, CTS — не подключены |
На фото этого и следующего модуля уже можно заметить резисторы. После неведомой поломки уже решила перестраховаться и поставила килоомники, хотя и без них все должно работать.
2) Переводим в режим программирования (необходимо каждый раз выполнять перед прошивкой модуля)
2.1) Отключаем питание от модуля2.2. Подключаем пин GPIO 0 к GND
2.2) Подключаем пин GPIO 0 к GND
ESP-07 |
USB-Serial |
VCC |
VCC |
CH_PD |
VCC |
TX |
RX |
RX |
TX |
GND |
GND |
GPIO 15 |
GND |
GPIO 0 |
GND |
все остальные контакты не подключены |
RTS, CTS — не подключены |
2.3) Подключаем модуль к питанию
2.4) Железо готово, приступаем к программной части.
Программная часть
1) Выбираем плату: Tools (Инструменты) -> Board(Плата) Generic ESP8266 Module.
2) Вставляем подготовленный код.
3) Задаем данные для подключения Wi-Fi и идентификатор своего объекта на платформе.
4) Компилируем и загружаем скетч на плату.
5) Для обычной работы модуля (не для режима прошивки) пин GPIO 0 должен быть свободен, поэтому отключаем его от GND.
6) Переподключаем питание ESP-07 (например, вытаскиваем и вставляем обратно адаптер).
7) Видим появление данных на платформе.
В Китае
SD карта памяти и интерфейс
При использовании карты памяти SD (Secure Digital) с любым микроконтроллером есть два варианта режима работы: SDIO и SPI. Почти все SD карты памяти обладают многими стандартными функциями и имеют одинаковые физические и электрические характеристики. Фактическое различие между SDIO и SPI в основном на программном уровне. Подробнее об этом можно почитать в спецификации.
А пока давайте скажем, что интерфейс SDIO быстрее, но сложнее в реализации, интерфейс SPI медленнее, но проще в реализации. Поскольку большинство микроконтроллеров поддерживают SPI на аппаратном уровне мы будем использовать его.
Расположение сигнальных выводов карт памяти SD, miniSD, microSD указано на Рисунке 2.
Рисунок 2. | Расположение контактов карт памяти SD, miniSD, microSD. |
Назначение выводов карт памяти для режима SPI указано в Таблице 1.
Таблица 1. | Назначение выводов карт памяти SD, miniSD, microSD для работы в режиме SPI. |
|||||||||||||||||||
|
Постановка задачи
Я живу в частном доме под Минском, и собственный бассейн, пусть и простейший каркасный, является неотъемлемой частью того набора «бенефитов», который получают многие, живущие в загородном доме. В нашем нестабильном климате оказалось, что в бассейне купаться некомфортно, если он стоит на открытом воздухе: вода выхолаживается ночью, а ветренная погода днем не делает купание комфортным. В прошлом году я своими руками построил геодезический купол фуллера над бассейном, поставил горочку и повесил тарзанку – дети довольны.
В этом году я пошел еще дальше и решил организовать подогрев бассейна от газового котла,
который служит для отопления дома в зимний период и подогрева горячей воды в летний.
На лето «отопительный» контур котла с помощью вентилей переключается на подогрев
бассейна. Подогрев воды бассейна осуществляется с помощью титанового теплообменника, по первичному контуру которого проходит теплоноситель (горячая вода без примесей) из отопительного контура, а по вторичному – вода из бассейна, нагнетаемая насосом рециркуляции системы фильтрации. Поскольку бассейн я использую с хлоратором (много интересного по теме расписано на ForumHouse), в воде содержится немного соли и теплообменник нужен титановый. Нельзя просто так взять и пустить воду напрямую через котел – иначе все трубы разъест солью.
Проходя через теплообменник, теплоноситель, нагретый котлом, с температурой около 70-90 °C отдает тепло воде из бассейна, нагревая ее на пару градусов. Сам теплоноситель при этом остывает на пару десятков градусов, и возвращается в котел с тем, чтобы быть снова
подогретым. Соотношение остывания воды от котла с нагревом воды бассейна зависит от многих факторов: мощности теплообменника и скорости циркуляции воды в первичном и вторичных контурах.
Трубы, подведенные от бассейна к теплообменнику – обычные полиэтиленовые, те, которые
в настоящее время применяются для подвода холодной воды в частные дома. Дешевизна, способность выдержать приличное давление, отсутствие коррозии – вот основные достоинства таких труб. Для всех без исключения полиэтиленовых труб рабочая температура ограничена 40 градусами по шкале Цельсия. В принципе, для бассейна этого более чем достаточно.
Однако, существует высокая вероятность развития аварийной ситуации в случае, если насос
рециркуляции воды бассейна воды остановится по какой-либо причине, а котел будет продолжать греть теплообменник: в этом случае вода во вторичном контуре теплообменника достаточно быстро повысится до температуры первичного контура, а значит, примыкающие к теплообменнику участки полиэтиленовых труб расплавятся, а вода из бассейна затопит все пространство вокруг.
Необходимо предусмотреть возможность защиты перегрева теплообменника.
Большее количество GPIO на ESP32
ESP32 имеет большее количество GPIO чем ESP8266. Вы можете сами решать, какими выводами будут UART, I2C, SPI – для этого вам просто нужно прописать их в коде. Это возможно благодаря функции мультиплексирования микросхемы ESP32, которая позволяет назначать несколько функций одному и тому же выводу. Если вы не установите их в коде, они будут на выводах, определенных по умолчанию, как показано на следующем рисунке (это пример для платы ESP32 DEVKIT V1 DOIT — расположение выводов может меняться в зависимости от производителя).
Для сравнения приведем распиновку для комплекта ESP8266 ESP-12E NodeMCU Kit.
Загрузки для ESP8266
Вся необходимая документация и инструменты для прошивки программного обеспечения чипов ESP8266 доступны в интернете, и большая их часть находится на сайте Espressif. Для удобства читателей RadioProg большая часть из них также доступна здесь. Обязательно необходимы Flash Download Tool и Software Development Kit. Обязательно наличие не всех документов, но все они потенциально полезны. Загрузите файлы и сохраните их у себя на компьютере, чтобы выполнить прошивку ESP8266, как описано в данной статье.
Flash Download Tool v3.4.4
Версия 3.4.4 Flash Download Tool – это последняя версия, доступная от Espressif на момент подготовки данной статьи. Этот инструмент для ESP8266 почти идентичен предыдущим версиям вплоть до 2.3, за исключением того, что в пакет добавлены два новых инструмента. Один для ESP8285, второй для ESP32, ни один из которых не используется с ESP8266. Нажмите кнопку ниже, чтобы скачать v3.4.4; вы заметите, что она содержит версии для PC и Mac. В данной статье будет использоваться версия для PC.
Software Development Kit 2.0.0
На момент написания этой статьи последняя доступная версия ESP8266 Software Development Kit – версия 2.0.0, которая была выпущена в июле 2016 года. Данная версия стабильна и будет использоваться в этой статье. Она доступна для бесплатного скачивания с Espressif, но чтобы уберечь читателей от некоторых проблем, она также доступна здесь, нажав кнопку ниже.
Документация на ESP8266
Как часто говорят: «Когда уже ничего не помогло, попробуйте почитать инструкцию.». И для этого у Espressif есть впечатляющая коллекция документов, относящихся к ESP8266. Слабо сомневаюсь в том, что ответы на многие вопросы содержатся на их страницах. Автором статьи наиболее часто используются три документа: ESP8266 Quick Start Guide (version 1.3), ESP8266 SDK Getting Started Guide (version 2.7) и ESP AT Instruction Set (version 2.0.0). Три этих документа с несколькими другими включены в архив, доступный для скачивания по кнопке ниже
Обратите внимание, что дополнительные документы и более современные версии предоставленных документов могут быть доступны на сайте Espressif
Настройка ESP8266
Итак, ESP8266 модуль к USB порту мы подключили (через USB-TTL или Arduino) теперь нужно убедится, что драйвера к вашим USB-TTL или Arduino встали корректно и в системе появился новый виртуальный последовательный порт. Вам понадобится программа — терминал последовательного порта. Можете использовать любую на ваш вкус, но она должна удовлетворять следующему требованию: каждая команда, которую вы отправляете с компьютера в последовательный порт должна завершаться символами CR+LF.
Ваш покорный слуга является автором open-source программы ESPlorer, получившей международное признание. ESPlorer позволит вам не вводить AT команды вручную и легко работать с lua скриптами под NodeMCU (об этом в другой раз) и вы вполне можете использовать ее и как обычный терминал. Обсуждение ESPlorer на нашем форуме и на esp826.com
С подключением к последовательному порту придется немного поколдовать: в связи с разнообразием прошивок для ESP8266, подключение может осуществляться на разных скоростях. Нужную скорость можно определить путем простого перебора трех вариантов: 9600, 57600 и 115200. Как осуществить перебор? Подключаетесь в терминальной программе к вашему виртуальному последовательному порту выставив следующие параметры: 9600 8N1, затем перезагружаете модуль, отключив CH_PD (chip enable) от питания (USB-TTL при этом остается подключенным к USB) и снова включаете (т.е. просто передергиваете CH_PD, почему не передергиваем питание — читаем , также можно кратковременно замкнуть RESET на землю для перезагрузки модуля) и наблюдаете данные в терминале. Во-первых, светодиоды на ESP8266 должны гореть как описано в начале статьи в разделе . Во-вторых, в терминале вы должны увидеть «мусор» из разных символов, оканчивающийся строкой «ready». Если «ready» мы не видим, то переподключаемся терминалом на другой скорости и снова перезагружаем модуль.
На одном из вариантов скорости «ready» вы все-таки увидите — поздравляем, ваш модуль готов к работе. Если нет, то добро пожаловать к нам на форум — мы постараемся помочь, но предварительно почитайте эту тему.
Немного подробнее о «мусоре». Дело в том, что при старте прошивки, UART модуля ESP8266 переключается на скорость передачи 74 880 (вот такие забавные эти китайцы) выдает в UART отладочную информацию, затем переключает скорость порта на 115200 (ну или на 9600 или 57600 в зависимости от версии прошивки), так вот эта отладочная информация и видится нам как мусор, т.к. мы подключаемся к модулю на другой скорости. Можете подключится к ESP8266 на скорости 74 880 (ESPlorer поддерживает эту скорость) и вы эту отладочную информацию увидите, будет что-то вроде этого:
wdt reset
load 0x40100000, len 25052, room 16
tail 12
chksum 0x0b
ho 0 tail 12 room 4
load 0x3ffe8000, len 3312, room 12
tail 4
chksum 0x53
load 0x3ffe8cf0, len 6576, room 4
tail 12
chksum 0x0d
csum 0x0d
1 |
wdt reset load0x40100000,len25052,room16 tail12 chksum0x0b hotail12room4 load0x3ffe8000,len3312,room12 tail4 chksum0x53 load0x3ffe8cf0,len6576,room4 tail12 chksum0x0d csum0x0d |
НО! не увидите «ready» и не сможете управлять модулем, пока не переподключитесь на ту скорость, на которой работает прошивка.
Подключение
Переключение ESP8266 в режим станции выполняется при помощи функции begin(). Параметрами для этой функции служат SSID и пароль к ней, чтобы чип можно было подключить к определенной точке доступа.
WiFi.begin(ssid, password)
По умолчанию, если ESP8266 будет отключен от WiFi-сети, то потом снова попробует к ней подключиться. Писать для этого отдельный код не нужно. Имитировать отключение можно, к примеру, просто сбросив точку доступа. ESP8266 сообщит об отключении, а потом попробует автоматически подключиться.
begin()
В библиотеке ESP8266WiFi представлено несколько вариантов функции begin(). Процесс совмещения нескольких функций в одной называют «перегрузкой функции». Один вариант был показан выше – это WiFi.begin(ssid, password). Перегрузка дает гибкость в количестве и типе параметров, задаваемых в функции.
Самый простой вариант функции begin() – это…
WiFi.begin()
Вызов этой функции скомандует ESP8266 переключиться в режим станции и подключиться к последней использованной точке доступа на основе данных, сохраненных во flash-памяти.
Ниже – синтаксис еще одного варианта функции begin() со всеми возможными параметрами:
WiFi.begin(ssid, password, channel, bssid, connect)
Параметр ssid – символьная строка, содержащая SSID точки доступа, к которой мы хотим подключиться (может содержать не более 32 символов). Параметр password – это пароль к точке доступа в виде символьной строки, которая может содержать от 8 до 64 символов. Параметр channel – канал точки доступа; на тот случай, если вы хотите работать через специальный канал (в противном случае этот параметр нужно проигнорировать). Параметр bssid – MAC-адрес точки доступа (тоже опционально). Параметр connect – это параметр с булевым значением; если задать в нем false, это скомандует модулю сохранить другие параметры, не подключаясь к точке доступа.
config()
Отключает DHCP-клиент (от «dynamic host configuration protocol», что значит «протокол динамической настройки узла») и выставляет IP-настройки станции на пользовательские значения. Эти IP-настройки, в отличие от настроек DHCP, будут статическими.
WiFi.config(local_ip, gateway, subnet, dns1, dns2)
При успешном изменении настроек функция вернет true. Если настройки задать нельзя (например, если чип не переключен в режим станции или станции + точки доступа), функция вернет false.
В функции можно указать следующую информацию:
- local_ip – IP-адрес для стационарного интерфейса ESP8266
- gateway – IP-адрес шлюза (роутера) для доступа к внешним сетям
- subnet – маска подсети, диапазон IP-адресов в локальной сети
- dns1, dns2 – опциональные параметры для IP-адресов DNS-серверов, которые хранят директории доменных имен (вроде www.google.co.uk) и преобразовывают их в IP-адреса
Пример:
1 #include <ESP8266WiFi.h> 2 3 const char* ssid = "********"; 4 const char* password = "********"; 5 6 IPAddress staticIP(192,168,1,22); 7 IPAddress gateway(192,168,1,9); 8 IPAddress subnet(255,255,255,); 9 10 void setup(void) 11 { 12 Serial.begin(115200); 13 Serial.println(); 14 15 Serial.printf("Connecting to %s\n", ssid); // "Подключение к " 16 WiFi.begin(ssid, password); 17 WiFi.config(staticIP, gateway, subnet); 18 while (WiFi.status() != WL_CONNECTED) 19 { 20 delay(500); 21 Serial.print("."); 22 } 23 Serial.println(); 24 Serial.print("Connected, IP address: "); // "Подключено, IP-адрес: " 25 Serial.println(WiFi.localIP()); 26 } 27 28 void loop() {}
Пример данных, которые могут быть показаны в мониторе порта:
Connecting to sensor-net . Connected, IP address: 192.168.1.22
Станции с статическими IP-адресами, как правило, быстрее подключаются к сети. У кода выше подключение занимает примерно 500 мс (в мониторе порта показана только одна точка). Дело в том, что получение IP-настроек при помощи DHCP-клиента отнимает время, а в нашем случае этот шаг попросту пропущен. Если во всех трех параметрах (local_ip, gateway и subnet) указать «0.0.0.0», это снова активирует DHCP. Снова подключитесь к устройству, чтобы получить новые IP-адреса.
Схема прошивки
Улучшенная схема прошивки для модуля ESP-01 показана на следующей принципиальной схеме; в первоначальный дизайн было внесено несколько изменений:
- постоянное напряжение питания 3,3 В больше не снимается с преобразователя USB-TTL. Некоторые преобразователи не обеспечивают достаточный ток для надлежащей работы ESP8266, особенно когда он находится в режиме передачи Wi-Fi. Следует использовать отдельный, хорошо фильтруемый и стабилизированный источник питания 3,3 В постоянного напряжения, способный обеспечивать ток не менее 500 мА;
- конденсаторы C1 и C2 были добавлены для снижения уровня шума на шине питания. Они должны располагаться как можно ближе к выводам Gnd и Vcc ESP8266;
- R2 и R3 – это подтягивающие резисторы, которые были добавлены для того, чтобы выводы GPIO2 и GPIO0 ESP8266 никогда не «висели в воздухе».
Эти изменения не говорят, что исходная схема прошивки не работала; дело в том, что она действительно работала у автора статьи и многих других пользователей. Однако ее недостатки были такими, что схема могла и не работать у некоторых пользователей, по крайней мере, иногда. Эти сбои могут быть вызваны различными внешними факторами, качеством источника питания и допусками компонентов. Улучшенная схема должна устранить эти недостатки.
Схема программатора ESP8266
Улучшенная схема прошивки показана собранной на макетной плате на следующих фотографиях. Первая фотография показывает всю схему со вставленным модулем ESP-01; вторая фотография показывает схему без модуля ESP-01, чтобы показать места установки C2, R2 и R3
Обратите внимание, что цвета проводов на схеме соответствую обозначениям цветов на принципиальной схеме
Программатор, собранный на макетной плате, с установленным модулем ESP-01
Печатная плата справа на макете – это хорошо стабилизированный и фильтрованный источник питания 3,3 В постоянного напряжения. Для получения полной информации о создании копии этого источника питания смотрите эту статью. В противном случае вы можете использовать любой источник питания с аналогичными возможностями.
Печатная плата в левом верхнем углу макета – это преобразователь USB-TTL. Как вы видите, он вставлен непосредственно в макетную плату с помощью 6-пинового разъема Dupont, который установлен на нижней стороне платы. Вы можете модифицировать свой USB-TTL конвертер для установки именно таким же способом, или вы можете использовать для соединений отдельные провода. Что бы вы ни выбрали, обязательно следуйте схеме при соединении выводов
Обратите внимание, что требуются только три линии: RxD от преобразователя до TxD на ESP-01, TxD от преобразователя до RxD на ESP-01, и общий корпус
Несмотря на то, что преобразователь USB-TTL не используется для питания ESP-01, убедитесь, что преобразователь настрое на работу с постоянным напряжение 3,3 В, чтобы уровний напряжений сигналов не превышали допустимые значения ESP8266. Любое напряжение выше 3,3 В, поданное на ESP8266, может привести к его повреждению.
Программатор, собранный на макетной плате, с изъятым модулем ESP-01
На фотографии, приведенной выше, модуль ESP-01 был изъят из макета, чтобы показать самодельный адаптер для ESP-01. На фотографии ниже слева показан почти такой же адаптер, а справа – адаптер от Addicore. Они работают одинаково и облегчают использование модуля ESP-01 на беспаечной макетной плате или любом подобном устройстве с разъемами с шагом 0,1 дюйма (2,54 мм).
Адаптеры для подключения ESP-01 к беспаечной макетной плате
Как только вы завершите сборку своего программатора, настанет время для тестирования. Но перед подключением USB кабеля или подачей питания перепроверьте разводку, особенно линии питания. Лучше потратить несколько дополнительных минут, чем повредить что-либо из-за неправильной разводки.
Сначала подключите USB кабель от компьютера к конвертеру USB-TTL. Положительным признаком является загорание красного светодиода в углу печатной платы, близкому к разъему USB, и распопознавание USB конвертера компьютером
На этом этапе обратите внимание на то, какой номер COM порта был назначен конвертеру. Как вы можете видеть на фотографиях, у меня преобразователю был назначен COM4
Затем подайте на программатор питание 3,3 В постоянного напряжения. Вы должны увидеть пару вспышек синего светодиода на модуле ESP-01, а красный светодиод на модуле должен гореть постоянно.
Теперь нажмите и отпустите SW1 (кнопка сброса); синий светодиод должен замигать. Затем нажмите и отпустите SW2 (кнопка программирования); не должно произойти ничего заметного.
Если всё идет по плану, ваша схема прошивки, вероятно, работает правильно. Настало время выполнить окончательную проверку: ответит ли ESP8266, когда вы обратитесь к нему?
Library — Webserver
- ESP8266WebServer: Add variadic template version of collectHeaders() ()
- Fix header FSM in webserver, fix Windows uploads ()
- ETag support for WebServer ()
- Rewrite multipart boundary detection ()
- Fixed bug in parsing POST file uploads ()
- Fix long password validation in WebServer ()
- FIX MIME-Type for txt-suffix ()
- FIX StaticRequestHandler crashes when cache_header is null and DEBUG_ESP_CORE is enabled ()
- Avoid #includes with a surrounding namespace ()
- webserver hook: allow to handle external http protocol (, , )
- Made ESP8266WebServer::client() return a reference (fixes ) ()
- WebServer: Allow client to send many requests on the same connection ()
- webserver: do not count «plain» in argument list ()
- webserver: string optimization ()