2012-04-22 24 views
6

मैं ईथरनेट आधारित बेडसाइड नर्स कॉल डिवाइस विकसित करने के लिए फ्रीआरटीओएस + एलडब्ल्यूआईपी का उपयोग कर रहा हूं। कुछ उदाहरण और दस्तावेज पढ़ने के बाद, मैं टीसीपी के तहत डेटा भेजने और प्राप्त करने के लिए एलडब्ल्यूआईपी के नेटकॉन एपीआई का उपयोग करना चाहता हूं, क्योंकि मैं बीएसडी स्टाइल एपीआई से परिचित नहीं हूं और कच्ची एपीआई मुश्किल हो सकती है।एलडब्ल्यूआईपी - नेटकॉन एपीआई - प्रक्रिया अवरुद्ध होने पर एक टीसीपी पैकेट भेजें?

मैं जानता हूँ कि netconn_accept() समारोह प्रक्रिया को अवरुद्ध कर देगा जब तक एक दूरस्थ होस्ट से एक कनेक्शन अनुरोध आ गया, और डेटा के आने का इंतजार करते हुए netconn_recv() समारोह भी इस प्रक्रिया को अवरुद्ध कर देगा ... इन कार्यों के दोनों होगा ब्लॉक प्रक्रिया, यह डेटा प्राप्त करने वाले सर्वर के लिए अच्छा है, हालांकि, मेरे डिवाइस को क्लाइंट के रूप में कार्य करने की भी आवश्यकता होती है, जिसे रोगी को बटन दबाते समय नर्स सेंटर में 'कॉल' ट्रिगर करने की आवश्यकता होती है। तो यह एक टीसीपी पैकेट भेजने के लिए कैसे शुरू कर सकता है, जबकि यह रिमोट होस्ट से कनेक्शन (प्रक्रिया को अवरुद्ध कर रहा है) भी इंतजार कर रहा है?

मुझे टीसीपी भेजने की आवश्यकता है क्योंकि मुझे कॉल शुरू करने के लिए एसआईपी (सत्र आरंभ प्रोटोकॉल) का उपयोग करना होगा, यह विश्वसनीय होना चाहिए क्योंकि यह एक चिकित्सा उपकरण है। आपको बहुत बहुत धन्यवाद


@Kyle Heironimus, @werewindle मैं तुम्हें मेरे सवाल करने के लिए जोड़ क्योंकि मुझे पता है तुम LwIP पर अनुभव, आशा है कि आप असुविधा नहीं होगा और आशा है कि आप मदद कर सकता है, धन्यवाद।

+0

जैसा कि मैं फ्रीआरटीओएस का उपयोग कर रहा हूं, आज मैंने दो धागे का उपयोग करने की कोशिश की, एक कनेक्शन के लिए इंतज़ार कर रहे एक सर्वर के रूप में, एक ग्राहक के रूप में एक आवश्यक होने पर एक टीसीपी कनेक्शन खोलने के लिए। सर्वर थ्रेड अच्छी तरह से कर रहा है, लेकिन क्लाइंट साइड पर, जब मैं 'netconn_connect()' कहता हूं तो यह हमेशा त्रुटि लौटाता है ... मैंने सर्वर और क्लाइंट के लिए एक ही और अलग पोर्ट का उपयोग करने की कोशिश की, लेकिन अभी भी – eepty

उत्तर

6

आप किसी कनेक्शन को शुरू करने से पहले रिमोट होस्ट को डेटा नहीं भेज सकते हैं। यह सिर्फ कोई समझ नहीं आता है। मेरा सवाल है: क्या आप चाहते हैं कि आपका डिवाइस रिमोट होस्ट से कनेक्ट हो, या आप चाहते हैं कि रिमोट होस्ट आपके डिवाइस से कनेक्शन शुरू करे?

अभी आप अपने डिवाइस में netconn_accept का उपयोग कर रहे हैं - इसका मतलब है कि आप रिमोट होस्ट को रिमोट होस्ट को सिग्नल करने से पहले अपने डिवाइस से कनेक्शन शुरू करने का इंतजार कर रहे हैं। आपके द्वारा लिखे गए कोड के लिए यह पूरी तरह से अपेक्षित व्यवहार है, फिर भी आप इसके बारे में चिंतित हैं। क्या यह आपका इरादा नहीं है? यदि नहीं, तो आपने इसे इस तरह क्यों कोड किया? दूसरा विकल्प यह है कि आपके डिवाइस को रिमोट होस्ट से कनेक्शन शुरू करना है। Netconns here के उस उपयोग का एक उदाहरण है। बेशक, इसमें आपके सिस्टम में अन्य डिवाइस में भी बदलाव शामिल हैं।

तो उस कहानी का नैतिक यह है कि जब कोई कनेक्शन मौजूद नहीं होता है तो आप कोई डेटा नहीं भेज सकते हैं, और आप डेटा भेजने से पहले कनेक्शन की प्रतीक्षा कर रहे हैं। आप कनेक्शन की प्रतीक्षा नहीं करना चाहते हैं, इसलिए आपको दूसरी तरफ इसे शुरू करने के बजाय कनेक्शन शुरू करने के लिए अपने सॉफ़्टवेयर को बदलना होगा।

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

यह मेरे लिए काम करता है जब मैंने एक सुनवाई नेटकॉन कनेक्शन बनाया।

#define LWIP_SO_RCVTIMEO 1

तो फिर तुम यह करने के लिए इसी तरह अपने netconn स्थापित करने के लिए है:

pxTCPListener =

सबसे पहले, आप की स्थापना करके समय समाप्ति सक्षम करने के लिए netconn_new (NETCONN_TCP);

netconn_bind (pxTCPListener, NULL, 23);

netconn_listen (pxTCPListener);

pxNewConnection = netconn_accept (pxTCPListener); // कनेक्शन को स्वीकार किए जाने तक यह ब्लॉक

// यह महत्वपूर्ण पंक्ति है!

pxNewConnection-> recv_timeout = 10; // ध्यान दें यह millseconds है - lwip एमएस में काम करता है

// यह लूप जब तक कनेक्शन बंद कर दिया है

जबकि (ERR_IS_FATAL (pxNewConnection-> अं)!) {// घातक त्रुटियों कनेक्शन किया जा रहा बंद कर दिया शामिल हैं, रीसेट , निरस्त किया गया, आदि

// यह netconn_recv कॉल अब कोई नया डेटा के लिए 10ms इंतजार करेंगे, तो लौट

अगर ((pxRxBuffer = netconn_recv (pxNewConnection))! = शून्य) {

// हैंडल प्राप्त करें घ डेटा

}

// यहाँ, किसी भी आप

} //

ऊपर से, जबकि पाश

का अंत चाहते हैं यही कारण है कि कोड आप संचारित करने की अनुमति देगा पहुंचाता है और कम से प्राप्त करता है कर अवरुद्ध करने के बारे में चिंता किए बिना एक ही समय।

+0

विफल रहा धन्यवाद स्टीफन, नर्स कॉल डिवाइस एक सर्वर के रूप में कार्य करेगा, कनेक्शन की प्रतीक्षा कर रहा है, – eepty

+0

हाँ ... वह क्यों है? ऐसा लगता है कि कॉल डिवाइस को सर्वर से कनेक्शन शुरू करना चाहिए क्योंकि यह सब कुछ ट्रिगर करता है जो किसी से कनेक्ट करने के बजाय किसी बटन को दबाकर किसी बटन को दबाता है, जिससे यह कह सकता है कि एक बटन दबाया गया था। –

+0

आपके लिए विस्तृत विवरण स्टीफन के लिए बहुत बहुत धन्यवाद। डिवाइस एक फोन की तरह है, यह सामान्य रूप से कनेक्शन के लिए इंतजार कर रहा है, सर्वर के रूप में कार्य करता है, लेकिन यदि कोई व्यक्ति उस पर एक बटन दबाता है, तो यह एक कनेक्शन शुरू करेगा, क्लाइंट के रूप में कार्य करेगा। ये दो स्थितियां एक ही समय में मौजूद नहीं होंगी, और दोनों स्थितियों में प्राप्त और संचार शामिल है। हाल ही में मैं इन दो कार्यों को अलग-अलग लागू करने में सफल रहा हूं .. एक लंबे पढ़ने के बाद ... मैंने उन्हें फ्रीआरटीओएस में दो अलग-अलग कार्यों में विभाजित किया, जिससे एक कार्य दूसरे को अवरुद्ध कर देगा। मैंने प्रत्येक कार्य को अलग से परीक्षण किया है लेकिन उन्हें एक साथ चलने का परीक्षण नहीं किया है ... मैं आरटीओएस के लिए नया हूं लेकिन मैं – eepty