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