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.
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". –