Termux 连接外部USB设备 使用 termux-usb
使用 termux-usb
与USB设备交互
termux-usb 命令 : 列出或使用USB外设。
使用方法
termux-usb [-l | [-r] [-e command] device]
选项说明
-l 显示当前可用USB设备的列表
-r 如果没有适当的权限以访问USB外设,则弹出一个权限请求对话框,请求系统授权
-e command 执行一个程序,并将设备的文件描述符作为参数传递给这个程序
详细说明
安卓平台并不允许应用直接访问USB设备,因此需要使用 Java API 请求一个设备的文件描述符。这意味着要想在Termux
中使用Linux usb软件
就必须对软件做出一定的修改。
下面是一个示例。
首先需要确保 Termux:API
这个应用安装稳妥,然后执行如下命令安装一些必要的包:
pkg install termux-api libusb clang
连接好USB设备,稍等片刻,运行如下命令验证设备是否被识别:
termux-usb -l
这里假设设备是 /dev/bus/usb/001/002
。 运行如下命令以向安卓系统请求设备的访问权限:
termux-usb -r /dev/bus/usb/001/002
尝试使用libusb连接USB外设:
#include <stdio.h>
#include <assert.h>
#include <libusb-1.0/libusb.h>
int main(int argc, char **argv) {
libusb_context *context;
libusb_device_handle *handle;
libusb_device *device;
struct libusb_device_descriptor desc;
unsigned char buffer[256];
int fd;
// 读参数,第一个参数应为USB设备的文件描述符
assert((argc > 1) && (sscanf(argv[1], "%d", &fd) == 1));
printf("argv[1] = %s\n", argv[1]);
printf("fd=%d\n", fd);
// 告知libusb权限很弱,没有权限直接访问usb设备,
// 这会导致后面的libusb_init
// 不去扫描所有设备。在安卓平台上,这是必要的。
libusb_set_option(NULL, LIBUSB_OPTION_WEAK_AUTHORITY);
// 初始化libusb
assert(!libusb_init(&context));
// 获取特定平台的底层设备句柄
assert(!libusb_wrap_sys_device(context, (intptr_t) fd, &handle));
// 使用句柄获取设备对象
device = libusb_get_device(handle);
// 获取给定设备的描述信息
assert(!libusb_get_device_descriptor(device, &desc));
printf("Vendor ID: %04x\n", desc.idVendor);
printf("Product ID: %04x\n", desc.idProduct);
assert(libusb_get_string_descriptor_ascii(handle, desc.iManufacturer, buffer, 256) >= 0);
printf("Manufacturer: %s\n", buffer);
assert(libusb_get_string_descriptor_ascii(handle, desc.iProduct, buffer, 256) >= 0);
printf("Product: %s\n", buffer);
if (libusb_get_string_descriptor_ascii(handle, desc.iSerialNumber, buffer, 256) >= 0)
printf("Serial No: %s\n", buffer);
libusb_exit(context);
}
这个小工具可以显示usb设备的一些基本信息。它唯一的命令行参数是一个设备文件描述符。编译:
gcc usbtest.c -lusb-1.0 -o usbtest
使用-e
选项带有正确的文件描述符执行./usbtest
:
termux-usb -e ./usbtest /dev/bus/usb/001/002