Я запускаю новое использование дизайна встроенной системы FreeRTOS. Мой последний использовал eCos, который имеет встроенный сервер HTTP, это действительно легко, тем более, что у меня не было файловой системы. Путем это работало, короче говоря, был то, что каждая страница была подобной CGI функцией C, которая была вызвана при необходимости демону HTTP. А именно, Вы записали бы функцию формы:
int MyWebPage(FILE* resp, const char* page, const char* params, void* uData);
где page
была часть страницы URL, params
были какие-либо параметры формы (только ДОБИРАЮТСЯ, поддерживался, не POST, который предотвратил загрузки файла и таким образом сделал запись флэш-памяти болью), uData
маркер, переданный в этом, был установлен, когда Вы зарегистрировали функцию, таким образом, у Вас могла быть та же функциональная подача несколько URL или диапазонов с различными данными, и resp
дескриптор файла, к которому Вы пишете ответ HTTP (заголовки и все).
Затем Вы зарегистрировали функцию с:
CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0);
где CYG_HTTPD_TABLE_ENTRY
макрос, где первый параметр был именем переменной, второй была страница URL ( *
подстановочный знак позволяется; следовательно page
быть переданным MyWebPage()
), треть является указателем функции и в последний раз uData
значение.
Так простой пример:
int HelloWorldPage(FILE* resp, const char*, const char* params, void*)
{
fprintf("Content-Type: text/html;\n\n");
fprintf("<html><head><title>Hello World!</title></head>\n");
fprintf("<body>\n");
fprintf("<h1>Hello, World!</h1>\n");
fprintf("<p>You passed in: %s</p>\n", params);
fprintf("</body></html>\n");
}
CYG_HTTPD_TABLE_ENTRY(www_hello, "/", HelloWorldPage, 0);
(На самом деле, params
был бы передан через функцию для выхода из символов волшебства HTML, и я буду использовать другую пару функции, чтобы разделить параметрические усилители и сделать a <ul>
из него, но я пропустил это для ясности.)
Сам сервер просто работал как задача (т.е. поток) и не помешал, пока это имело более низкий приоритет, чем критические задачи.
Само собой разумеется, доказывая это неоценимое для тестирования и отладки. (Одна проблема со встроенной работой состоит в том, что Вы обычно не можете бросать XTerm для использования в качестве журнала.) Поэтому, когда Высший Программист рефлексивно обвинил меня в чем-то не работающем (путь наименьшего сопротивления, я предполагаю), я мог потянуть веб-страницу и показать, что он отправил мне плохо параметры. Сохраненный много времени отладки в интеграции.
Так так или иначе... Я задаюсь вопросом, действительно ли там что-то вроде этого доступно как независимая библиотека? Что-то, в чем я могу связаться, регистрирует мои обратные вызовы, порождает поток и позволяет ему сделать волшебство? Или я должен провернуть свое собственное? Я предпочел бы C++, но могу, вероятно, пользоваться библиотекой C также.
Править: Так как я помещаю щедрость на него, я должен разъяснить, что библиотека должна была бы находиться под лицензией с открытым исходным кодом.
Я предлагаю вам взглянуть на libmicrohttpd, встроенный веб-сервер:
Он маленький и быстрый, имеет простой C API, поддерживает многопоточность, подходит для встроенных систем, поддерживает POST, опционально поддерживает SSL/TLS, и доступен под лицензией LGPL или eCos (в зависимости от ситуации). Я считаю, что это удовлетворяет всем вашим требованиям. Если вы предпочитаете, его можно тривиально обернуть в C++.
Я не знаком с FreeRTOS и тем, как она поддерживает TCP/IP и сокеты, поэтому не могу сказать наверняка, но вы можете взглянуть на веб-сервер GoAhead. http://embedthis.com/goahead/
http://www.ibm.com/developerworks/systems/library/es-nweb/index.html
Кажется, именно то, что вам нужно . Мне нужно немного переписать, чтобы заставить его работать под FreeRTOS, но это очень маленький и очень легкий веб-сервер.
Mongoose находится под лицензией GPLv2 и имеет небольшой вес (всего один файл C так легко включить в новый проект). Он будет работать в отдельном потоке и поддерживать обратные вызовы.