Usb4java 库,声明接口时出错
Usb4java library, error while claiming an interface
这里我使用库 usb4java 来访问我的 usb 设备。
问题是我在尝试声明我的 USB 设备的接口时遇到错误。错误在这一行:
int msg = LibUsb.claimInterface(deviceHandler, 1);
错误:USB 错误 3:无法声明接口:访问被拒绝(权限不足)
有人知道我为什么会出现此错误或如何解决吗?
我遇到了和你一样的问题,我的环境是 Mac OS X 10.9
经过 google 的长时间搜索,我终于找到了这个 just get the names of USB devices attached to a system?,它帮了我大忙,现在我的代码工作起来很有魅力。
解决方法是here,因为mac会自动claim devices,我们可以为它创建一个dummy driver
这是操作步骤。
- create Info.plist in /System/Library/Extensions/Proxmark3.kext/Contents ,你应该创建父文件夹如果缺少,文件内容应该是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- This is a dummy driver which binds to Proxmark. It -->
<!-- contains no actual code; its only purpose is to -->
<!-- prevent Apple's USBHID driver from exclusively -->
<!-- opening the device. -->
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.proxmark.driver.dummy</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0d1</string>
<key>IOKitPersonalities</key>
<dict>
<!-- The Proxmark3 USB interface -->
<key>Proxmark3</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.kpi.iokit</string>
<key>IOClass</key>
<string>IOService</string>
<key>IOProviderClass</key>
<string>IOUSBInterface</string>
<key>bConfigurationValue</key>
<integer>1</integer>
<key>bInterfaceNumber</key>
<integer>0</integer>
<key>idProduct</key>
<integer>{your-usb-hardware-product-id}</integer>
<key>idVendor</key>
<integer>{your-usb-hardware-vendor-id}</integer>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.iokit.IOUSBFamily</key>
<string>1.8</string>
</dict>
</dict>
</plist>
注意: {your-usb-hardware-product-id} 和 {your-usb-hardware-vendor-id} 必须是你自己的硬件id,可以从关于这个mac - 系统报告 - 硬件 - USB.
- 输入/System/Library/Extensions,然后运行作为ROOT
sudo chown -R root:wheel Proxmark3.kext
sudo chmod -R 755 Proxmark3.kext
sudo kextcache -system-caches
- 重新启动系统并查看结果。
对于 Linux 系统,用户似乎无权访问 USB 设备。
这可以通过在 /etc/udev/rules.d 中添加规则来更改,例如使用名称“50-usb-permissions.rules”和内容
SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678",
MODE="0666",GROUP="users"
十六进制数 1234 是 vendorid,5678 是连接的 USB 设备的 productid,可以通过 "lsusb -v" 找到。示例规则允许用户组 "users" 访问指定的 USB 设备。重新启动后将应用该规则。
根据 Linux 版本,路径可能不同。
当 adb 服务器在 MacOS 上 运行 时出现此错误。重新启动计算机释放接口,以便我可以再次认领它。但是,每次启动adb时,它都会锁定USB接口,需要重新启动计算机。
这里我使用库 usb4java 来访问我的 usb 设备。
问题是我在尝试声明我的 USB 设备的接口时遇到错误。错误在这一行:
int msg = LibUsb.claimInterface(deviceHandler, 1);
错误:USB 错误 3:无法声明接口:访问被拒绝(权限不足)
有人知道我为什么会出现此错误或如何解决吗?
我遇到了和你一样的问题,我的环境是 Mac OS X 10.9
经过 google 的长时间搜索,我终于找到了这个 just get the names of USB devices attached to a system?,它帮了我大忙,现在我的代码工作起来很有魅力。
解决方法是here,因为mac会自动claim devices,我们可以为它创建一个dummy driver
这是操作步骤。
- create Info.plist in /System/Library/Extensions/Proxmark3.kext/Contents ,你应该创建父文件夹如果缺少,文件内容应该是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!-- This is a dummy driver which binds to Proxmark. It -->
<!-- contains no actual code; its only purpose is to -->
<!-- prevent Apple's USBHID driver from exclusively -->
<!-- opening the device. -->
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.proxmark.driver.dummy</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundlePackageType</key>
<string>KEXT</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1.0.0d1</string>
<key>IOKitPersonalities</key>
<dict>
<!-- The Proxmark3 USB interface -->
<key>Proxmark3</key>
<dict>
<key>CFBundleIdentifier</key>
<string>com.apple.kpi.iokit</string>
<key>IOClass</key>
<string>IOService</string>
<key>IOProviderClass</key>
<string>IOUSBInterface</string>
<key>bConfigurationValue</key>
<integer>1</integer>
<key>bInterfaceNumber</key>
<integer>0</integer>
<key>idProduct</key>
<integer>{your-usb-hardware-product-id}</integer>
<key>idVendor</key>
<integer>{your-usb-hardware-vendor-id}</integer>
</dict>
</dict>
<key>OSBundleLibraries</key>
<dict>
<key>com.apple.iokit.IOUSBFamily</key>
<string>1.8</string>
</dict>
</dict>
</plist>
注意: {your-usb-hardware-product-id} 和 {your-usb-hardware-vendor-id} 必须是你自己的硬件id,可以从关于这个mac - 系统报告 - 硬件 - USB.
- 输入/System/Library/Extensions,然后运行作为ROOT
sudo chown -R root:wheel Proxmark3.kext
sudo chmod -R 755 Proxmark3.kext
sudo kextcache -system-caches
- 重新启动系统并查看结果。
对于 Linux 系统,用户似乎无权访问 USB 设备。
这可以通过在 /etc/udev/rules.d 中添加规则来更改,例如使用名称“50-usb-permissions.rules”和内容
SUBSYSTEM=="usb", ATTR{idVendor}=="1234", ATTR{idProduct}=="5678",
MODE="0666",GROUP="users"
十六进制数 1234 是 vendorid,5678 是连接的 USB 设备的 productid,可以通过 "lsusb -v" 找到。示例规则允许用户组 "users" 访问指定的 USB 设备。重新启动后将应用该规则。
根据 Linux 版本,路径可能不同。
当 adb 服务器在 MacOS 上 运行 时出现此错误。重新启动计算机释放接口,以便我可以再次认领它。但是,每次启动adb时,它都会锁定USB接口,需要重新启动计算机。