Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 lwip HTTP server
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Kalyan
Доброго дня. Я использую пример веб сервера с сайта ст, тот что на freertos, на микроконтроллере stm32f207. Я его подредактировал, добавил свои страницы. На одной странице у меня три изображения и вот при обновлении страницы изображения не всегда подгружаются. Например первое и второе загрузится а третье нет. Или второе не загрузится. Вот не могу понять в чем причина. Может кто-то сталкивался с этой проблемой?
MALLOY2
Цитата(Kalyan @ Jul 25 2012, 09:29) *
Доброго дня. Я использую пример веб сервера с сайта ст, тот что на freertos, на микроконтроллере stm32f207. Я его подредактировал, добавил свои страницы. На одной странице у меня три изображения и вот при обновлении страницы изображения не всегда подгружаются. Например первое и второе загрузится а третье нет. Или второе не загрузится. Вот не могу понять в чем причина. Может кто-то сталкивался с этой проблемой?


На то он пример, посмотрели, а теперь пишите свой. Я смотрел на тот код даже язык не поворачивается называть его веб сервером.
Kalyan
Код
На то он пример, посмотрели, а теперь пишите свой. Я смотрел на тот код даже язык не поворачивается называть его веб сервером.


Спасибо за совет! Я не знаю как должен быть правильно организован веб сервер на микроконтроллере. Если вы знаете то расскажите или приведите пример.
Но мой вопрос не был том плох или хорош пример. Я столкнулся с конкретным багом и прошу помощи у того кто знает как это исправить!
=F8=
Установите MEMP_NUM_NETCONN и MEMP_NUM_NETBUF как минимум больше 4, возможно еще что-то. Браузер если видит на странице несколько ссылок на другие объекты(не только рисунки но и фреймы, css таблици, итд) старается тянуть все это параллельно. Соответственно вы готовы принять все эти соединения, не обязательно передавать все параллельно, но если приходит запрос на соединение его отбрасывать нежелательно. Чтоб разобраться подробнее wareshark в помощь.
PS а вебсервер там действительно ниразу не сервер, даже заголовок не генерит.
Kalyan
Код
Установите MEMP_NUM_NETCONN и MEMP_NUM_NETBUF как минимум больше 4

Огромное спасибо. теперь все работает. Подскажите пожалуйста как должен быть правильно организован веб сервер на микроконтроллере. Ну хоть несколько рекомендаций.
И еще такой вопрос. Есть у меня страничка она закодирована в бинарник и выгружается по запросу. а как вот на эту страницу выводить динамически изменяющееся значения, ну например значения с АЦП?
MALLOY2
Цитата
Я столкнулся с конкретным багом

Ваш баг в том что вы хотите все готовое.

1. Сначала изучите все настройки FreeRTOS чтобы небыло вопросов это максимум день.
2. Изучите все настройки LwIP с API lwip
3. Изучите протокол HTTP теоретически и практически используя Wareshark и HTTPWatch.
4. Напишите свой как вы его видите.

P.S. Просто на ваш вопрос нету однозначного ответа, ответов может быть миллион.
=F8=
Цитата(Kalyan @ Jul 25 2012, 14:31) *
Огромное спасибо. теперь все работает. Подскажите пожалуйста как должен быть правильно организован веб сервер на микроконтроллере. Ну хоть несколько рекомендаций.

Пишите в гуглях "http протокол", читаете, делаете как написано. Материалов на эту тему более чем достаточно.
Цитата(Kalyan @ Jul 25 2012, 14:31) *
И еще такой вопрос. Есть у меня страничка она закодирована в бинарник и выгружается по запросу. а как вот на эту страницу выводить динамически изменяющееся значения, ну например значения с АЦП?

Проще всего используя java script и скрытый фрейм. Скрытый фрейм располагаете, к примеру, на главной странице, в ссылке фрейма пишете к примеру "data.htm".
Сам data.htm по запросу формируете динамически и через него передаете все необходимые значения.
этот файл имeет примерно такой вид:
<html><head></head><body><br>
<form id="devsetting" name="devsetting" action="data.htm"><br>
<input type="text" name="val1" value="8"><br>
<input type="text" name="val2" value="1"><br>
...................................................................
</form>
</body></html>
Затем к событию onload главной страницы привязываете скрипт который читает скрытый фрейм и заполняет поля. В общем с java script прийдется разобраться.
PS скрытые фреймы нынче не в моде. Чтоб узнать про другие способы читайте в гуглях про AJAX.
PSS кстати страницу data.htm можно сделать автообновляемой для этого в заголовок страницы надо добавить <meta http-equiv="refresh" content="10;URL=cdata.htm"> если после этого к onload фрейма привязать скрипт обновляющий данные то можно следить за вашим АЦП как-бы в реальном времени.
MALLOY2
Цитата
И еще такой вопрос. Есть у меня страничка она закодирована в бинарник и выгружается по запросу. а как вот на эту страницу выводить динамически изменяющееся значения, ну например значения с АЦП?


Я делал через AJAX запросы, весьма удобно и передавать можно все что угодно.
andrewlekar
Во встраиваемых web серверах то, что вы хотите, называется SSI (server-side includes). Если не заморачиваться, то можно прямо в обработчике запросов от клиента внедрять данные, но тогда страничка не должна быть бинарной.
Kalyan
Питаюсь прикрутить Аякс.
В хеад страницы добавил
Код
<script type="text/javascript" src="js/jquery.js"></script>

Эту библиотеку закодировал и отдаю по запросу.
Далее добавляю скрипт на отправку ГЕТ запроса, но запроса клиент не отправляет:
Код
<script type="text/javascript">
    $.get("/cgi/", null, function(val) {
        $("#dinamic_data").html(/*"T="+*/val+"&deg;");
    });
</script>


А вот код всей страницы
Код
<html>
<head>
<title>test</title>
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript">
    $.get("/cgi/", null, function(val) {
        $("#dinamic_data").html(/*"T="+*/val+"&deg;");
    });
</script>
</head>

<body>
<h1  align="center">data transmit test</h1>
<div id="dinamic_data_test">
                    <p>Чтение данных</p>
                    <div id="dinamic_data">N/A</div>
                </div>
</body>
</html>


Наверное ошибка в самом скрипте? Или я пропустил что-то важное?
Kalyan
Прошу помощи у знающих людей!
По запросу клиента(браузера) я отдаю бинарник хтмл страницы с подключенной библиотекой и скриптами (страница с предыдущего поста)
Браузер парсит и как толко доходит до скрипта
Код
<script type="text/javascript">
    $.get("/cgi/", null, function(val) {
        $("#dinamic_data").html(/*"T="+*/val+"&deg;");
    });
</script>

Выдает еще один запрос
get /cgi/"
Правильно я понял?
Я на веб сервере вижу этот запрос и передаю браузеру эти динамические данные. он их принимает и встаивает в тело страницы
( $("#dinamic_data").html(/*"T="+*/val+"&deg;")wink.gif
Я прав? Люди которые использовали аякс на встроенном веб сервере отзовитесь!
Тут еще один вопрос в каком формате я должен ответить на запрос? Например мне в поле надо вывести число(измерения ацп), то я наверное должен передать это число как строчку?
scifi
Что, прямо весь jquery.js засунули в свою прошивку? Я вместо этого маленький скриптик наваял:
CODE
window.onload = refInit;

var refXmlHttp;

function refInit()
{
if (refXmlHttp)
{
refXmlHttp.abort();
}
if (window.XMLHttpRequest)
{
try
{
refXmlHttp = new XMLHttpRequest();
}
catch (e) {}
}
else if (window.ActiveXObject)
{
try
{
refXmlHttp = new ActiveXObject('Msxml2.XMLHTTP');
}
catch (e)
{
try
{
refXmlHttp = new ActiveXObject('Microsoft.XMLHTTP');
}
catch (e) {}
}
}
if (refXmlHttp)
{
var timeout = 1000 * document.getElementById("refrate").firstChild.nodeValue;
refXmlHttp.onreadystatechange = refOnLoad;
if (timeout != 0)
{
setTimeout("refSendRequest()", timeout);
}
}
}

function refSendRequest()
{
refXmlHttp.open("GET", "/mondata.xml", true);
refXmlHttp.send(null);
}

function refOnLoad()
{
if (refXmlHttp.readyState == 4) // 4 = "loaded"
{
if (refXmlHttp.status == 200) // 200 = OK
{
refIterateAll();
}
refInit();
}
}

function refIterateAll()
{
var nodes = refXmlHttp.responseXML.documentElement.childNodes;
for (var i = 0; i < nodes.length; i++)
{
for (var item = nodes.item(i).firstChild; item; item = item.nextSibling)
{
if (item.parentNode.nodeName == "values")
{
var target = document.getElementById(item.nodeName);
if (target)
{
target.firstChild.nodeValue = item.firstChild.nodeValue;
}
}
}
}
}
Kalyan
Вот такая вот проблема:

Код
function test()
{
    alert('send request');

    window.setTimeout(test, 3000);
}

$(document).ready(function() {
    test();
});


Вот этот скрип подгружаемый с мк не работает

я его немного переделал

Код
function test()
{
    alert('send request');

    window.setTimeout(test, 3000);
}

test();


Вот так работает.
Значит проблема в функции $(document).ready. То есть моя страничка никогда не устанавливается ready. Я так понял. также пробовал использовать функцию $(document).load - но тоже это событие не наступает.

Также пробовал отправить простой запрос серверу

$.get("/get_data");

ничего не отправляется.

Наверное я со свого сервера не передаю какое то подтверждение, из за чего может наступить событие ready или load. Подскажите пожалуйста
=F8=
2Kalyan
По ссылке рабочий пример опроса через ajax без jquery. Нажмите для просмотра прикрепленного файла
В ответ за запрос сервер должен передать в теле 2 hex значения разделенные запятой.
В примере используются get запросы, потом лучше перйти на post. Недавно наткнулся на грабли в explorer-е - он скешировал запрос в результате получилось что скрипт вроде работает, но реального опроса нет. Возможно просто в заголовке ответа что-то не так. В любом случае post запросы не кешируюся по определению.
PS отлаживать скрипты alert-ами как-бы не совсем удобно. В chome настройка->инструменты->Консоль JavaScript и отлаживаете как положено с брекпоинтами, просмотром переменных итд. В firefox ставите плагин Firebug. В explorer сервис->средства разрабочика.
Kalyan
В процесседальнейшего использования стека возникла еще одна проблема. Стрнички которые содержат графику очень долго грузятся. То есть я вижу полностью подгружается страничка а поом последовательно начинают грузится изображения. Может надо в настройувх стека увеличить память для какого то буфера ли еще что то в этом роде. Подскажите пожалуйста
Kalyan
Я добился боллее мение стабыльной работы сервера путем перераспредления приоритетов всех тасков и разберов TCP буфферов. При прямом подключении к ПК все работает отлично. Но вот ели я подключу свою плату через точку доступа и буду заходить на нее с телефона(андроид) через вайфай все пересает работать. Тупит по страшному, очень долго грузится или вообще перестает грузится. Может кто то сталкивался с таким и зает в какую сторону копать?
PoReX
IP, MAC адреса не пересекаются? IP плате точка присваивает?
Kalyan
Цитата
IP плате точка присваивает?

Плата имеет статический IP. Например 192.168.2.11

Цитата
IP, MAC адреса не пересекаются?

Не должны. у точки доступа 192.168.2.254 у компа 192.168.2.30. мак адрес платы 300000.

PoReX
Попробуйте включить DHCP в lwip, чтобы точка ему присвоила адрес. У меня был подобный случай, правда с компьютером, роутер не хотел принимать статический ip.

Кстати каким браузером на андроиде просматриваете? Комп видит через роутер плату?
Kalyan
Браузер - дельфин. Да с компа могу пропинговать.

С DHCP в lwip еще не работал. попробую как нибуть. Сейчас использую lwip 1.3.2. Стоит ли переходить на lwip 1.4.0? посоветуйте
yanvasiij
Люди, помогите разобраться! В lwip есть вообще возможность работать с HTTP пакетами: вручную их обрабатывать, самому формировать ответ на запрос? Если есть то, как это делается? Буду очень признателен за помощь?
Gunner
QUOTE (yanvasiij @ Sep 28 2012, 12:58) *
Люди, помогите разобраться! В lwip есть вообще возможность работать с HTTP пакетами: вручную их обрабатывать, самому формировать ответ на запрос? Если есть то, как это делается? Буду очень признателен за помощь?

LwIP ничего не знает про HTTP-пакеты. Вам надо написать HTTP-сервер, который и будет обрабатывать HTTP-пакеты (парсить их), формировать ответ и т.д. HTTP-сервер будет использовать стек LwIP (либо другой) для приема/передачи пакетов по сети.
yanvasiij
Цитата(Gunner @ Sep 28 2012, 17:08) *
LwIP ничего не знает про HTTP-пакеты. Вам надо написать HTTP-сервер, который и будет обрабатывать HTTP-пакеты (парсить их), формировать ответ и т.д. HTTP-сервер будет использовать стек LwIP (либо другой) для приема/передачи пакетов по сети.

Правильно ли я понял: посколько lwip только tcp/ip стек, то мне надо из tcp пакетов извлекать HTTP? Если так, то где мне вытащить входящие tcp пакеты? Признаюсь пример с web-сервером меня только сбил с толку, так, что я совершенно не могу понять каким образом извлекать входящие пакеты.
Gunner
QUOTE (yanvasiij @ Sep 28 2012, 14:49) *
Правильно ли я понял: посколько lwip только tcp/ip стек, то мне надо из tcp пакетов извлекать HTTP? Если так, то где мне вытащить входящие tcp пакеты? Признаюсь пример с web-сервером меня только сбил с толку, так, что я совершенно не могу понять каким образом извлекать входящие пакеты.

Входящие TCP-пакеты обрабатывает сам стек (проверяет целостность, отбрасывает заголовки и др.) и передает поток данных приложению (HTTP-сервер, FTP-сервер, и т.д).
А ваше приложение, чтобы принимать/отправлять данные, должно взаимодействовать с LwIP-стеком, используя API-функции, предоставляемые стеком (raw, netconn, socket).
По-моему, в примерах так и сделано, хоть и в упрощенной форме.
scifi
Цитата(yanvasiij @ Sep 28 2012, 13:58) *
Люди, помогите разобраться! В lwip есть вообще возможность работать с HTTP пакетами: вручную их обрабатывать, самому формировать ответ на запрос? Если есть то, как это делается? Буду очень признателен за помощь?

Советую скачать примеры, приложенные к lwip. Качать отсюда. Примеры содержатся в файле contrib-x.y.x.zip. Там есть минимальный веб сервер (netconn API) и довольно полнофункциональный (raw API). Можете использовать их как отправную точку.
yanvasiij
scifi Gunner
Спасибо за помощь! Буду разбираться.
Kalyan
Доброй ночи уважаемые инженеры!
Я опять столкнулся с серьезными проблемами и хочу стросить у знающих людей так как сам уже третий день не могу решить эту проблему.
Недавно вышла новая версия IOS для яблокоподобных - IOS 6. Весь интернет заполонили посты о глюках при работе с вайфай подключениями. Это коснулось и моего веб сервера. айпед отказывается видеть его. хотя к сети подключены точки доступа, принтеры, веб камеры. это все айпед видит и работает коректно. Только не может увидеть мой веб сервер. На IOS 5 все работало отлично. Андроид девайсы видят мой сервер и работают с ним корректно. В чем может быть причина ума не приложу. Подскажите пожалуйста в какую сторону копать...
Kalyan
Все заработало и на айпаде!!! Я просто обновил lwip стек до 1.4.0. Вместе с этим исчезла еще куча проблем. Всем советую обновится до 1.4.0. Но само обновление сложная вещь(для меня) после обновления у меня не работают пинги. Криво что то написал наверное. будет время расберусь
Gunner
QUOTE (Kalyan @ Dec 4 2012, 21:49) *
Все заработало и на айпаде!!! Я просто обновил lwip стек до 1.4.0. Вместе с этим исчезла еще куча проблем. Всем советую обновится до 1.4.0. Но само обновление сложная вещь(для меня) после обновления у меня не работают пинги. Криво что то написал наверное. будет время расберусь

По поводу пингов посмотрите здесь
http://lists.gnu.org/archive/html/lwip-dev...1/msg00016.html
И, кажется, в версии 1.4.1 это уже пофиксили
http://git.savannah.gnu.org/cgit/lwip.git/...8c7d78f6b3bcd97
Bloom
кто-нибудь реализовывал простейшего ftp-клиента на lwip? видел тему 2008 года на сайте разработчиков lwip, но потом они решили что это не относится непосредственно к стеку и удалили с сервера.
MALLOY2
Я делал, FREERTOS+LWIP+FATFS
Как пример может сойдет.
Bloom
Цитата(MALLOY2 @ Dec 11 2012, 14:53) *
Я делал, FREERTOS+LWIP+FATFS
Как пример может сойдет.

спасибо, попробую прикрутить
muravei
Уважаемые, как можно, приблизительно, оценить требуемые ресурсы (быстродействие , рам) для вебсервера с одним клиентом без ОС и некоторым TCPIP стеком? Вебинтерфейс прибора.
scifi
Цитата(muravei @ Dec 16 2012, 13:00) *
Уважаемые, как можно, приблизительно, оценить требуемые ресурсы (быстродействие , рам) для вебсервера с одним клиентом без ОС и некоторым TCPIP стеком? Вебинтерфейс прибора.

У меня самописный веб сервер на lwip без ОС. Собственно lwip+httpd - это 20-30 КБайт кода. ОЗУ - около 20 КБайт, но наверняка можно ещё ужаться. Процессор 32-разрядный 50 МГц (Coldire v2) - всё летает, страницы загружаются за единицы миллисекунд.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.