首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

linux hid usb通讯

在 Linux 系统中,与 USB HID(Human Interface Device,如键盘、鼠标、游戏手柄等)设备进行通信通常涉及以下几个步骤:


​1. 识别 USB HID 设备​

​1.1 使用 lsusb 查看连接的 USB 设备​

首先,使用 lsusb 命令列出所有连接的 USB 设备:

代码语言:javascript
复制
lsusb

示例输出:

代码语言:javascript
复制
Bus 001 Device 002: ID 1234:5678 Vendor Name Product Name
  • ​Bus​​ 和 ​​Device​​ 编号用于标识设备位置。
  • ​ID​​ 是设备的厂商 ID(Vendor ID, VID)和产品 ID(Product ID, PID)。

​1.2 使用 lsinput evtest 查看 HID 输入设备​

HID 设备通常作为输入设备出现在 /dev/input/ 目录下。可以使用以下命令查看:

​使用 lsinput(需要安装 input-utils)​

代码语言:javascript
复制
sudo apt-get install input-utils  # Debian/Ubuntu
sudo yum install input-utils      # CentOS/RHEL
lsinput

​使用 evtest(需要安装 evtest)​

代码语言:javascript
复制
sudo apt-get install evtest  # Debian/Ubuntu
sudo yum install evtest      # CentOS/RHEL
sudo evtest

evtest 会列出所有输入设备,并允许你选择设备进行事件监控。

​1.3 使用 dmesg 查看内核日志​

插入 USB HID 设备后,使用 dmesg 查看内核日志,确认设备是否被正确识别:

代码语言:javascript
复制
dmesg | grep usb

​2. 理解 HID 报告描述符​

HID 设备通过报告描述符定义其数据格式。理解报告描述符对于自定义通信至关重要。

​2.1 使用 hidrd 解析报告描述符​

hidrd 是一个工具,可以将二进制报告描述符转换为人类可读的格式。

​安装 hidrd

代码语言:javascript
复制
sudo apt-get install hid-tools  # 包含 hidrd

​获取报告描述符​

首先,找到设备的路径。假设设备在 /dev/hidraw0

代码语言:javascript
复制
sudo hidrd-convert /dev/hidraw0

或者,如果设备支持,可以通过 usbhid-dump 获取:

代码语言:javascript
复制
sudo apt-get install usbhid-dump  # 需要安装
sudo usbhid-dump

​注意​​:并非所有设备都允许直接读取报告描述符,某些设备可能需要特定的驱动程序或权限。

​2.2 示例报告描述符解析​

一个简单的 HID 报告描述符可能如下:

代码语言:javascript
复制
USAGE_PAGE (Generic Desktop)
USAGE (Keyboard)
COLLECTION (Application)
    USAGE_PAGE (Keyboard/Keypad)
    USAGE_MINIMUM (Keyboard LeftControl)
    USAGE_MAXIMUM (Keyboard Right GUI)
    LOGICAL_MINIMUM (0)
    LOGICAL_MAXIMUM (101)
    REPORT_SIZE (1)
    REPORT_COUNT (8)
    INPUT (Data,Var,Abs)
    ...
END_COLLECTION

此描述符定义了一个键盘设备,包含 8 个按键的状态。


​3. 使用标准工具进行通信​

Linux 提供了一些标准工具和接口,用于与 HID 设备进行通信。

​3.1 使用 libusb 进行低级 USB 通信​

libusb 是一个用户空间的 USB 库,允许应用程序直接与 USB 设备通信。

​安装 libusb

代码语言:javascript
复制
sudo apt-get install libusb-1.0-0-dev  # Debian/Ubuntu
sudo yum install libusb-devel          # CentOS/RHEL

​示例代码:枚举 USB 设备​

以下是一个简单的 C 程序,使用 libusb 枚举 USB 设备:

代码语言:javascript
复制
#include <stdio.h>
#include <libusb-1.0/libusb.h>

int main() {
    libusb_context *ctx = NULL;
    libusb_device **devs;
    ssize_t cnt;

    // 初始化 libusb
    if (libusb_init(&ctx) < 0) {
        fprintf(stderr, "初始化 libusb 失败\n");
        return 1;
    }

    // 获取设备列表
    cnt = libusb_get_device_list(ctx, &devs);
    if (cnt < 0) {
        fprintf(stderr, "获取设备列表失败\n");
        libusb_exit(ctx);
        return 1;
    }

    printf("找到 %ld 个 USB 设备\n", cnt);

    // 遍历设备
    for (ssize_t i = 0; i < cnt; i++) {
        libusb_device *dev = devs[i];
        struct libusb_device_descriptor desc;
        if (libusb_get_device_descriptor(dev, &desc) == 0) {
            printf("设备 %04x:%04x\n", desc.idVendor, desc.idProduct);
        }
    }

    // 释放设备列表
    libusb_free_device_list(devs, 1);
    libusb_exit(ctx);
    return 0;
}

​编译和运行​

代码语言:javascript
复制
gcc -o list_usb list_usb.c -lusb-1.0
sudo ./list_usb

​注意​​:访问 USB 设备通常需要超级用户权限,因此使用 sudo 运行程序。

​3.2 使用 hidapi 进行 HID 设备通信​

hidapi 是一个跨平台的库,简化了与 HID 设备的通信。

​安装 hidapi

代码语言:javascript
复制
sudo apt-get install libhidapi-dev  # Debian/Ubuntu
# 对于 CentOS/RHEL,可能需要从源码编译

​示例代码:读取 HID 设备数据​

以下是一个简单的 C 程序,使用 hidapi 读取 HID 设备的数据:

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <hidapi/hidapi.h>

int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("用法: %s <设备路径>\n", argv[0]);
        return 1;
    }

    const char *device_path = argv[1];
    hid_device *handle;

    // 初始化 hidapi
    if (hid_init() != 0) {
        fprintf(stderr, "初始化 hidapi 失败\n");
        return 1;
    }

    // 打开设备
    handle = hid_open_path(device_path);
    if (!handle) {
        fprintf(stderr, "无法打开设备: %s\n", device_path);
        hid_exit();
        return 1;
    }

    // 读取数据
    unsigned char buf[64];
    int res = hid_read(handle, buf, sizeof(buf));
    if (res > 0) {
        printf("读取到 %d 字节数据:\n", res);
        for (int i = 0; i < res; i++) {
            printf("%02x ", buf[i]);
        }
        printf("\n");
    } else if (res == -1) {
        fprintf(stderr, "读取失败\n");
    } else {
        printf("没有数据可读\n");
    }

    // 关闭设备并退出
    hid_close(handle);
    hid_exit();
    return 0;
}

​编译和运行​

代码语言:javascript
复制
gcc -o read_hid read_hid.c -lhidapi-hidraw
sudo ./read_hid /dev/hidraw0
  • 确保你知道正确的设备路径(如 /dev/hidraw0)。
  • 可能需要根据具体设备调整缓冲区大小和读取逻辑。

​4. 编写自定义程序进行通信(高级)​

对于更复杂的 HID 设备,可能需要编写自定义的驱动程序或用户空间程序,直接与内核交互。

​4.1 使用 libusb 进行自定义通信​

以下是一个使用 libusb 发送和接收数据的示例:

​示例代码:发送和接收数据​

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <libusb-1.0/libusb.h>

#define VENDOR_ID  0x1234  // 替换为你的设备的 VID
#define PRODUCT_ID 0x5678  // 替换为你的设备的 PID

int main() {
    libusb_context *ctx = NULL;
    libusb_device_handle *dev_handle = NULL;
    int r; // 返回值
    unsigned char data[64]; // 数据缓冲区

    // 初始化 libusb
    r = libusb_init(&ctx);
    if (r < 0) {
        fprintf(stderr, "初始化 libusb 失败\n");
        return 1;
    }

    // 打开设备
    dev_handle = libusb_open_device_with_vid_pid(ctx, VENDOR_ID, PRODUCT_ID);
    if (dev_handle == NULL) {
        fprintf(stderr, "无法打开设备\n");
        libusb_exit(ctx);
        return 1;
    }

    // 断开内核驱动(如果已附加)
    if (libusb_kernel_driver_active(dev_handle, 0)) {
        libusb_detach_kernel_driver(dev_handle, 0);
    }

    // 声明接口
    r = libusb_claim_interface(dev_handle, 0);
    if (r < 0) {
        fprintf(stderr, "无法声明接口\n");
        libusb_close(dev_handle);
        libusb_exit(ctx);
        return 1;
    }

    // 发送数据示例
    data[0] = 0x01; // 示例数据
    int actual_length;
    r = libusb_bulk_transfer(dev_handle, 0x01 /* 端点地址 */, data, sizeof(data), &actual_length, 5000);
    if (r == 0 && actual_length > 0) {
        printf("发送 %d 字节数据\n", actual_length);
    } else {
        fprintf(stderr, "发送失败: %d\n", r);
    }

    // 接收数据示例
    memset(data, 0, sizeof(data));
    r = libusb_bulk_transfer(dev_handle, 0x81 /* 端点地址 */, data, sizeof(data), &actual_length, 5000);
    if (r == 0 && actual_length > 0) {
        printf("接收 %d 字节数据:\n", actual_length);
        for (int i = 0; i < actual_length; i++) {
            printf("%02x ", data[i]);
        }
        printf("\n");
    } else {
        fprintf(stderr, "接收失败: %d\n", r);
    }

    // 释放接口并关闭设备
    libusb_release_interface(dev_handle, 0);
    libusb_close(dev_handle);
    libusb_exit(ctx);
    return 0;
}

​编译和运行​

代码语言:javascript
复制
gcc -o usb_comm usb_comm.c -lusb-1.0
sudo ./usb_comm
  • 替换 VENDOR_IDPRODUCT_ID 为你的设备的实际值。
  • 端点地址(如 0x010x81)需要根据设备的通信协议确定。
  • 某些设备可能需要特定的初始化序列或配置。

​4.2 使用 hidraw 进行自定义通信​

如果设备通过 hidraw 接口暴露,可以直接读写 /dev/hidrawX 设备文件。

​示例代码:读写 /dev/hidrawX

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>

#define DEVICE_PATH "/dev/hidraw0" // 替换为你的设备路径

int main() {
    int fd;
    unsigned char buf[64];

    // 打开设备
    fd = open(DEVICE_PATH, O_RDWR | O_NONBLOCK);
    if (fd == -1) {
        fprintf(stderr, "无法打开设备 %s: %s\n", DEVICE_PATH, strerror(errno));
        return 1;
    }

    // 发送数据示例
    memset(buf, 0, sizeof(buf));
    buf[0] = 0x01; // 示例数据
    ssize_t bytes_written = write(fd, buf, 64);
    if (bytes_written < 0) {
        fprintf(stderr, "写入失败: %s\n", strerror(errno));
    } else {
        printf("写入 %zd 字节数据\n", bytes_written);
    }

    // 接收数据示例
    memset(buf, 0, sizeof(buf));
    ssize_t bytes_read = read(fd, buf, sizeof(buf));
    if (bytes_read < 0) {
        fprintf(stderr, "读取失败: %s\n", strerror(errno));
    } else if (bytes_read > 0) {
        printf("读取 %zd 字节数据:\n", bytes_read);
        for (int i = 0; i < bytes_read; i++) {
            printf("%02x ", buf[i]);
        }
        printf("\n");
    } else {
        printf("没有数据可读\n");
    }

    // 关闭设备
    close(fd);
    return 0;
}

​编译和运行​

代码语言:javascript
复制
gcc -o hidraw_comm hidraw_comm.c
sudo ./hidraw_comm
  • 确保你知道正确的设备路径(如 /dev/hidraw0)。
  • 可能需要根据具体设备的通信协议调整发送和接收的数据格式。

​5. 调试和故障排除​

​5.1 检查权限问题​

访问 /dev/hidrawX 或进行 USB 通信通常需要超级用户权限。如果遇到权限错误,可以:

  • 使用 sudo 运行程序。
  • 将用户添加到 plugdevdialout 组(取决于发行版):sudo usermod -aG plugdev $USER sudo usermod -aG dialout $USER 然后重新登录。

​5.2 验证设备连接​

确保设备已正确连接并被系统识别:

代码语言:javascript
复制
lsusb
ls /dev/hidraw*

​5.3 检查内核模块​

某些 HID 设备可能需要特定的内核模块。可以使用 lsmod 查看已加载的模块,并根据需要加载:

代码语言:javascript
复制
lsmod | grep hid
sudo modprobe hid-generic

​5.4 使用调试工具​

  • usbmon​:用于捕获 USB 流量。 sudo modprobe usbmon sudo wireshark # 需要安装 Wireshark 并配置 usbmon 接口
  • dmesg​:查看内核日志,排查设备识别和通信问题。 dmesg | tail -n 50

​6. 示例项目​

​6.1 使用 Python 进行 HID 通信​

Python 提供了 hidapi 的绑定,可以简化 HID 设备的通信。

​安装 pyhidapi

代码语言:javascript
复制
pip install hidapi

​示例代码:读取 HID 数据​

代码语言:javascript
复制
import hid

# 替换为你的设备的 VID 和 PID
VENDOR_ID = 0x1234
PRODUCT_ID = 0x5678

try:
    # 打开设备
    device = hid.device()
    device.open(VENDOR_ID, PRODUCT_ID)

    # 设置非阻塞模式(可选)
    device.set_nonblocking(1)

    # 读取数据
    while True:
        data = device.read(64)  # 读取最多64字节
        if data:
            print("接收到数据:", [hex(x) for x in data])
        else:
            # 没有数据可读时,可以进行其他操作
            pass

except IOError as ex:
    print(f"无法打开设备: {ex}")
finally:
    if 'device' in locals():
        device.close()
  • 确保安装了 libhidapi 库。
  • 根据设备的具体协议调整读取逻辑。

​7. 高级主题​

​7.1 自定义 HID 报告描述符​

如果需要开发自定义 HID 设备,可能需要设计自定义的报告描述符。这通常涉及:

  • 使用 ​​HID 工具​​(如 hidrd)解析和生成报告描述符。
  • 编写固件时,按照 HID 规范定义输入、输出和功能报告。

​7.2 固件开发​

对于自定义 HID 设备,可能需要开发固件。常用的微控制器(如 Arduino、ESP32、STM32)都有支持 HID 的库和示例代码。

​Arduino 示例:创建一个简单的 HID 键盘​

代码语言:javascript
复制
#include <Keyboard.h>

void setup() {
  // 初始化键盘
  Keyboard.begin();
  delay(1000);
  // 发送按键
  Keyboard.press(KEY_LEFT_GUI); // Windows 键
  Keyboard.press('r');
  delay(100);
  Keyboard.releaseAll();
  delay(100);
  Keyboard.print("notepad");
  delay(500);
  Keyboard.press(KEY_RETURN);
  Keyboard.releaseAll();
}

void loop() {
  // 主循环
}

​注意​​:此示例适用于支持 HID 的 Arduino 板(如 Leonardo、Micro)。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

USB初学(一)---USB-HID的初步认识【转】

HID是一种USB通信协议,无需安装驱动就能进行交互,在学习HID之前,先来复习一下USB协议的相关内容。 USB设备描述符-概述 当插入USB设备后,主机会向设备请求各种描述符来识别设备。...bDeviceSubClass; //usb分配的子类代码,同上,值由USB规定和分配的,HID设备此值为0 BYTE bDeviceProtocl; //USB分配的设备协议代码,同上HID...当插入USB设备后,主机会向设备请求各种描述符来识别设备。 为了把一个设备识别为HID类别,设备在定义描述符的时候必须遵守HID规范。 ?...USB HID类可采用的通信管道 所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道与主机通信。...表1、USB HID规范定义的HID设备可用端点 管道 要求 说明 控制(端点0) 必须 传输USB描述符、类请求代码以及供查询的消息数据等 中断输入 必须 传输从设备到主机的输入数据 中断输出 可选

15K61

APP的USB通讯开发

硬件兼容性:了解硬件设备的USB接口类型(如USB 2.0、USB 3.0、USB-C)和通信协议。...3.权限与配置Android:在AndroidManifest.xml中声明USB权限(android.hardware.usb.host或android.hardware.usb.accessory)...4.设备连接设备检测:检测连接的USB设备,并验证设备是否支持。处理设备插入和拔出的动态事件。连接建立:打开USB连接,获取设备的通信接口。配置接口参数(如传输模式、端点地址等)。...权限控制:确保只有授权的设备和用户可以访问USB功能。10.文档与支持用户文档:提供详细的使用说明,帮助用户正确连接和使用USB设备。技术支持:提供技术支持渠道,帮助用户解决USB连接问题。...功耗管理:优化USB通信的功耗,避免影响设备电池寿命。总结开发APP通过USB与硬件设备通信的功能时,需从需求分析、权限配置、通信协议设计到异常处理全面考虑,确保功能稳定、用户体验良好。

18710
  • SSH与内置USB HID支持的完美结合

    本文将深入探讨SSH的内置USB HID支持及其对用户和管理员的益处。 USB HID简介 USB HID是指通过USB接口连接的人机接口设备,例如键盘、鼠标和安全密钥。...在安全领域,USB HID设备通常用于存储和处理身份验证信息,如数字签名和加密密钥。 SSH的内置USB HID支持 SSH协议内置的USB HID支持允许用户使用USB安全密钥进行身份验证。...跨平台性: 无论是Windows、Linux还是macOS,SSH的内置USB HID支持都能够提供稳定、可靠的身份验证服务。...总结 SSH的内置USB HID支持为用户和管理员提供了一个简单、安全的身份验证解决方案。...随着安全需求的不断增加,利用SSH和USB HID技术的身份验证方案将会得到更广泛的应用。

    37730

    Android OTG之USB转串口模块通讯

    Android OTG之USB转串口模块通讯 微信公众号:CodingAndroid CSDN:http://blog.csdn.net/xinpengfei521 1.背景简介 我们公司开发了一款室内机平板...2.分析及实现思路 智能门锁的控制是通过使用 433射频(不了解的请百度)来进行通讯的; 平板是没法与智能门锁直接进行通讯,但是厂家提供了一个433通讯模块(支持串口); 而平板(支持OTG)是支持USB...3.主要代码实现 3.1初始化USB转串口模块 由于我们选用的是CH340模块,我们先导入ch340的 jar 包,然后在代码中检查手机/平板是否支持USB HOST模式,如果支持我们就初始化通讯时的相关参数...:波特率、数据位、停止位等,具体的参数看你们之间通讯的协议。...初始化完成之后,我们就可以打开USB进行通讯了,同时初始化完成之后我们需要开启一个读取数据的线程,这样,一旦收到数据或者相应的响应包(一般也叫ACK)我们就可以进行相应的处理了。

    3.5K10

    APP与USB通讯的异常处理

    在开发APP通过USB与硬件设备通信的功能时,异常处理是确保功能稳定性和用户体验的关键。以下是非代码层面的异常处理策略和注意事项。...1.连接异常设备未识别:原因:设备驱动未安装、USB接口损坏、设备不支持等。处理:提示用户检查设备连接状态,并提供设备支持列表。权限不足:原因:用户未授予USB权限或设备需要特殊权限。...4.系统异常USB未启用:原因:用户未启用USB功能或系统限制。处理:提示用户启用USB功能,并提供跳转设置页面的选项。系统USB服务异常:原因:系统USB驱动或服务故障。...USB接口故障:原因:USB接口损坏或接触不良。处理:提示用户更换USB线或尝试其他接口。7.日志与监控日志记录:记录异常信息:包括异常类型、时间、设备信息等。...权限控制:确保只有授权的设备和用户可以访问USB功能。10.性能优化重试机制:在数据传输失败时,实现自动重试机制。超时处理:设置合理的超时时间,避免长时间等待。

    16510

    原创 Paper | USB设备开发:从入门到实践指南(二)

    所有环节准备就绪了(这次USB主机设备选择的是Linux主机),接下来就可以运行脚本,然后可以在Linux主机上看到以下信息: $ sudo dmesg [91788.951749] usb 3-2:...并且在Linux的源码中发现Swithc手柄的相关驱动:drivers/hid/hid-nintendo.c。 综合上述因素,选择了Switch手柄作为研究的切入点,但最终却发现选错了切入点。...3 hid_nintendo,usbhid,hid_generic 发现ubuntu成功适配到了hid_nintendo驱动,但是却报了一堆的错误,猜测是这些错误导致手柄驱动注册失败,在Linux下能被正常识别的手柄应该像上面的案例一样...另外因为测试使用的Linux是装在Windows上的虚拟机,vmware在Windows上安装了一个USB驱动,来让主机接入虚拟机当中的,可能是同样的BUG导致在Linux系统上也无法正常识别到手柄相关驱动...4 本篇总结 参考资 通过本篇文章,我们了解了如何模拟一个USB鼠标,USB游戏手柄设备,并且可以学习如何对Linux内核中的HID驱动进行修改然后输出相关调试信息。

    42010

    原创 Paper | USB设备开发:从入门到实践指南(一)

    系统的USB gadget驱动,有需要的可以自行查看该部分的源码,位于Linux内核的:linux/drivers/usb/dwc2和linux/drivers/usb/gadget目录下。...18所示: 图18:Linux源码中关于bInterfaceProtocol值的宏定义 2.1.4 端点描述符 端点描述符的结构体定义为于:linux/include/uapi/linux/usb/ch9...2.1.6 HID报告描述符 当USB主机通过接口描述符得知USB设备是USB HID设备时,将会再获取HID报告描述符,在USBPcap中捕获到的HID报告描述符如图21所示: 图21:Wireshark...报告描述符来源于Linux内核示例,如图22所示: 图22:Linux USB HID gadget 驱动文档 所以下一步我们需要能顺利阅读HID报告描述符,可以参考官方文档,官方文档的优点是内容齐全,...通过修改接口描述符字段和HID报告描述符字段,来模拟一个鼠标。 研究一下手柄,讲道理手柄也是使用HID协议,但是Linux的代码里没看到相关定义。 研究非HID协议,比如U盘,网卡,打印机这些。

    2.3K00

    原创 Paper | USB设备开发:从入门到实践指南(三)

    nintendo_hid_devices[] = { { HID_USB_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_PROCON...HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_NINTENDO, USB_DEVICE_ID_NINTENDO_JOYCONL) }, { HID_BLUETOOTH_DEVICE...原装的左右手柄,使用的是HID_BLUETOOTH_DEVICE宏定义,表示匹配的是蓝牙HID协议,并不匹配USB HID协议。...从上面的内容可以知道,如果想要开发Linux下的Switch Pro手柄的客户端,只需要操作eventX文件,并且仔细阅读nintendo_hid_event函数,了解传输数据的数据结构就能实现。...Linux驱动中还未实现,从joydev_event可以看出,Linux的手柄驱动仅支持坐标系和按键功能,所以把支持加速度传感器的手柄给禁用了。

    25810

    如何用Wireshark捕获USB数据?

    现在越来越多的电子设备采用USB接口进行通讯,通讯标准也在逐步提高。那么,我们就会好奇这些设备是如何工作的?而无论你是一个硬件黑客,业余爱好者或者只是对它有一点兴趣的,USB对我们都是具有挑战性的。...本文中,我们将向大家介绍怎样通过wireshark捕获usb数据,使用的环境如下: l Wireshark 2.0.1(SVN)l Linux kernel 4.1.6 你也可以用其他版本的wireshark...这种方式下,设备只是简单的将USB用于接受和发射数据,除此之外就再没有其他通讯功能了。 HID是人性化的接口。这一类通讯适用于交互式,有这种功能的设备有:键盘,鼠标,游戏手柄和数字显示设备。...其中使用的最广的不是USB HID 就是USB Memory了。 每一个USB设备(尤其是HID或者Memory)都有一个供应商ID(Vendor Id)和产品识别码(Product Id)。...我们需要给用户足够的权限来获取linux中的usb数据流。我们可以用udev来达到我们的目的。我们需要创建一个用户组usbmon,然后把我们的账户添加到这个组中。

    3.3K70

    破译优利德旗舰万用表UT181A通讯协议

    UT181A是优利德门下旗舰级手持数字万用表,主打数据记录(Data Logging)功能,支持USB联机通讯。基本评测可以看我以前发的文章。...对破译其它联机通讯的设备也有借鉴意义。 可行性分析 UT181A使用了Silicon Labs HID-to-UART接口模块CP2110. 在操作系统里呈现为一个HID设备,这样的好处是不用装驱动。...从USB到HID,再到UART,实际上是隔了两层,需要层层剥壳,还是有点繁琐。Free USB Analyzer的HID解码,是解为键盘/鼠标数据的;也许它的收费版可以解码为UART。 ?...图:用Free USB Analyzer截获UT181A通讯 不过我还有另一条完全不同的思路,也许会更简单。 API Hook 十几年前,我用过这种方法对SCSI设备的通讯进行劫获。...树莓派 在Debian系的Linux上(Ubuntu或树莓派),CP2110都被识别为HID设备,不需要安装驱动即可使用。

    1.9K80

    linux usb端点

    前言 端点在实际的USB通讯过程种的具体作用与含义十分重要,但是有些难以理解,自己整理一些知识作为备忘。 (注:1、文中的EP表示Endpoint; 一、端点概念。...端点(Endpoint),是主机与设备之间通讯数据的接收或来源。主机与设备之间通信时最终会总用于设备上的各个端点,它是主机与设备间通信流的一个逻辑终端。...USB设备进行访问。...五、端点与管道 1、管道的概念 管道是主机软件(数据缓存区),和USB设备各各端点之间的数据传输连接,他是两者之间通信流的抽象(实际上数据传输是USB总线接口完成)。...1)、“流”指不具有USB定义格式的数据流,流通道中的数据是流的形式,也就是该数据内容不具有USB要求的结构。

    11K31

    python监听usb鼠标插入

    在刚把电脑系统转为linux之后,一直觉得需要通过命令:sudo rmmod psmouse来完成禁用触摸板的操作实在是太不方便了,于是就想着用一个python脚本来完成该操作。...于是在网上找到了pyUSB这个python库,可以轻松的完成对usb设备的操作。...我的整个思路是这样的,首先开机启动一个python程序,不断运行,不停的检查usb设备中是否有usb鼠标的身影,如果有,那么执行上面的那个禁用触摸板的命令,如果没有,就启用触摸板。...关于判断插入usb鼠标的代码已经完成,关于usb设备的必备知识: USB设备分类 USB从设备的分类可以从USB设备接口描述符(Standard Interface Descriptor)对应的的...2-communication device:通讯设备,如电话,moden等等。3-HID:人机交互设备,如键盘,鼠标等。

    3.6K20

    BadUSB的前世今生:USB RUBBER DUCKY和Teensy USB

    USB RUBBER DUCKY和Teensy都可用于实施HID模拟攻击,其中USB RUBBER DUCKY入手简单,傻瓜式操作,但价格不菲啊;而Teensy USB性价比比较高,也可用来制作各种酷炫的...这就是为什么会有一个无处不在的USB标准HID或人机接口设备(Human Interface Device)。任何一个宣称是键盘HID的设备都能够被大多数操作系统自动的探测和接入。...Freebuf小科普 HID(Human Interface Device)人机接口设备类别是Windows最早支持的USB类别。...不管是Windows、Linux、Mac还是Android(当然是不算触摸屏了),各个系统平台所遵守的USB标准都是一致的。所以USB RUBBER DUCKY自然而然就具有了跨平台的特点。...主要特点: ①可以变身为任意类型的设备 ②AVR处理器,16 MHz ③单按钮编程 ④易于使用的Teensy Loader应用程序 ⑤免费软件开发工具 ⑥兼容Mac OS X,Linux和Windows

    4K100
    领券