2012-10-31 12 views
10

इसलिए मैंने एंड्रॉइड यूएसबी एक्सेसरी एपीआई लागू की है जैसे कि मैं अपने फोन को अपने लैपटॉप में लिनक्स चलाने के लिए प्लग कर सकता हूं और यह फोन को यूएसबी एक्सेसरी मोड में डाल देता है। फिर मैं सहायक का उपयोग कर सकता हूं, इसे खोल सकता हूं, और इसे लिखना शुरू कर सकता हूं। मेरा कोड the documentation में उदाहरण के समान दिखता है। मुख्य अंतर यह है कि मैं अलग-अलग पढ़ने और लिखने के तरीकों का उपयोग कर रहा हूं और मूल कोड से जेएनआई के माध्यम से उन्हें एक्सेस कर रहा हूं।एंड्रॉइड यूएसबी एक्सेसरी से पढ़ना ENODEV IOException

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

इसकी अजीबता को जोड़ने के लिए, मैंने पाया कि अगर मैंने पठित लूप में 100 मीटर नींद डाली है, तो समस्या मूल रूप से दूर हो जाती है (हालांकि यह अभी भी अवसर पर होती है)। वहां सोने में सिर्फ एक भयानक झुकाव नहीं है, लेकिन यह मेरे ऐप में एक असहिष्णु विलंबता पेश करता है। नींद का समय जितना कम होगा, हैक कम प्रभावी होगा, जहां यह नींद के समय 10ms पर अप्रभावी है।

मैं थोक हस्तांतरण का उपयोग करके वास्तविक समय डेटा के लगभग 20-30 केबीपीएस प्रसारित कर रहा हूं (लेकिन इतना वास्तविक समय नहीं कि थोक हस्तांतरण पर्याप्त नहीं होगा), और हस्तांतरण का आकार लगभग 20 से 800 बाइट्स तक है -30Hz। क्या यह यूएसबी की सीमा हो सकती है? मेरे पास इसके साथ अनुभव का एक टन नहीं है, इसलिए मैं मूल रूप से नेटवर्क सॉकेट के समान ही इसका इलाज कर रहा हूं। क्या मुझे छोटे संदेशों को कतारबद्ध करना चाहिए और उन्हें कम बार-बार बड़े हस्तांतरण में एक साथ भेजना चाहिए? क्या छोटे, उच्च-आश आवृत्ति थोक हस्तांतरण में कोई समस्या है? मैं इसमें देख लूंगा, लेकिन मैं मूल रूप से यहां स्ट्रॉ पर पकड़ रहा हूं।

हार्डवेयर:

  • लैपटॉप उबंटू 10.04 चल रहा है और libusb 1.0.0 का उपयोग कर रहा है।
  • फ़ोन गैलेक्सी नेक्सस एस चल रहा स्टॉक एंड्रॉइड 4.1.2 है।

उत्तर

6

तो, जबकि मैं अभी भी जो भी हो रहा है उसे समझ नहीं पा रहा हूं, एक डबल-बफरिंग योजना को लागू करने से मेरी समस्या ठीक हो गई है।

मुझे पता चला कि पूर्ण गति से एक जावा एंड्रॉइड ऐप पढ़ने से ईएनओडीईवी समस्या के साथ कोई समस्या नहीं थी, जो मुझे निष्कर्ष तक पहुंचाती है कि जावा मूल इंटरफेस मेरी समस्याओं का मूल था।

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

मेरा फ़िक्स जावा-केवल थ्रेड (कोई जेएनआई कॉल) से UsbAccessory को पढ़ने/लिखना था और फिर उस डेटा को जेएनआई द्वारा बुलाए गए तरीकों से पढ़ने/लिखने के लिए बफर करना था।

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

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