在Termux上访问USB设备
Wiki原文:Termux Wiki
前言
由于Android系统的限制,程序不能直接访问USB设备,需要通过Java API去请求USB设备描述符来控制USB设备,这使得在Linux上能直接访问USB设备的程序要在Termux上正常使用,需要用一种曲线救国的方法
准备
前置条件:安装相同渠道的Termux和Termux:API
可以去Fdroid下载 Termux Termux:API
开始操作
进入Termux环境后 用apt安装下列软件包:termux-api
libusb
clang
(后两个可以不装,只是后文用来演示使用示例的)
apt update && apt install termux-api libusb clang
接下来掏出你的OTG转换接头,打开手机的OTG功能,有些厂商的OTG功能默认开启,而有些需要去设置里面开启,OTG成功开启并插入usb设备到手机后,你可能会在通知栏看到这样一条通知
然后返回Termux,输入这条命令
termux-usb -l
几秒后会shell中会返回类似这样的文本
其中 /dev/bus/usb/001/003
是系统挂载USB设备的位置,不同手机可能显示不同,插入多个USB设备显示更多行
如果卡在这一步不动或者返回一对方框[],要把Termux:API的 自启动、关联启动、后台运行 的权限放行,并检查OTG功能是否启用、USB设备是否正确连接手机
然后输入这条命令使Termux获得USB设备的控制权
termux-usb -r /dev/bus/usb/001/003
后面那串长路径填入之前返回的文本的路径,多个USB设备要一次填一个
出现下面的弹窗后点确定
Termux就获得了这个USB设备的控制权,并在shell中提示 Access granted
然后就可以在Termux里面,在要访问USB设备的程序前加上前缀 termux-usb -e + 目标命令
来使用USB设备了
使用示例
下面是一个官方示例,用来查看USB设备基本信息的C语言程序
#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;
assert((argc > 1) && (sscanf(argv[1], "%d", &fd) == 1));
libusb_set_option(NULL, LIBUSB_OPTION_NO_DEVICE_DISCOVERY);
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);
}
编辑完存为 usbtest.c 然后用gcc编译
gcc usbtest.c -lusb-1.0 -o usbtest
编译完就可以执行试试了
chmod +x usbtest && termux-usb -e ./usbtest /dev/bus/usb/001/003
示例使用了一个读卡器,下面是返回结果
Termux成功返回了读卡器的基本信息