2010-02-26 25 views
7

Tôi đang bắt đầu thiết kế hệ thống nhúng mới bằng FreeRTOS. Người cuối cùng của tôi đã sử dụng eCos, máy chủ HTTP tích hợp thực sự nhẹ, đặc biệt là vì tôi không có hệ thống tệp. Tóm lại, cách thức hoạt động của nó là mỗi trang là một hàm C giống như CGI được gọi khi cần bởi trình tiện ích HTTP. Cụ thể, bạn sẽ viết một hàm có dạng:Daemon C hoặc C++ HTTP trong một chuỗi?

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

nơi page là phần trang của url, params là bất kỳ thông số hình thức (chỉ nhận được hỗ trợ, không POST, trong đó ngăn chặn tập tin tải lên và do đó làm cháy flash là nỗi đau), uData là mã thông báo được đặt khi bạn đăng ký hàm, vì vậy bạn có thể có cùng chức năng phân phối nhiều URL hoặc phạm vi với dữ liệu khác nhau và resp là một tệp xử lý mà bạn viết phản hồi HTTP (tiêu đề và tất cả).

Sau đó, bạn đăng ký chức năng với:

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

nơi CYG_HTTPD_TABLE_ENTRY là một macro nơi tham số đầu tiên là một tên biến, thứ hai là một URL trang (wildcard * được phép, vì vậy page nhận được thông qua để MyWebPage()), thứ ba là con trỏ hàm và cuối cùng là giá trị uData.

Vì vậy, một ví dụ đơn giản:

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

(Trên thực tế, params sẽ được trải qua một chức năng để thoát khỏi nhân vật ma thuật HTML, và tôi muốn sử dụng một vài chức năng để phân chia các params và thực hiện một <ul> ra của nó, nhưng tôi bỏ nó ra cho rõ ràng.)

Máy chủ chính nó chỉ chạy như một nhiệm vụ (tức là chuỗi) và không nhận được theo cách miễn là nó có một ưu tiên thấp hơn so với các nhiệm vụ quan trọng.

Không cần phải nói, việc này đã chứng minh vô giá để thử nghiệm và gỡ lỗi. (Một vấn đề với công việc nhúng là bạn thường không thể ném lên một XTerm để sử dụng như một bản ghi.) Vì vậy, khi tối cao Lập trình đổ lỗi cho tôi cho một cái gì đó không làm việc (con đường của kháng ít nhất, tôi đoán), tôi có thể kéo lên trang web và cho thấy rằng anh ta đã gửi cho tôi thông số xấu. Đã lưu rất nhiều thời gian gỡ lỗi khi tích hợp.

Vì vậy, dù sao ... Tôi tự hỏi, có điều gì đó giống như thư viện độc lập này không? Cái gì mà tôi có thể liên kết trong, đăng ký callbacks của tôi, đẻ trứng một sợi, và để cho nó làm phép thuật? Hay tôi cần phải tự mình ra tay? Tôi thích C++, nhưng có lẽ có thể sử dụng một thư viện C.

EDIT: Vì tôi đang đặt tiền thưởng, tôi cần phải làm rõ rằng thư viện sẽ cần phải nằm trong giấy phép nguồn mở.

Trả lời

4

tôi đề nghị bạn có một cái nhìn tại libmicrohttpd, máy chủ web nhúng:

Nó là nhỏ và nhanh chóng, có một C API đơn giản, hỗ trợ xử lý đa luồng, phù hợp cho nhúng hệ thống, hỗ trợ POST, hỗ trợ tùy chọn SSL/TLS và có sẵn theo giấy phép LGPL hoặc eCos (tùy thuộc). Tôi tin rằng điều này đáp ứng tất cả các yêu cầu của bạn. Nó sẽ là tầm thường để wrapper trong C + + nếu bạn thích.

0

Tôi không quen với FreeRTOS và cách nó hỗ trợ TCP/IP và ổ cắm, vì vậy tôi không thể nói chắc chắn nhưng bạn có thể muốn xem qua máy chủ web GoAhead. http://embedthis.com/goahead/

+0

FreeRTOS không cung cấp ngăn xếp IP riêng, nhưng nó hỗ trợ LwIP và uIP. Về cơ bản, tôi sẽ được tốt với một thư viện hỗ trợ một API giống như ổ cắm hoặc nếu một thư viện cần tôi để viết một số "gửi các byte" và "nhận được những byte" chức năng. –

0

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

Có vẻ chính xác những gì bạn đang sau. Bạn cần phải làm một số lượng nhỏ của viết lại để làm cho nó chạy dưới FreeRTOS nhưng nó là một máy chủ web rất nhỏ, rất nhẹ.

+0

Từ trang đó: "chỉ các trang tĩnh". Tôi đang tìm kiếm hỗ trợ trang động (GET và POST, sau này yêu cầu hỗ trợ tải lên flash sane). Dù sao, nó tốt hơn so với bắt đầu từ đầu. –

2

Mongoose được cấp phép theo GPLv2 và nhẹ (chỉ một tệp C dễ dàng đưa vào dự án mới). Nó sẽ chạy trong một chuỗi riêng biệt và gọi lại hỗ trợ.

+0

Trông rất gần. Tôi cần phải xem xét các nguồn và xem nếu nó sẽ bị nghẹt thở trên '

'. Nhược điểm khác là nó ra mắt các chủ đề cho bạn (giả sử POSIX.4a, tôi đoán?), Nhưng đó không phải là một việc lớn để làm việc xung quanh. –