2015-06-04 39 views
19

Próbuję uzyskać urządzenie USB, aby połączyć się z urządzeniem Android 5.1.1. Wcześniej używałem zwykłej biblioteki libusb dla KitKat, ale Lollipop zwiększył bezpieczeństwo i to już nie działa.Błąd libusb_open_device_with_vid_pid podczas próby uzyskania dostępu do urządzenia USB

Jest to dobrze udokumentowane, wymagające root do ustawienia poziomu SELinux. Nie chcę rootować urządzenia, aby urządzenie USB mogło się z nim połączyć.

Po rozejrzał się, natknąłem this answer i próbowałem this libusb fork, jednak teraz jestem coraz nowy błąd

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

nie uległy zmianie dowolnego kodu, tylko biblioteka.

Czy to nadal problem z pozwoleniem, czy jest coś, czego mi brakuje, aby to zadziałało?

Odpowiedz

14

Poniższe kroki można rozwiązać w celu rozwiązania wymienionych problemów.

Proces montażu urządzenia jako pamięci masowej USB jest niespójny na różnych urządzeniach i specyficznych dla producenta. Niektóre urządzenia, takie jak Nexus S, oferują "Włączanie pamięci USB" po podłączeniu urządzenia do komputera za pomocą kabla USB. Inne urządzenia, takie jak Galaxy S3, wymagają teraz aplikacji, aby uruchomić urządzenie jako pamięć masową. Tak czy inaczej, urządzenia z systemem Android zazwyczaj oferują taką funkcję, a będziesz musiał utworzyć plik zgodny ze specyfikacją producenta urządzenia.

trzeba dodać do pliku manifestu aplikacji przed rozpoczęciem pracy z API USB Host:

  • Ponieważ nie wszystkie urządzenia z systemem Android są gwarantowane do obsługi API hosta USB, to element, który deklaruje, że Twój Aplikacja korzysta z funkcji android.hardware.usb.host.
  • Jeśli chcesz, aby Twoja aplikacja otrzymywała powiadomienie o podłączonym urządzeniu USB, określ parę i element dla celów android.hardware.usb.action.USB_DEVICE_ATTACHED w głównej aktywności.

dodawania USB_DEVICE_ATTACHED do manisfest pliku:

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

Aby pomóc APP odkryć konkretne urządzenie USB można użyć filtru zamiar:

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

trzeba także określić urządzenie i Identyfikator dostawcy:

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

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

To pytanie wystarczy, aby poradzić sobie z połączeniem USB host.Teraz nazywają USB:

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

Wykorzystanie deskryptor otworzyć połączenie do usb device - np

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

Jeśli nadal masz problemy z poziomem SELinux, tutaj masz jakieś zmiany można użyć, aby Państwa Program płynnie:

// 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 

Jak SELinux jest domyślnie ustawiony na egzekwować najwyższe bezpieczeństwo, a chcesz udzielić klientowi dostępu do Android Devi ce przez USB.

enter image description here

zależności od marki i modelu z Androidem, spróbuj odłączyć kabel USB łączący urządzenie z pulpitu, a następnie podłącz go ponownie. Powinieneś zostać poproszony o „Włącz USB” przechowywania. W takim przypadku przejdź do ustawień Ustawienia → Więcej ... na urządzeniu z systemem Android i poszukaj opcji pamięci masowej USB.

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

Ewentualnie poszukaj procesu pamięci masowej USB zalecanego przez producenta urządzenia. Po włączeniu pamięci USB urządzenie informuje, że niektóre aplikacje przestaną działać, i zrób to. Teraz przejdź do komputera stacjonarnego i przejdź do nośnika pamięci masowej USB, często nazywanego NO NAME, jeśli nie zmieniłeś jego nazwy. Kliknij urządzenie pamięci masowej, a tam, w folderze stóp, znajdź plik o nazwie data.tsv.

enter image description here

Można również sprawdzić data.tsv otwierając go w swoim ulubionym edytorze tekstowym. Znajdziesz tam dwie kolumny starannie oddzielone tabulatorem; w każdym wierszu znajdziesz parę wartości całkowitych. To jest wystarczające dla naszego projektu. Bardziej skomplikowane projekty danych zazwyczaj wymagają unikalnego identyfikatora dla każdego wiersza, wiersza w jednej tabeli, aby wskazać konkretny rekord w innym.

enter image description here

Według twojej development environment, masz również dostroić swoje ustawienia. Jeśli pracujesz w systemie Windows, wykonaj instalację sterownika USB instructions available. Jeśli pracujesz nad Linuksem, postępuj zgodnie z instrukcjami dla urządzenia setting up do programowania.

enter image description here

Ponadto, warto również wspomnieć, że wiele poprzednio wydane urządzeniach z systemem Android mogą jedynie działać jako urządzenie USB i nie można inicjować połączenia z zewnętrznymi urządzeniami USB. Obsługa Android Open Accessory (AOA) przezwycięża to ograniczenie i umożliwia budowanie akcesoriów, które mogą wchodzić w interakcje z szeregiem urządzeń z systemem Android, pozwalając akcesorium na zainicjowanie urządzenia connection. Przykład wspólnego korzystania z Androida Open Accessory można znaleźć w projekcie: nagrywaj i odtwarzaj dźwięk za pomocą USB host mode - co oczywiście wymaga uruchomienia trybu USB.

enter image description here

Umieszczenie Android do komunikowania się przez USB z Arduino mikrokontrolerów jest również rodzajem realizacji, które wykazały się bardzo udany ostatnio, ponieważ pozwala rozszerzyć Android możliwości integracji dodatkowych funkcji za pośrednictwem różnych urządzeń podejście do rozwiązania. Typowym Arduino Szkic, aby umożliwić komunikację urządzenia z systemem Android USB będzie wyglądać następująco:

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

Wszystkie projekty Arduino musi mieć konfigurację() i metodę loop() zadeklarowanej inaczej Android nie będzie komunikować się prawidłowo.

Należy również pamiętać, że wykaz minimalnych wymagań niezbędnych do korzystania AOA:

  • An AOA-kompatybilnego urządzenia z systemem Android. Aby przetestować zgodność przed wypróbowaniem tego przykładu, zapoznaj się z sekcją "Obsługiwane urządzenia z systemem Android", aby uzyskać linki do aplikacji demonstracyjnych Microchip AOA dostępnych w Google Play.
  • Kompatybilna płyta mikrokontrolera. Arduino Mega ADK będzie łatwą opcją, jeśli nie jesteś pewien.

enter image description here

Możliwości Android urządzeń wykorzystujących USB są niesamowite, a popyt na innowacyjne aplikacje, które są zdolne do pełnego wykorzystania tych funkcji jest ustawiony znacznie rosną.

+1

Czy to działa dla 'UsbDevice', a także' UsbAccessory'? –

+0

Tak, działa. Ale dla UsbAccessry musisz użyć intencji USB_ACCESSORY_ATTACHED. – Avanz

1

Twój błąd nie jest związany z uprawnieniami jest powiązane z I/O, błąd -1 jest równoważna

LIBUSB_ERROR_IO - Input/output error. 

Można modifiy się JNI interface umieścić libusb w trybie debugowania wywołującego libusb_set_debug(), myślę, że jest jeden jedyny sposób, aby dowiedzieć się, co naprawdę się dzieje.

W każdym razie najpierw sprawdź, czy nie ma VID/PID, aby upewnić się, że znajduje się on na liście podłączonych urządzeń.

0

W systemie Android nie można używać libusb_open_device_with_vid_pid bez uprawnień roota. Aby uzyskać dostęp do urządzenia USB, musisz użyć interfejsu API UsbDeviceManager.

Jedynym przykładem znam kodu źródłowego publicznej łączącej libusb do Androida bez korzenia jest: https://github.com/martinmarinov/rtl_tcp_andro-/

Nie kiedykolwiek odczytu/zapisu do/dev/bus/usb/xxx/yyy. Sposób działania systemu Android polega na tym, że usługi systemowe wysyłają przez segregator otwarty już deskryptor pliku na określonym urządzeniu/dev/bus/usb/xxx/yyy, o które prosiłeś.

Istnieje już wiele dokumentacji na temat obsługi UsbHost z java w systemie Android, więc wskażę, co pozostało po tym.

  • Trzeba poprawionej libusb (jeden w rtl_tcp_andro- zrobi), która może potrwać do deskryptora pliku zamiast nazwy urządzenia/pid/vid
  • Trzeba zadzwonić libusb_open2 (tak jak ta nowa funkcja z fd jest nazywany w libusb rtl_tcp_andro) ze fd będziesz pobierać z UsbDeviceConnection.getFileDescriptor()

Edycja: widzę rtl_tcp_andro- również dodał libusb_init2, ja nie rozumiem, dlaczego ATM, ale commit mówi, że to wsparcie L, więc myślę, że jest to również potrzebne.

0

To łata usb wymienione w pytaniu pracuje w następnym sposób:

  1. należy otworzyć urządzenie przez UsbManager
  2. otwarte przez libusb
  3. blisko libusb
  4. blisko UsbManager

dokładnie to zamówienie będzie działać.

Powiązane problemy