2010-02-26 12 views
7

Sto avviando un nuovo progetto di sistema incorporato utilizzando FreeRTOS. Il mio ultimo ha usato eCos, che ha un server HTTP incorporato che è davvero leggero, soprattutto perché non avevo un filesystem. Il modo in cui funzionava, in breve, era che ogni pagina era una funzione C CGI che veniva chiamata quando necessario dal demone HTTP. In particolare, si potrebbe scrivere una funzione della forma:Daemon HTTP C o C++ in una discussione?

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

dove page era la parte pagina del URL, params erano tutti i parametri di forma (ottiene solo è stata sostenuta, non pubblicare, che ha impedito il caricamento di file, e quindi ha fatto la masterizzazione il flash è un dolore), uData è un token passato che è stato impostato quando hai registrato la funzione, così potresti avere la stessa funzione servire più URL o intervalli con dati diversi, e resp è un handle di file che scrivi la risposta HTTP (intestazioni e tutti) fuori.

Quindi è registrata la funzione con:

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

dove CYG_HTTPD_TABLE_ENTRY è una macro in cui il primo parametro è un nome di variabile, il secondo era un URL della pagina (la * jolly è consentito, di conseguenza page sempre passato al MyWebPage()), il terzo è il puntatore della funzione e l'ultimo è il valore uData.

Quindi, un semplice esempio:

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

(In realtà, params sarebbe passato attraverso una funzione per sfuggire ai personaggi magici HTML, e userei un altro paio di funzioni di dividere i params e fare una <ul> fuori di esso, ma l'ho lasciato fuori per chiarezza.)

Il server stesso ha funzionato come un'attività (cioè thread) e non si è intromesso finché ha avuto una priorità inferiore rispetto alle attività critiche.

Inutile dire che questo si è rivelato prezioso per il test e il debug. (Un problema con il lavoro incorporato è che generalmente non si può lanciare un XTerm da usare come log.) Quindi, quando il programmatore supremo mi ha incolpato di qualcosa che non funziona (percorso di minima resistenza, immagino), potrei tirare su pagina web e mostra che mi ha inviato parametri errati. Risparmiato un sacco di tempo di debug in integrazione.

Quindi, comunque ... Mi chiedo, c'è qualcosa di simile disponibile come libreria indipendente? Qualcosa a cui posso collegarmi, registrare le mie callback, generare una discussione e lasciare che faccia la magia? O ho bisogno di sfornare il mio? Preferirei C++, ma probabilmente posso anche usare una libreria C.

MODIFICA: Poiché applico una taglia su di essa, ho bisogno di chiarire che la libreria avrebbe bisogno di essere sotto una licenza open source.

risposta

4

vi consiglio di dare un'occhiata al libmicrohttpd, il server Web incorporato:

E 'piccolo e veloce, ha una semplice API C, supporta il multithreading, è adatto per Embedded sistemi, supporta POST, opzionalmente supporta SSL/TLS ed è disponibile sotto licenza LGPL o eCos (a seconda dei casi). Credo che questo soddisfi tutte le tue esigenze. Se preferisci, sarebbe banale usare il wrapper in C++.

0

Non ho familiarità con FreeRTOS e come supporta TCP/IP e socket, quindi non posso dirlo con certezza, ma potresti dare un'occhiata al server web GoAhead. http://embedthis.com/goahead/

+0

FreeRTOS non fornisce il proprio stack IP, ma supporta LwIP e uIP. Fondamentalmente, starò bene con una libreria che supporta un'API tipo socket o se una libreria ha bisogno di me per scrivere alcune funzioni "invia questi byte" e "ricevute quei byte". –

0

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

sembra esattamente che cosa siete dopo. Il mio bisogno di fare una piccola quantità di riscrittura per farlo funzionare con FreeRTOS ma è un server web molto piccolo e molto leggero.

+0

Da quella pagina: "solo pagine statiche". Sto cercando supporto per pagine dinamiche (GET e POST, quest'ultimo è richiesto per il supporto di caricamento flash sensato). Ad ogni modo, è meglio che partire da zero. –

2

Mongoose è concesso in licenza GPLv2 ed è leggero (solo un file C è così facile da includere in un nuovo progetto). Verrà eseguito in un thread separato e supporterà i callback.

+0

Sembra davvero vicino. Ho bisogno di guardare attraverso la fonte e vedere se soffocherà su '

'. Altro svantaggio è che lancia il thread per te (ipotizza POSIX.4a, immagino?), Ma non dovrebbe essere un grosso problema da risolvere. –