在Termux上访问USB设备

玩机技巧 · 2023-01-22 · 553 人浏览
在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设备到手机后,你可能会在通知栏看到这样一条通知

OTG通知

然后返回Termux,输入这条命令

termux-usb -l

几秒后会shell中会返回类似这样的文本
返回USB设备列表
其中 /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成功返回了读卡器的基本信息

Termux Android

Powered by Typecho | Theme Jasmine by Kent Liao 萌ICP备20239881号 | 异次元之旅