Итак, я внедрил API аксессуаров для Android USB, чтобы я мог подключить свой телефон к ноутбуку под управлением Linux, и он помещает телефон в режим USB-аксессуаров. Затем я могу получить доступ к аксессуару, открыть его и начать читать письмо. Мой код выглядит почти идентично примеру документации. Основное различие заключается в том, что я использую отдельные методы чтения и записи и получаю их через JNI из собственного кода.
Здесь, где это становится интересным. После успешного чтения/записи на секунду или два, массовый перенос записи с моего ноутбука начинает давать ошибки таймаута, а затем вызов чтения на USB-аксессуар в Android выдает исключение IOEx с кодом ошибки ENODEV. Это связано с подключенным кабелем, и UsbManager по-прежнему перечисляет аксессуар в списке, и у меня все еще есть разрешение на него.
Чтобы добавить к нечетности, я обнаружил, что если я поставлю сон 100 мс в цикле чтения, проблема в основном уходит (хотя это все равно происходит иногда). Наличие сна в нем - это не просто ужасный клид, но он вводит невыносимую латентность в мое приложение. Чем ниже время сна, тем менее эффективен взлом, где он неэффективен при 10 мс времени сна.
Я передаю данные в режиме реального времени в 20-30 Кбит/с, используя массовые переводы (но не так в режиме реального времени, что массовая передача не будет достаточной), а размер передачи варьируется от 50 до 800 байтов примерно на 20- 30Гц. Это может быть ограничение USB? У меня нет большого опыта с этим, поэтому я в основном рассматриваю его примерно так же, как сетевой сокет. Должен ли я помещать в очередь небольшие сообщения и отправлять их вместе в менее частые, но более крупные переводы? Есть ли проблема с малыми передачами на высоких частотах? Я займусь этим, но я в основном хватаюсь за соломинку здесь.
Оборудование:
- Ноутбук работает под управлением Ubuntu 10.04 и использует libusb 1.0.0.
- Телефон Galaxy Nexus S работает под управлением Android 4.1.2.