2010-02-26 2 views
7

저는 FreeRTOS를 사용하여 새로운 임베디드 시스템 디자인을 시작하고 있습니다. 마지막으로 eCos를 사용했는데, HTTP 서버가 내장되어 있습니다. 특히 파일 시스템이 없기 때문에 실제로 가볍습니다. 간단히 말해서 모든 페이지는 HTTP 데몬이 필요할 때 호출되는 CGI와 유사한 C 함수였습니다. 특히,이 형태의 함수 작성합니다 URL의 페이지 부분이었다 page스레드의 C 또는 C++ HTTP 데몬?

int MyWebPage(FILE* resp, const char* page, const char* params, void* uData); 

params는 어떤 형태의 매개 변수였다을 (단지 지원 GET, 파일 업로드를 방지하고, 따라서 연소를하게하는 게시하지 플래시가 아프다), uData은 함수를 등록 할 때 전달 된 토큰이며, 동일한 기능을 여러 데이터 나 다른 범위의 URL로 제공 할 수 있습니다. resp은 HTTP 응답을 작성하는 파일 핸들입니다 헤더와 모두) 밖으로.

그런 다음 당신이 기능 등록 : CYG_HTTPD_TABLE_ENTRY는 첫 번째 매개 변수는 변수 이름이었다 매크로입니다

CYG_HTTPD_TABLE_ENTRY(www_myPage, "/", MyWebPage, 0); 

가, 두 번째는 페이지의 URL을했다합니다 (* 와일드 카드가 허용되고, 따라서 page를 전달하기 MyWebPage()), 세 번째는 함수 포인터이고 last는 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 마법 문자를 이스케이프하는 함수를 통해 전달 될 것입니다, 나는 밖으로 <ul>을 PARAMS을 분할하는 또 다른 커플 기능을 사용 할 것).

서버 자체가 단지 작업 (즉 스레드)으로 실행되었지만 중요한 작업보다 우선 순위가 낮은 한 방해를받지 않았습니다.

말할 필요도없이 테스트 및 디버깅에이 값이 매우 중요한 것으로 입증되었습니다. (임베디드 작업에 대한 하나의 문제는 대개 로그로 사용하기 위해 XTerm을 버릴 수 없다는 것입니다.) 그래서 Supreme Programmer가 반사적으로 작동하지 않는 것을 비난했을 때 (최소한의 저항의 경로, 나는 짐작할 수 있습니다) 그가 나쁜 매개 변수를 보냈다는 것을 보여줍니다. 통합에 많은 디버깅 시간을 절약했습니다.

어쨌든 ... 나는 이 (가) 독립적 인 라이브러리로 제공하고 있습니까? 내가 연결할 수 있고, 콜백을 등록하고, 스레드를 생성하고, 마술을 할 수있는 것이 있습니까? 아니면 내 자신을 밖으로 크랭크 필요합니까? C++을 선호하지만 아마도 C 라이브러리도 사용할 수 있습니다.

EDIT : 나는 그것에 현상금을 넣었으므로 라이브러리가 오픈 소스 라이센스하에 있어야 할 필요가 있음을 명확히해야합니다.

답변

4

난 당신이 libmicrohttpd에서 봐 가지고 제안, 내장 웹 서버 :

그것은 작고 빠르다는, 간단한 C API를 가지고 멀티 스레딩을 지원하는 임베디드에 적합 시스템을 지원하고, POST를 지원하며, 선택적으로 SSL/TLS를 지원하며 LGPL 또는 eCos 라이센스 (사용 가능)로 제공됩니다. 나는 이것이 당신의 모든 요구 사항을 충족 시킨다고 믿습니다. 당신이 선호한다면 C++의 래퍼는 사소할 것이다.

0

저는 FreeRTOS와 TCP/IP 및 소켓을 지원하는 방법에 익숙하지 않으므로 확실히 말할 수는 없지만 GoAhead 웹 서버를 살펴보고 싶을 수도 있습니다. http://embedthis.com/goahead/

+0

FreeRTOS는 자체 IP 스택을 제공하지 않지만 LwIP 및 uIP를 지원합니다. 기본적으로 소켓과 같은 API를 지원하는 라이브러리 나 라이브러리에서 "send bytes"및 "bytes bytes"함수를 작성해야하는 라이브러리가 있으면 좋을 것입니다. –

0

http://www.ibm.com/developerworks/systems/library/es-nweb/index.html

당신이 후에 무엇 정확하게 보인다. FreeRTOS에서 실행할 수 있도록 소량의 재 작성을해야하지만 매우 작고 가벼운 웹 서버가 필요합니다.

+0

해당 페이지에서 "정적 페이지 만". 나는 동적 페이지 지원 (GET 및 POST, 후자는 정상적인 플래시 업로드 지원 필요)을 찾고있다. 어쨌든 처음부터 시작하는 것보다 낫습니다. –

2

MongooseGPLv2에 따라 사용이 허가되며 가볍습니다 (새 프로젝트에 포함하기 쉬운 하나의 C 파일). 그것은 별도의 스레드에서 실행되며 콜백을 지원합니다.

+0

정말 가까이에 있습니다. 나는 소스를 살펴보고'

'에 질식 할 것인지를 확인해야한다. 다른 단점은 그것이 당신을 위해 스레드를 시작한다는 것입니다 (POSIX.4a를 가정합니다.)하지만, 큰 문제는 아닙니다. –