2015-06-04 17 views
19

तक पहुंचने का प्रयास करते समय libusb_open_device_with_vid_pid विफल रहा है मैं एंड्रॉइड 5.1.1 डिवाइस से कनेक्ट करने के लिए एक यूएसबी डिवाइस प्राप्त करने का प्रयास कर रहा हूं। पहले मैं किटकैट के लिए नियमित libusb का उपयोग कर रहा था, लेकिन लॉलीपॉप सुरक्षा में वृद्धि हुई है और यह अब काम नहीं करता है।यूएसबी डिवाइस

यह अच्छी तरह से प्रलेखित है, जिसमें SELinux स्तर सेट करने के लिए रूट की आवश्यकता है। मैं यूएसबी डिवाइस से कनेक्ट करने के लिए डिवाइस को रूट करना नहीं चाहता हूं।

चारों ओर देखा, मैं this answer में आए और मैं this libusb fork की कोशिश की है, हालांकि अब मैं एक नया त्रुटि

libusb_open_device_with_vid_pid (29c2) failed. 
Failed to setup USB 
usb_setup: -1 

हो रही है मैं कोड के किसी भी केवल पुस्तकालय नहीं बदली है,।

क्या यह अभी भी एक अनुमति मुद्दा है, या क्या ऐसा कुछ है जो मुझे याद आ रहा है जो यह काम करेगा?

उत्तर

14

आपके द्वारा उल्लिखित मुद्दों को हल करने के लिए निम्नलिखित चरणों का उपयोग किया जा सकता है।

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

आप USB होस्ट API के साथ कार्य करने से पहले अपने एप्लिकेशन की मेनिफेस्ट फ़ाइल को जोड़ने की जरूरत है:

  • क्योंकि नहीं सभी एंड्रायड-संचालित डिवाइस USB होस्ट एपीआई समर्थन की गारंटी है, एक तत्व है कि वाणी शामिल अपने एप्लिकेशन android.hardware.usb.host सुविधा का उपयोग करता है।
  • यदि आप चाहते हैं कि आपका एप्लिकेशन संलग्न यूएसबी डिवाइस के बारे में अधिसूचित किया जाए, तो अपनी मुख्य गतिविधि में android.hardware.usb.action.USB_DEVICE_ATTACHED इरादे के लिए एक और तत्व जोड़ी निर्दिष्ट करें।

जोड़ें अपने manisfest फाइल करने के लिए USB_DEVICE_ATTACHED:

<manifest ...> 
    <uses-feature android:name="android.hardware.usb.host" /> 
    <uses-sdk android:minSdkVersion="12" /> 
    ... 
    <application> 
     <activity ...> 
      ... 
      <intent-filter> 
       <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
      </intent-filter> 

      <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
      android:resource="@xml/device_filter" /> 
     </activity> 
    </application> 
</manifest> 

अपने एपीपी एक विशेष USB डिवाइस आप लक्ष्य फ़िल्टर उपयोग कर सकते हैं खोजने में मदद करने के लिए:

<activity ...> 
    ... 
    <intent-filter> 
     <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" /> 
    </intent-filter> 

    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
    android:resource="@xml/device_filter" /> 
</activity> 

आप अपने डिवाइस निर्दिष्ट करने के लिए भी है और विक्रेता आईडी:

<?xml version="1.0" encoding="utf-8"?> 

<resources> 
    <usb-device vendor-id="1234" product-id="5678" /> 
</resources> 

यह शू उल USB host कनेक्शन से निपटने के लिए पर्याप्त हो।

int LIBUSB_CALL libusb_open2(libusb_device *dev, libusb_device_handle **handle, int fd); 

उपयोग वर्णनकर्ता usb device से कनेक्शन खोलने में - उदाहरण के लिए:: अब यूएसबी फोन

UsbManager myUsbManager = (UsbManager) 
getSystemService(Context.USB_SERVICE); 
UsbAccessory myUsbAccessory = (myUsbManager.getAccessoryList())[0]; 
ParcelFileDescriptor pfd = myUsbManager.openAccessory(myUsbAccessory); 
FileDescriptor fileDescriptor = pfd.getFileDescriptor(); 
FileInputStream myFileInputStream = new FileInputStream(fileDescriptor); 
FileOutputStream myFileOutputStream = new FileOutputStream(fileDescriptor); 

आप अभी भी SELinux स्तर के साथ समस्या है, तो यहां आपको कुछ संपादन में आप बनाने के लिए उपयोग कर सकते हैं अपने कार्यक्रम सुचारू रूप से संचालित:

// default.prop 
ro.secure=1    -----------------> ro.secure=0 
ro.adb.secure=1  -----------------> ro.adb.secure=0 

//init.rc 
setsebool debugfs 1 --------> setsebool debugfs 0 
setenforce 0 
setprop selinux.reload_policy 1 -------> setprop selinux.reload_policy 0 

// init.target.rc 
setprop selinux.reload_policy 1 -----> setprop selinux.reload_policy 0 

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

enter image description here

अपने Android के निर्माता और मॉडल के आधार पर, यूएसबी केबल आपके डिवाइस और डेस्कटॉप को जोड़ने अनप्लग प्रयास करें, और उसे वापस प्लग। आप भंडारण "USB चालू करें" करने के लिए प्रेरित किया जाना चाहिए। यदि ऐसा है, तो आगे बढ़ें और एंड्रॉइड पर सेटिंग्स → अधिक ... पर ब्राउज़ करने का प्रयास करें, और यूएसबी मास स्टोरेज विकल्प की तलाश करें।

http://www.pocketables.com/images/old/6a00d83451c9ec69e201675f40c44a970b-500wi.png

वैकल्पिक रूप से USB विपुल भंडारण प्रक्रिया अपने उपकरण निर्माता द्वारा सिफारिश के लिए देखो। जब आप यूएसबी स्टोरेज चालू करते हैं, तो डिवाइस आपको बताता है कि कुछ ऐप्स रुक जाएंगे, आगे बढ़ें और ठीक है। अब अपने डेस्कटॉप कंप्यूटर पर जाएं और अपने यूएसबी मास स्टोरेज माध्यम पर ब्राउज़ करें, जिसे अक्सर नाम नहीं कहा जाता है यदि आपने इसका नाम बदल नहीं लिया है। अपने बड़े भंडारण डिवाइस पर क्लिक करें, और वहां पैर फ़ोल्डर में, data.tsv नामक फ़ाइल ढूंढें।

enter image description here

तुम भी अपने पसंदीदा पाठ संपादक में खोलने से data.tsv देख सकते हैं। आपको एक टैब द्वारा अच्छी तरह से अलग किए गए दो कॉलम मिलेंगे; प्रत्येक पंक्ति में, आपको पूर्णांक मानों की एक जोड़ी मिल जाएगी। यह हमारी परियोजना के लिए पूरी तरह से पर्याप्त है। अधिक जटिल डेटा परियोजनाओं को आम तौर पर प्रत्येक पंक्ति के लिए एक अद्वितीय पहचानकर्ता की आवश्यकता होती है, एक तालिका में एक पंक्ति दूसरे में एक विशिष्ट रिकॉर्ड को इंगित करने के लिए।

enter image description here

अपने development environment के अनुसार, आप भी धुन पर अपनी सेटिंग्स तदनुसार की है। यदि आप विंडोज़ पर विकास कर रहे हैं, तो यूएसबी ड्राइवर स्थापना instructions available का पालन करें। यदि आप लिनक्स पर विकास कर रहे हैं, तो विकास के लिए अपने डिवाइस setting up के निर्देशों का पालन करें।

enter image description here

इसके अलावा, यह भी है कि कई पूर्व में जारी एंड्रायड-संचालित डिवाइस एक यूएसबी डिवाइस के रूप में अभिनय के ही लायक हैं और बाहरी USB उपकरणों के साथ कनेक्शन आरंभ नहीं कर सकते हैं उल्लेख करने के लिए लायक है। एंड्रॉइड ओपन एक्सेसरी (एओए) समर्थन इस सीमा को खत्म करता है और आपको एक्सेसरीज़ बनाने की अनुमति देता है जो एक्सेसरी को connection शुरू करने की इजाजत देकर एंड्रॉइड संचालित उपकरणों के वर्गीकरण के साथ बातचीत कर सकता है। एंड्रॉइड ओपन एक्सेसरी के सामान्य उपयोग का एक उदाहरण प्रोजेक्ट में पाया जा सकता है: रिकॉर्ड करें और USB host mode का उपयोग करके ऑडियो वापस चलाएं - निश्चित रूप से यूएसबी मोड को चलाने और चलाने की आवश्यकता है।

enter image description here

एंड्रॉयड लाना Arduino microcontrolers साथ USB के माध्यम से संवाद करने के लिए भी लागू करने की एक प्रकार है कि, सबसे हाल ही में बहुत सफल बनने के लिए के रूप में यह आप अपने Android क्षमताओं एक बहु डिवाइस के माध्यम से अतिरिक्त सुविधाओं को एकीकृत का विस्तार करने की अनुमति देता है पता चला है समाधान दृष्टिकोण। एक ठेठ Arduino स्केच अपने Android यूएसबी डिवाइस संचार इस प्रकार दिखाई देगा अनुमति देने के लिए:

// the USB Host libraries 
#include <Max3421e.h> 
#include <Usb.h> 
// the AOA library 
#include <AndroidAccessory.h> 

void setup(); 
void loop(); 

void setup() 
{ // start serial debugging 
    Serial.begin(115200); 
    Serial.print("\r\nADK has run setup()."); 
    Serial.println("Ready to start USB communication..."); 
} 

void loop() 
{ // example - read the voltage from a sensor 
    uint16_t val; 
    val = analogRead(TEMP_SENSOR); // or any sort of input 
    Serial.println(val,HEX); 
    Serial.write(val); 
    // Delay for 100 milliseconds. 
    delay(100); 
} 

सभी Arduino परियोजनाओं एक सेटअप() और एक पाश() विधि घोषित अन्यथा अपने Android ठीक से संवाद नहीं होगा होना आवश्यक है।

भी याद रखें कि एओए का उपयोग करने के लिए आवश्यक न्यूनतम आवश्यकताओं की एक सूची:

  • एक एओए-संगत Android डिवाइस। इस उदाहरण को आजमाने से पहले संगतता का परीक्षण करने के लिए, कृपया Google Play पर उपलब्ध माइक्रोचिप एओए प्रदर्शन ऐप्स के लिंक के लिए "समर्थित एंड्रॉइड डिवाइस" अनुभाग देखें।
  • एक संगत माइक्रोकंट्रोलर बोर्ड। यदि आप अनिश्चित हैं तो Arduino मेगा एडीके एक आसान विकल्प होगा।

enter image description here

यूएसबी का उपयोग कर Android उपकरणों की संभावनाएं अद्भुत हैं, और अभिनव एप्लिकेशन कि पूरा फायदा इस तरह की सुविधाओं लेने में सक्षम हैं के लिए मांग उल्लेखनीय बढ़ने को तैयार है।

+1

क्या यह 'UsbDevice' के साथ-साथ' UsbAccessory' 'के लिए भी काम करता है? –

+0

हां यह काम करता है। लेकिन UsbAccessry के लिए आपको USB_ACCESSORY_ATTACHED इरादा का उपयोग करना होगा। – Avanz

1

आपका त्रुटि अनुमतियाँ मैं से संबंधित है से संबंधित नहीं है/हे, -1 त्रुटि

LIBUSB_ERROR_IO - Input/output error. 

के बराबर आप JNI interface modifiy libusb_set_debug() बुला डिबग मोड में libusb डाल करने के लिए कर सकते हैं, मुझे लगता है कि है वास्तव में क्या हो रहा है यह जानने के लिए एक और एकमात्र तरीका।

वैसे भी, पहले कनेक्ट किए गए उपकरणों की सूची में यह सुनिश्चित करने के लिए आपको पहले वीआईडी ​​/ पीआईडी ​​की जांच करें।

0

एंड्रॉइड पर, आप रूट के बिना libusb_open_device_with_vid_pid का उपयोग नहीं कर सकते हैं। किसी यूएसबी डिवाइस तक पहुंच प्राप्त करने के लिए, आपको UsbDeviceManager Android API का उपयोग करना होगा।

केवल उदाहरण मैं जड़ के बिना Android में libusb जोड़ने सार्वजनिक स्रोत कोड के बारे में पता है: https://github.com/martinmarinov/rtl_tcp_andro-/

आप कभी पढ़ा/dev/बस/USB/xxx/yyy/लेखन पहुंच नहीं मिलेगा। एंड्रॉइड का ऐसा करने का तरीका, एक सिस्टम सेवाएं आपको बाध्यकारी के माध्यम से भेजती है, जो आपके द्वारा मांगी गई विशिष्ट/dev/bus/usb/xxx/yyy डिवाइस पर पहले से ही खुली फ़ाइल डिस्क्रिप्टर है।

एंड्रॉइड में जावा से UsbHost को संभालने के तरीके पर पहले से ही बहुत सारे दस्तावेज हैं, इसलिए मैं इसके बाद क्या छोड़ता हूं, इसके बारे में बताउंगा।

  • आप एक समझौता libusb (rtl_tcp_andro- में एक काम हो जाएगा) है, जो एक डिवाइस नाम के बजाय एक filedescriptor ले जा सकते हैं की जरूरत है/पीआईडी ​​/ vid
  • आप libusb_open2 कॉल करने के लिए (जो की जरूरत है कि कैसे के साथ इस नए कार्य fd rtl_tcp_andro के libusb में कहा जाता है) एफडी के साथ UsbDeviceConnection.getFileDescriptor()

संपादित साथ पुनः प्राप्त करेंगे: मैं rtl_tcp_andro- दिखाई दे रही है यह भी एक libusb_init2 कहा, मैं समझ में नहीं आता क्यों एटीएम, लेकिन प्रतिबद्धता का कहना है कि यह एल समर्थन के लिए है, इसलिए मुझे लगता है कि इसकी भी आवश्यकता है।

0

यूएसबी पैच प्रश्न में आपका उल्लेख अगले तरीके से काम करता है कि: UsbManager द्वारा

  • पास libusb करीब

    1. आप चाहिए UsbManager
    2. खुला द्वारा डिवाइस को खोलने libusb
    3. द्वारा

      बिल्कुल वह आदेश काम करेगा।

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