2010-02-26 14 views
7

Estoy comenzando un nuevo diseño de sistema integrado usando FreeRTOS. Mi último uso eCos, que tiene un servidor HTTP integrado que es realmente liviano, especialmente porque no tenía un sistema de archivos. La forma en que funcionaba, en resumen, era que cada página era una función C tipo CGI que recibía una llamada cuando era necesario por el daemon HTTP. En concreto, podría escribir una función de la forma:Demonio HTTP C o C++ en un hilo?

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

donde page era la parte página del URL, params eran los parámetros de formulario (sólo se les fue apoyada, se debe publicar, lo que impidió la carga de archivos y por lo tanto hizo quema el flash es un dolor), uData es un token pasado en que se estableció cuando registró la función, por lo que podría tener la misma función servir múltiples URL o rangos con datos diferentes, y resp es un identificador de archivo que escribe la respuesta HTTP (encabezados y todo) a.

Entonces registró la función con:

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

donde CYG_HTTPD_TABLE_ENTRY es una macro en el que el primer parámetro era un nombre de variable, el segundo era un URL de la página (se permite el comodín *, por lo page conseguir pasar a MyWebPage()), el tercero es el puntero a la función, y el último es el valor uData.

Así, un ejemplo sencillo:

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); 

(En realidad, params se pasó a través de una función para escapar de los personajes mágicos HTML, y me gustaría usar otro par de funciones para dividir los parametros y hacer una <ul> a cabo de eso, pero lo dejé para mayor claridad.)

El servidor solo se ejecutó como una tarea (es decir, hilo) y no se interpuso en el camino, siempre que tuviera una prioridad menor que las tareas críticas.

No hace falta decir que tener esto resultó invaluable para las pruebas y la depuración. (Un problema con el trabajo incorporado es que generalmente no se puede usar un XTerm para usarlo como un registro). Así que cuando el Programador Supremo me culpó instintivamente de que algo no funcionaba (un camino de menor resistencia, supongo), pude sacar el página web y mostrar que me había enviado malos parámetros. Ahorro mucho tiempo de depuración en la integración.

De todos modos ... Me pregunto, ¿hay algo como esto disponible como una biblioteca independiente? Algo con lo que puedo vincular, registrar mis devoluciones de llamada, generar un hilo y dejar que haga la magia. ¿O necesito sacar mi propio? Preferiría C++, pero probablemente también pueda usar una biblioteca C.

EDITAR: Dado que le estoy dando una recompensa, necesito aclarar que la biblioteca necesitaría estar bajo una licencia de código abierto.

Respuesta

4

le sugiero que eche un vistazo a libmicrohttpd, el servidor Web incorporado:

Es pequeño y rápido, tiene una sencilla API C, soporta múltiples hilos, es adecuado para dispositivos integrados sistemas, admite POST, opcionalmente es compatible con SSL/TLS, y está disponible bajo la licencia LGPL o eCos (dependiendo). Creo que esto cumple todos sus requisitos. Sería trivial para envolverse en C++ si lo prefiere.

0

No estoy familiarizado con FreeRTOS y la forma en que es compatible con TCP/IP y sockets, por lo que no puedo decir con seguridad, pero es posible que desee echar un vistazo al servidor web GoAhead. http://embedthis.com/goahead/

+0

FreeRTOS no proporciona su propia pila de IP, pero admite LwIP y uIP. Básicamente, estaré bien con una biblioteca que admita una API tipo sockets o si una biblioteca necesita que escriba algunas funciones de "enviar estos bytes" y "recibir esos bytes". –

0

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

parecen exactamente lo que está después. Usted necesita hacer una pequeña cantidad de reescritura para que se ejecute en FreeRTOS, pero es un servidor web muy pequeño y muy liviano.

+0

Desde esa página: "páginas estáticas solamente". Estoy buscando soporte dinámico de páginas (GET y POST, este último requerido para una buena carga de flash). De todos modos, es mejor que empezar de cero. –

2

Mongoose tiene licencia bajo GPLv2 y es liviano (solo un archivo C es tan fácil de incluir en un nuevo proyecto). Funcionará en un hilo separado y soportará devoluciones de llamada.

+0

Se ve muy cerca. Necesito mirar a través de la fuente y ver si se ahogará en '

'. Otra desventaja es que lanza el hilo por ti (supone POSIX.4a, ¿supongo?), Pero eso no debería ser una gran oferta. –