Перейти к содержанию
    

Сервер http на связке esp8266+stm32 (ответ на запрос GET и прочие неприятности)

30.09.2021 в 18:47, Andreas1 сказал:

Нельзя два сервера иметь, а один сервер и несколько клиентов можно. Запрета что-то не нахожу.

Проверил всё-таки ещё раз на пациенте:

AT version:1.3.0.0(Jul 14 2016 18:54:01)
SDK version:2.0.0(656edbf)
compile time:Oct 29 2016 22:56:21

Действительно: одновременная работа с клиентскими и серверными соединениями  - поддерживается.

Но API AT-команд этой версии сделано настолько криво, что практически крайне трудно использовать одновременные клиентские+серверные сокеты. Так как по сообщению об открытии соединения "link_id, CONNECT" совершенно невозможно узнать - какое именно соединение установлено: клиентское или серверное? Если например в данный момент нет ни одного открытого соединения и дать команду "AT+CIPSTART" и за ней придёт сообщение "0,CONNECT", то по этому сообщению совершенно непонятно - какое именно соединение установлено: клиентское (установленное по команде "AT+CIPSTART") или серверное (из-за случившегося в этот момент входящего соединения)? Есть команда "AT+CIPSERVERMAXCONN" и ей можно было бы установить ограничение на кол-во серверных соединений. Например "AT+CIPSERVERMAXCONN=2", а значит все соединения с ID>1 будут однозначно клиентскими. Но в моей версии прошивки "AT+CIPSERVERMAXCONN" не работает.  :sad:

Наверное можно что-то сделать при помощи команды "AT+CIPSTATUS" (после прихода "x,CONNECT" давать "AT+CIPSTATUS" и точно идентифицировать тип соединения). Надо будет проверить это...

 

PS: Видимо поэтому, когда я изучал ESP8266, я сделал вывод о невозможности использования одновременных клиентских+серверных сокетов.

PPS: Все мои ESP8266 - это модули с али с флешкой 512КБ и прошивки новее туда просто не влазят из-за невменяемого объёма. :sad:  Просто не понимаю - как так можно писать код, что 512КБ не хватает для такого несложного функционала, как у ESP8266???  :unknw:

PPPS: Или можно какую-то более новую версию AT-прошивки впихнуть в 512КБ? Кто подскажет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 минут назад, jcxz сказал:

Если например в данный момент нет ни одного открытого соединения и дать команду "AT+CIPSTART" и за ней придёт сообщение "0,CONNECT", то по этому сообщению совершенно непонятно - какое именно соединение установлено

Я клиентский сокет 5й делал, а серверные самооткрытые с 0 начинались всегда и я принудительно закрывал сокеты выше 1го, браузер это ценил и не открывал больше лишних. CIPSERVERMAXCONN тоже тогда не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

59 минут назад, Andreas1 сказал:

Я клиентский сокет 5й делал, а серверные самооткрытые с 0 начинались всегда и я принудительно закрывал сокеты выше 1го, браузер это ценил и не открывал больше лишних. CIPSERVERMAXCONN тоже тогда не было.

Да, я тоже о таком алгоритме думал. Но если надо несколько клиентских и серверных, то расстояние (в количестве ID) между ними может оказаться недостаточным, чтобы успеть закрывать. Особенно если браузер скачает первый файл, распарсит его и решит сразу установить ещё 4 дополнительных соединения.

 

PS: Проверил "AT+CIPSTATUS" - действительно она работает. С помощью неё получается можно точно классифицировать типы соединений.

Но почему нельзя было разработчикам ESP8266 подумать и сразу в сообщении о новом соединении указывать какого оно типа??? Либо в "AT+CIPSERVER" задавать диапазон допустимых ID для входящих соединений? Либо ещё как. Очень кривое API!

Потому как, если по свежеустановленному соединению сразу начинают приходить данные (а "AT+CIPSTATUS" для классификации мы ещё не успели дать), то совершенно непонятно - как эти данные обрабатывать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, jcxz сказал:

Особенно если браузер скачает первый файл, распарсит его и решит сразу установить ещё 4 дополнительных соединения

Если паковать сразу пачку файлов сайта gzip и отправлять разом с Content-Encoding: gzip, то зачем еще 4 соединения? Ну если еще жабаскрипт на сайте что-то запрашивает, то еще одно откроет.

1 час назад, jcxz сказал:

Очень кривое API!

Как вежливо и мягко сказано! еще пример -  +IPD,sock,len:data , но +SYSFLASH:len,data   И так везде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

06.11.2021 в 14:53, Andreas1 сказал:

Если паковать сразу пачку файлов сайта gzip и отправлять разом с Content-Encoding: gzip

А так можно разве?

Я не силён в HTML, всегда считал, что если внутри HTML-страницы есть ссылки на другие (вложенные) файлы (.htm, .png, .gif, ...), то каждый такой файл должен паковаться в отдельный архив (если упаковка действует) и передаваться клиенту как отдельный файл.

Ведь клиент парсит страницу и запрашивает упомянутые в ней файлы по отдельности. Или он может как-то запросить сразу все файлы из .htm? Как?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/6/2021 at 3:53 PM, Andreas1 said:

Если паковать сразу пачку файлов сайта gzip и отправлять разом с Content-Encoding: gzip

Есть СТАНДАРТ. Всё расписано. И про gzip/deflate в том числе. И про inline content

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 часов назад, jcxz сказал:

А так можно разве?

У меня простая страница, весь js внутрь запихал и зажал. Отложилось в памяти, что можно, но похоже что нет, ввел в заблуждение.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В моём проекте тоже: всё содержимое сайта сжато gzip и затем упаковано в архив. И положено в прошивку единым архивом. Но файлы из этого архива уже вытаскивает код моего сервера, runtime, по запросам от клиента. По одному файлу на каждый запрос распаковываются. И отдаются (отдаются сжатыми gzip, не разжимаются).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простейший bat файл делает из всех файлов для веб сервера gzip файлы.
Затем делает C файл с массивами (название файла, тип, длина, данные) и ничего runtime распаковывать не надо.
Для редактирования файлов для веб - Visual Studio (или любой другой).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, x893 сказал:

Простейший bat файл делает из всех файлов для веб сервера gzip файлы.
атем делает C файл с массивами (название файла, тип, длина, данные) и ничего runtime распаковывать не надо.

Это и есть - упаковка в архив. Который потом в runtime распаковывается.

А вот в "С файл" преобразовывать совершенно не нужно: любой вменяемый компоновщик должен уметь подключать бинарные файлы в результирующий образ.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, x893 сказал:

Это зачем ?

Затем, что HTTP-клиент запрашивает файлы по одному, а не всем скопом (или по-крайней мере до тех пор, пока Andreas1 не объяснит как отдать все скопом).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 minutes ago, jcxz said:

Затем, что HTTP-клиент запрашивает файлы по одному

Это и ежику понятно. Зачем хранить одним файлом и runtime распаковывать и потом что делать с распакованным - опять запаковывать в gzip как отдельный файл ?

9 minutes ago, jcxz said:

пока Andreas1 не объяснит как отдать все скопом

Пока он не прочитает что такое inline content

 

В общем бессмысленная беседа. Работает и хорошо. И у меня работает без всякой runtime распаковки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

24 минуты назад, x893 сказал:

Это и ежику понятно. Зачем хранить одним файлом и runtime распаковывать и потом что делать с распакованным - опять запаковывать в gzip как отдельный файл ?

Вы похоже не понимаете разницы между "сжатием" и "упаковкой в архив". gzip - сжимает, это компрессор. Он не упаковывает в архив.

Перечитайте ещё раз моё сообщение, на которое вы стали отвечать. Я там писал 

1 час назад, jcxz сказал:

всё содержимое сайта сжато gzip и затем упаковано в архив

отдельно про 2 фазы. Я:

1. Сжимаю все файлы gzip.

2. Упаковываю в единый cpio-архив.

И у меня это тоже делает бат-ник: создаёт .cpio-файл.

В runtime я выполняю только распаковку, а не декомпрессию:

1 час назад, jcxz сказал:

(отдаются сжатыми gzip, не разжимаются)

Содержимое архива (файл content.cpio) компоновщик включает в образ прошивки.

cpio - простой формат архива, который несложно распаковать в runtime. Но при этом - это стандартный формат, так как его могут просматривать распространённые распаковщики и файловые менеджеры.

 

 

Цитата

В общем бессмысленная беседа. Работает и хорошо. И у меня работает без всякой runtime распаковки.

То, что Вы описали - это и есть распаковка. Только вашего проприетарного формата. Да ещё зачем-то сконвертированного в си-текст.

 

Когда у Вас будет сервер с объёмным содержимым (в десятки-сотни файлов), тогда поймёте разницу между доморощенным методом с си-текстом с проприетарным форматом и стандартным архивом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и разрешилось. Отлично. Мне .cpio не нужен. Но нужны: имя файла, Content-Length и желательно Content-Type - но его можно и программно получить из расширения.

А веб я делаю в виде проекта под VS

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...