2010-02-26 9 views
7

मैं फ्रीआरटीओएस का उपयोग कर एक नया एम्बेडेड सिस्टम डिज़ाइन शुरू कर रहा हूं। मेरा आखिरी इस्तेमाल ईकोस का उपयोग करता है, जिसमें एक अंतर्निहित HTTP सर्वर है जो वास्तव में हल्का है, खासकर जब से मेरे पास फाइल सिस्टम नहीं था। जिस तरह से यह काम करता है, संक्षेप में, यह था कि प्रत्येक पृष्ठ एक सीजीआई-जैसे सी फ़ंक्शन था जिसे HTTP डिमन द्वारा आवश्यकतानुसार कॉल किया गया था। विशेष रूप से, आप प्रपत्र के एक समारोह लिखते थे:सी या सी ++ HTTP डिमन एक थ्रेड में?

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

जहां page यूआरएल के पेज हिस्सा था, params किसी भी रूप मानकों थे (केवल GET समर्थित किया गया, पोस्ट नहीं है, जो फ़ाइल अपलोड रोका और इस तरह जल कर दिया फ्लैश एक दर्द), uData उस फ़ंक्शन को पास किया गया है जब आपने फ़ंक्शन पंजीकृत किया था, ताकि आप एक ही फ़ंक्शन को कई यूआरएल या विभिन्न डेटा के साथ श्रेणियों की सेवा कर सकें, और resp एक फाइल हैंडल है जिसे आप HTTP प्रतिक्रिया लिखते हैं (हेडर और सभी) बाहर।

तो फिर तुम साथ समारोह पंजीकृत:

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

जहां CYG_HTTPD_TABLE_ENTRY एक मैक्रो जहां पहले पैरामीटर एक चर नाम था है, दूसरा एक पृष्ठ URL था (* वाइल्डकार्ड अनुमति दी है, इसलिए page को पारित कर दिया हो रही है MyWebPage()), तीसरा फ़ंक्शन पॉइंटर है, और अंतिम uData मान है।

तो एक साधारण उदाहरण:

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

(वास्तव में, params एक समारोह के माध्यम से एचटीएमएल जादू पात्रों से बचने के लिए पारित किया जाना होता है, और मैं बाहर एक और जोड़ी के कार्यों का उपयोग करेंगे पैरामीटर विभाजित करने के लिए और बनाने के एक <ul> इसके बारे में, लेकिन मैंने स्पष्टता के लिए इसे छोड़ दिया।)

सर्वर स्वयं ही एक कार्य (यानी धागा) के रूप में चला गया और जब तक महत्वपूर्ण कार्यों की तुलना में इसकी प्राथमिकता कम थी, तब तक इस तरह से नहीं पहुंच पाया।

कहने की जरूरत नहीं है, यह परीक्षण और डिबगिंग के लिए अमूल्य साबित हुआ है। (एम्बेडेड काम के साथ एक समस्या यह है कि आप आमतौर पर लॉग के रूप में उपयोग करने के लिए एक्सटर्म को टॉस नहीं कर सकते हैं।) तो जब सुप्रीम प्रोग्रामर ने मुझे कुछ काम करने के लिए रिफ्लेक्सिव रूप से दोषी ठहराया (कम से कम प्रतिरोध का मार्ग, मुझे लगता है), तो मैं खींच सकता था वेब पेज और दिखाएं कि उसने मुझे खराब पैरामीटर भेजे हैं। एकीकरण में बहुत सारे डीबग समय बचाया।

तो वैसे भी ... मुझे आश्चर्य है, क्या ऐसा कुछ स्वतंत्र पुस्तकालय के रूप में उपलब्ध है? कुछ जो मैं लिंक कर सकता हूं, मेरे कॉलबैक पंजीकृत कर सकता हूं, थ्रेड फेंक सकता हूं, और जादू कर सकता हूं? या क्या मुझे अपना खुद का क्रैंक करने की ज़रूरत है? मैं सी ++ पसंद करूंगा, लेकिन शायद सी पुस्तकालय का भी उपयोग कर सकता हूं।

संपादित करें: चूंकि मैं इस पर एक बक्षीस डाल रहा हूं, मुझे यह स्पष्ट करने की आवश्यकता है कि लाइब्रेरी को ओपन-सोर्स लाइसेंस के तहत होना आवश्यक है।

उत्तर

4

मैं सुझाव है कि आप libmicrohttpd पर एक नजर है, एम्बेडेड वेब सर्वर:

यह छोटे और तेजी से है, एक साधारण सी एपीआई है बहु सूत्रण का समर्थन करता है एम्बेडेड के लिए उपयुक्त है सिस्टम, POST का समर्थन करता है, वैकल्पिक रूप से एसएसएल/टीएलएस का समर्थन करता है, और एलजीपीएल या ईकोस लाइसेंस (निर्भर करता है) के तहत उपलब्ध है। मेरा मानना ​​है कि यह आपकी सभी आवश्यकताओं को पूरा करता है। यदि आप पसंद करते हैं तो सी ++ में रैपर के लिए यह छोटा होगा।

0

मैं फ्रीआरटीओएस से परिचित नहीं हूं और यह टीसीपी/आईपी और सॉकेट का समर्थन कैसे करता है, इसलिए मैं निश्चित रूप से नहीं कह सकता लेकिन आप गोएड वेब सर्वर पर एक नज़र डालना चाहेंगे। http://embedthis.com/goahead/

+0

फ्रीआरटीओएस अपना आईपी स्टैक प्रदान नहीं करता है, लेकिन यह एलडब्ल्यूआईपी और यूआईपी का समर्थन करता है। असल में, मैं एक लाइब्रेरी के साथ ठीक रहूंगा जो एक सॉकेट-जैसी एपीआई का समर्थन करता है या यदि किसी लाइब्रेरी को मुझे कुछ "इन बाइट्स भेजें" और "उन बाइट्स प्राप्त हुए" कार्यों को लिखने की आवश्यकता है। –

0

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

वास्तव में लगता है कि तुम क्या करने के बाद कर रहे हैं। फ्रीआरटीओएस के तहत इसे चलाने के लिए आपको थोड़ी सी पुनः लिखने की ज़रूरत है, लेकिन यह एक बहुत छोटा, बहुत हल्का वेब सर्वर है।

+0

उस पृष्ठ से: "केवल स्थिर पृष्ठ"। मैं गतिशील पृष्ठ समर्थन की तलाश में हूं (जीईटी और पोस्ट, बाद में शेन फ़्लैश अपलोड समर्थन के लिए आवश्यक)। वैसे भी, यह खरोंच से शुरू करने से बेहतर है। –

2

MongooseGPLv2 के तहत लाइसेंस प्राप्त है और हल्का वजन है (केवल एक सी फ़ाइल को एक नई परियोजना में शामिल करना इतना आसान है)। यह एक अलग धागे में चलाएगा और कॉलबैक का समर्थन करेगा।

+0

वास्तव में करीब दिखता है। मुझे स्रोत को देखने की आवश्यकता है और देखें कि क्या यह '

' पर चकित होगा। अन्य नकारात्मकता यह है कि यह आपके लिए धागा लॉन्च करता है (मुझे लगता है कि POSIX.4a, मुझे लगता है?), लेकिन यह काम करने के लिए एक बड़ा सौदा नहीं होना चाहिए। –

संबंधित मुद्दे