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