草庐IT

java - 尝试访问USB设备时libusb_open_device_with_vid_pid失败

coder 2023-05-19 原文

我正在尝试使USB设备连接到Android 5.1.1设备。以前,我一直使用KitKat的常规libusb,但Lollipop增强了安全性,因此不再有效。

这是有据可查的,需要root设置SELinux级别。我不需要root设备来使USB设备连接到它。

环顾四周后,我遇到了this answer并尝试了this libusb fork,但是现在我遇到了一个新错误

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

我没有更改任何代码,只有库。

这仍然是权限问题,还是我缺少某些东西可以使这项工作正常进行?

最佳答案

以下步骤可用于解决您提到的问题。

将设备安装为USB大容量存储的过程不一致
跨设备和特定于制造商的产品。当您通过USB电缆将设备连接到台式机时,某些设备(例如Nexus S)会提供“打开USB存储设备”功能。其他设备(例如Galaxy S3)现在需要一个应用程序才能将设备作为大容量存储启动。无论哪种方式,Android设备通常都提供这种功能,并且您必须创建一个与设备制造商规范相匹配的文件。

在使用USB主机API之前,您需要添加到应用程序的 list 文件中:

  • 因为并非保证所有支持Android的设备都支持USB主机API,所以请包含一个元素,该元素声明您的应用程序使用android.hardware.usb.host功能。
  • 如果希望通知您的应用程序已连接的USB设备,请在主要 Activity 中为android.hardware.usb.action.USB_DEVICE_ATTACHED意图指定一个and元素对。

  • 将USB_DEVICE_ATTACHED添加到 list 文件中:
    <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>
    

    为了帮助您的APP发现特定的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>
    

    您还必须指定设备和供应商ID:
    <?xml version="1.0" encoding="utf-8"?>
    
    <resources>
        <usb-device vendor-id="1234" product-id="5678" />
    </resources>
    

    这应该足以处理您的USB host连接。现在拨打USB:
    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默认情况下设置为强制执行最高安全性,因此您想授予客户端通过USB访问您的Android设备的权限。

    根据您的Android品牌和型号,尝试拔下连接设备和台式机的USB电缆,然后将其重新插入。系统将提示您“打开USB”存储。如果是这种情况,请继续尝试在Android上浏览至“设置”→“更多...”,然后寻找USB大容量存储选项。


    (来源:pocketables.com)

    或者,寻找设备制造商建议的USB大容量存储过程。当您打开USB存储设备时,设备会通知您某些应用将停止运行,然后继续操作即可。现在,移至台式计算机并浏览至USB大容量存储介质,如果尚未重命名,则通常称为NO NAME。单击大容量存储设备,然后在 footer 文件夹中找到一个名为data.tsv的文件。

    您也可以通过在您喜欢的文本编辑器中打开data.tsv来检查它。您会在其中找到两列,它们之间用制表符整齐地隔开;在每一行中,您都会找到一对整数值。这对于我们的项目而言已经足够了。更复杂的数据项目通常需要为每行指定唯一的标识符,一个表中的一行指向另一表中的特定记录。

    根据您的development environment,您还必须相应地调整设置。如果您在Windows上进行开发,请按照USB驱动程序安装instructions available进行操作。如果您是在Linux上进行开发,请按照setting up您的设备进行开发的说明。

    此外,还值得一提的是,许多以前发布的Android驱动的设备只能充当USB设备,而无法启动与外部USB设备的连接。 Android Open Accessory(AOA)支持克服了此限制,并允许您通过允许附件启动connection来构建可与各种Android驱动的设备进行交互的附件。在项目中可以找到Android Open Accessory的常见用法示例:使用USB host mode录制和播放音频-当然,这需要启动并运行USB模式。

    将Android与Arduino微 Controller 通过USB进行通信也是一种成功的实现方式,因为它允许您通过多设备解决方案方法扩展集成其他功能的Android功能。允许设备与Android USB通信的典型Arduino Sketch如下所示:
    // 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项目必须声明一个setup()和loop()方法,否则您的Android将无法正常通信。

    还请记住,使用AOA所需的最低要求的列表:
  • 与AOA兼容的Android设备。要在尝试本示例之前测试兼容性,请引用“支持的Android设备”部分,以获取指向Google Play上可用的Microchip AOA演示应用程序的链接。
  • 兼容的微 Controller 板。如果您不确定,Arduino Mega ADK将是一个简单的选择。


  • 使用USB的Android设备的可能性是惊人的,并且对能够充分利用此类功能的创新APP的需求将显着增长。

    关于java - 尝试访问USB设备时libusb_open_device_with_vid_pid失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649589/

    有关java - 尝试访问USB设备时libusb_open_device_with_vid_pid失败的更多相关文章

    1. ruby-on-rails - rails : keeping DRY with ActiveRecord models that share similar complex attributes - 2

      这似乎应该有一个直截了当的答案,但在Google上花了很多时间,所以我找不到它。这可能是缺少正确关键字的情况。在我的RoR应用程序中,我有几个模型共享一种特定类型的字符串属性,该属性具有特殊验证和其他功能。我能想到的最接近的类似示例是表示URL的字符串。这会导致模型中出现大量重复(甚至单元测试中会出现更多重复),但我不确定如何让它更DRY。我能想到几个可能的方向...按照“validates_url_format_of”插件,但这只会让验证干给这个特殊的字符串它自己的模型,但这看起来很像重溶液为这个特殊的字符串创建一个ruby​​类,但是我如何得到ActiveRecord关联这个类模型

    2. ruby - ECONNRESET (Whois::ConnectionError) - 尝试在 Ruby 中查询 Whois 时出错 - 2

      我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.

    3. ruby-on-rails - Ruby on Rails with Haml - 如何从 erb 切换 - 2

      我正在从erb文件切换到HAML。我将hamlgem添加到我的系统中。我创建了app/views/layouts/application.html.haml文件。我应该只删除application.html.erb文件吗?此外,仍然有/public/index.html文件被呈现为默认页面。我想创建自己的默认index.html.haml页面。我应该把它放在哪里以及如何使系统呈现该文件而不是默认索引文件?谢谢! 最佳答案 是的,您可以删除任何已转换为HAML的View的ERB版本。至于你的另一个问题,删除public/index/h

    4. java - 等价于 Java 中的 Ruby Hash - 2

      我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

    5. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

      我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

    6. ruby 语法糖 : dealing with nils - 2

      可能已经问过了,但我找不到它。这里有2个常见的情况(对我来说,在编程Rails时......)用ruby​​编写是令人沮丧的:"astring".match(/abc(.+)abc/)[1]在这种情况下,我得到一个错误,因为字符串不匹配,因此在nil上调用[]运算符。我想找到的是比以下内容更好的替代方法:temp="astring".match(/abc(.+)abc/);temp.nil??nil:temp[1]简而言之,如果不匹配,则简单地返回nil而不会出错第二种情况是这样的:var=something.very.long.and.tedious.to.writevar=some

    7. java - 从 JRuby 调用 Java 类的问题 - 2

      我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

    8. ruby-on-rails - 我该怎么办 :remote location validation with CarrierWave? - 2

      我在我的Rails3示例应用程序上使用CarrierWave。我想验证远程位置上传,因此当用户提交无效URL(空白或非图像)时,我不会收到标准错误异常:CarrierWave::DownloadErrorinImageController#createtryingtodownloadafilewhichisnotservedoverHTTP这是我的模型:classPaintingtrue,:length=>{:minimum=>5,:maximum=>100}validates:image,:presence=>trueend这是我的Controller:classPaintingsC

    9. java - 我的模型类或其他类中应该有逻辑吗 - 2

      我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

    10. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

      什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

    随机推荐