• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

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

_dark_

New member
Всех приветствую!

Использую связку ESP8266+STM32 (8266 используется в режиме AT команд, прошивка по дефолту, никаких сторонних библиотек и пр. )
Железяка подключена к сети на адресе 192.168.0.108 (на 8266 поднят клиент и сервер), комп с которого тестирую 192.168.0.103.
На запрос по адресу http://192.168.0.108 железка (STM32) отвечает всегда, но вот браузер висит и иногда разрождается вот этим:

2021-09-27_162825_тест ответа.png
Прослушиваю сеть, ответ на GET поступает всегда
2021-09-27_163055_захват.png

Ответ соответствует вот этому коду (как файл htm он отображается нормально):
Код:
<html>
    <head>
        <title>TEST HTML</title>
    </head>
    <body>
        <h1>Тест HTML</h1>
        <p>Простой тест ответа</p>
    </body>
</html>
Как у начинающего с 8266 возникли вопросы:
1. Что не хватает в ответе , чтобы браузер воспринимал ответ регулярно?
практически он всегда висит в каком-то ожидании и теряет страницу, хотя по F5 на его запрос ответ высылается всегда
2. Почему браузер выводит дополнительно в теле страницы слово "HTTP", хотя в ответе его нет?
3. Почему ответы воспринимаются как ТСP и редко как HTTP?
при этом сам ответ у меня не меняется и контекст по идее должен видится как http или я что-то путаю?

Прошу пнуть в нужном направлении!

ps
- браузеры разные ведут себя одинаково (хром, яндекс, макстон)

Прикладываю файлы скринов и сохраненный захват в Wirashark
 

Вложения

_dark_

New member
Кто нибудь может выложить захват обмена между простым сервером (своей железки) и браузером в Wirashark?
аналогично представленному в посте выше.

Мне доступен только роутер в офисе, но не вижу принципиальной разницы в ответе.
... правда он навороченный у D-link-a
 

CodeNameHawk

Moderator
Команда форума
практически он всегда висит в каком-то ожидании и теряет страницу
Вы бы сами прочитали, что написали.
После чего он висит? Первое открытие страницы работает? А после чистки кеша?

хотя по F5 на его запрос ответ высылается всегда
По идее, это равнозначно запросить и получить страницу, не смотря на то, что есть в кеше браузера, иначе браузер часто выдает страницу с кеша.
По идее в коде страницы можете дать команду, всегда брать страницу по новой, но похоже, что иногда браузеры ее игнорируют.
Вроде есть тег времени актуальности данных.

Если отказаться от АТ прошивки, то весь веб сервер, вместе с текстом страниц может хранится в есп, как и проверка доступности сети и ее переподключение в случае сбоя.
STM32 по тихому отдает нужные данные есп, а уже та реагирует на запросы с сети, не беспокоя основной проц.
 

_dark_

New member
После чего он висит? Первое открытие страницы работает? А после чистки кеша?
Т.е. после набора в строке браузера http://192.168.0.108 браузер выдает запрос GET (есть в файле опроса сети *pcapng),
STM32 получает этот GET (стабильно всегда), парсит и отвечает (см. картину выше и файл)
в результате на ПК (192.168.0.103 откуда запущен браузер) эти ответы проходят (всегда)
но браузер не отображает ответ (страничку теста) и "крутится" в ожидании (чего ему надо не знаю)

перезапрашивая по F5 (фактически повторяя запрос страницы) все повторяется (т.е. запросы и ответы проходят) и...
в какой-то момент времени (после N-го нажатия F5) страница отображается, но следующие запросы опять не проходят (браузер висит - крутится значок ожидания)

Если отказаться от АТ прошивки, то весь веб сервер, вместе с текстом страниц может хранится в есп, как и проверка доступности сети и ее переподключение в случае сбоя.
STM32 по тихому отдает нужные данные есп, а уже та реагирует на запросы с сети, не беспокоя основной проц.
можно еще дать 10 советов КАК можно или нужно делать, но необходимо:
- подключение к WiFi сети через отдельный модуль, (желательно с дефолтной прошивкой)
- сервер крутится на STM32
- никаких ОСей
- никаких третьих библиотек в STM32
(никакой Дурины)

Собственно тема не совсем о esp8266 (хотя у меня к ней есть вопросы и немало, но с этим потом).
Проблема, похоже в формировании ответа http, но не могу понять где собака зарыта.
Поэтому и попросил снять на уровне сети обмен между узлами, аналогично тому который выложил
(кто не знает файл загружается в Wirashark и там можно полазить по всем ответам)

Вроде бы примитивная задачка, разжеванная на десятках сайтах, типа
Формирую страничку по моему стандартно (приводил выше)...
 

_dark_

New member
Вот так отвечает роутер, (точнее начало ответа, дальше несколько пакетов тела страницы)
Принципиальной разницы не вижу... хотя скорее всего чего-то не понимаю

2021-09-28_161935-2.png
захваченный протокол

Начало ответа выглядит так
Код:
HTTP/1.0 200 Ok
Server: httpd
Date: Sun, 16 May 2010 21:46:03 GMT
Cache-Control: no-cache
Pragma: no-cache
Expires: 0
Content-Type: text/html
Connection: close

<html>
    <head>
        <script>
            function redirect(){
                document.location.href = 'login_auth.asp';
                }
            function chk_KeyValue(e){
                var salt = "48b627fd
 

Вложения

_dark_

New member
Полный ответ у меня

Код:
HTTP/1.1 200 OK\r\n
  Server: httpd\r\n
  Content-Type: text/html\r\n
  Connection: close\r\n
  Refresh: 1\r\n
  Content-Length: ххх
\r\n\r\n 
<!DOCTYPE html>\r\n
<html>\n
    <head><title>TEST HTML</title></head>\n
    <body>\n
        <h1>Тест HTML</h1>\n
        <p>Простой тест ответа сервера</p>
    </body>\n
</html>
ххх - длина ответа в байтах, всего, что ниже
тут не убирал \r\n, в ответе роутера они есть, но при копировании не видны
 

_dark_

New member
зы
Убирание тегов <!DOCTYPE> "content...." "Refresh", добавление всяких опций в заголовок, аналогичных посту №7 картины не меняет..
 

_dark_

New member
CodeNameHawk, уж даже и не знаю что еще предоставить...,
в файлах захвата весь обмен до байта расписан, дал уже и выжимку в посте №8, что высылается...

Впрочем данный вопрос решен.
Косяк был в неправильном расчете значения в Content-Length: ххх
(для простоты сборки ответа добавил в начло массива для тела http ответа \r\n\r\n , и они попадали в расчет длины тела ответа)

ps
темка пусть повесит пока тренируюсь, может еще, где накосячу
 

CodeNameHawk

Moderator
Команда форума
Остается вопрос, зачем нагружать stm работой, с которой хорошо справляется есп.
Есть более красивые способы обновлять данные на странице, чем применение тега refresh.
 

_dark_

New member
С одной стороны конечно бы хотелось увидеть рабочий вариант проекта сервера на 8266,
с полноценной подкачкой данных от контроллера и обратно (для понимания решения), но поиском не нашел.

8266 это один из каналов связи

ESP8266 - WiFi
28J60 - LAN или на самой STM32
все равно нужен сервер

чем применение тега refresh.
не сомневаюсь, но все что пока делаю это простенький тест, да и убран уже он...
 

_dark_

New member
Спасибо за ссылки, но поему там практически везде дурины и разные SDK.
"Чистых" проектов без третьих библиотек нет, а продираться через чужие библиотеки неблагодарное занятие.
Конечно что-то уже смотрел на предмет принципов работы с 8266, и тут нет больших вопросов, кроме одного:

- как мне кажется дефолтная прошивка 8266 не очень стабильная, в т.ч. прежде всего в плане взаимодействия с ней
(во всяком случае виснит она пока на раз, в т.ч. и из-за моих ошибок)
а расписанного четко графа состояний не нашел ни в документации ни в проектах.
В последних как правило "демопоследовательности" команд, без контроля состояний (ну почти без контроля)...

Т.е. если с командами более менее все понятно, то как контролировать возможные "вылеты" 8266 (перезагрузки и пр.)
не совсем понятно и примеров этому похоже нет.

Конечно я еще перевариваю всю инфу и в голове не все отложилось ...
 

CodeNameHawk

Moderator
Команда форума
но поему там практически везде дурины
По этому низкая цена входа.
- как мне кажется дефолтная прошивка 8266 не очень стабильная, в т.ч. прежде всего в плане взаимодействия с ней
Версия 2.7.4 , стабильная, а если в связке с другим процом, вообще без проблем.
"Чистых" проектов без третьих библиотек нет,
Так в том и дело, баги вылавливаются многочисленными усерами.
Или вы думаете, что сами напишите для всего и без ошибок.
 

_dark_

New member
Версия 2.7.4 , стабильная, а если в связке с другим процом, вообще без проблем.
Спасибо! Уже хорошо.

низкая цена входа.
С какой стороны смотреть, для "пощупать" или "курсовой" и все, тогда да,
а если учесть другой целевой проц, и необходимость портирование библиотек (которые "длявсего") хотя бы на Си...
думаю что цена будет в конечном счете выше, она просто должна быть выше

Или вы думаете, что сами напишите для всего и без ошибок.
Да в принципе, мне "для всего" не надо )),
1 - пока, для начала, сделать встроенный конфигуратор целевой железки, это ~10-15 параметров или флагов
2 - добавить конфигурацию удаленных девайсов (подключенных к ней), еще ~30-40 тегов
3 - ну и дойдут руки, просмотр измерений в реал-тайме удаленно, еще ~10-20 тегов с модификаторами
но это смежные задачи, по сути почти одинаковые

Думаю, что напишу (лучше в себя все таки верить), во всяком случае за последние 20 лет не было такой задачки которую не удавалось решить ) )
Просто сети не моя специализация, тут я пока новичок
А ошибки, ну все мы их делаем, на то он и софт, что они легко правятся, это же не ошибки харда
Да и форумы сейчас помогают волшебным пендалем направить полет в нужном направлении ))
 

_dark_

New member
Тест вчера уже крутился весь день, по моему не падал, больше беспокоит, что проц получает периодически ошибки,
обычно это тайм-ауты при ожидании конкретного ответа от 8266 (например, OK)
Пока игнорирую, но нужно парсить все возможные ответы и это приводит к переписыванию именно тех внешних библиотек,
о которых речь выше.

Небольшой оффтоп:

Приведу для примера, есть довольно внятный пример на STM32 с обменом через кольцевой буфер.
Сам увидел его впервые, до это не юзал.
Суть в том, что пример написан на HAL, а использование его приводит к потерям в обмене по USART и кольцевой буфер снижает
эти потери. - я в шоке, HAL теряет данные? - жесть (Статья была переводом с англоязычного сайта)
Ладно подкрутил исходник для CМSIS, примерно 50% кода в топку.

Оставил временно (и как оказался прав) функцию ожидания строки по шаблону (она используется для анализа ответа 8266).
Пришлось для начала ввести в нее тайм-аут ожидания иначе был бесконечный цикл. если строка не приходила (ну что сказать программист писал),
хотя это костыль для "попробовать".
Ограничение, что ждем конкретный шаблон (ОК, ERROR и др.) и игнорируем другие ответы он не снимает!
Соответственно при дальнейшей модификации функция ожидания летит в топку + внесение ряда служебных фичей в виде
GetLastError и от начального кода осталось не более 20% - в основном идея, начальные структуры данных и оформление в файл!

Другой пример
Известная библиотека Blynk для сети.
Да, ей пользуются, но посмотрев исходник и увидев реализацию сервера HTTP на 1500 строк (не меньше) единой функцией,
с операторами goto (это в Си), разбросанными по всему телу!!!
Как то мне, мягко скажем, "беспокойно" использовать такое произведение программной мысли...
 
Сверху Снизу