向 USB 设备(指纹扫描仪)发送命令,无需 Linux 驱动程序

向 USB 设备(指纹扫描仪)发送命令,无需 Linux 驱动程序

我正在尝试创建一个远程控制的应用程序指纹传感器(链接中包含指南)用于在 Raspberry PI 3 型号上注册和识别指纹。仅在 Windows 上有一个针对此特定功能的 SDK_DEMO,您可以在我上面提到的 Guile 中找到它。

  • SDK_DEMO 是在 Visual Studio 上用 C++ 编写的,因此我无法操作代码以在 Raspberry Pi 3 上运行它。

从 SDK_DEMO 源代码中,我找出了需要发送哪个命令来执行任务。

命令

CMD_NONE                = 0x00,
CMD_OPEN                = 0x01,
CMD_CLOSE               = 0x02,
CMD_USB_INTERNAL_CHECK  = 0x03,
CMD_CHANGE_BAUDRATE     = 0x04,
CMD_MODULE_INFO         = 0x06,

CMD_CMOS_LED            = 0x12,

CMD_ENROLL_COUNT        = 0x20,
CMD_CHECK_ENROLLED      = 0x21,
CMD_ENROLL_START        = 0x22,
CMD_ENROLL              = 0x23,
CMD_ENROLL1             = 0x23,
CMD_ENROLL2             = 0x24,
CMD_ENROLL3             = 0x25,
CMD_IS_PRESS_FINGER     = 0x26,

CMD_DELETE              = 0x40,
CMD_DELETE_ALL          = 0x41,

CMD_VERIFY              = 0x50,
CMD_IDENTIFY            = 0x51,
CMD_VERIFY_TEMPLATE     = 0x52,
CMD_IDENTIFY_TEMPLATE   = 0x53,

CMD_CAPTURE             = 0x60,

CMD_GET_IMAGE           = 0x62,
CMD_GET_RAWIMAGE        = 0x63,

CMD_GET_TEMPLATE        = 0x70,
CMD_ADD_TEMPLATE        = 0x71,
CMD_GET_DATABASE_START  = 0x72,
CMD_GET_DATABASE_END    = 0x73,

CMD_FW_UPDATE           = 0x80,
CMD_ISO_UPDATE          = 0x81,
CMD_FAKE_DETECTOR       = 0x91,

CMD_SET_SECURITY_LEVEL  = 0xF0,
CMD_GET_SECURITY_LEVEL  = 0xF1,

ACK_OK                  = 0x30,
NACK_INFO               = 0x31,

SKD_DEMO 将指纹传感器识别为大容量存储,并以某种方式运行类似的命令。

在 Ubuntu 中,当我插入 USB 设备时,我没有安装任何大容量存储,并且lsusb 得到以下信息:

在此输入图像描述

我一直在寻找这个并试图

echo "0x12" >> /dev/bus/usb/001/008

但我收到无效参数的写入错误。

以下是回显尝试的终端命令:

在此输入图像描述

有没有办法可以发送这种格式的原始命令并执行操作,而无需在 Linux 上为此 USB 设备编写驱动程序?

答案1

我不认为它可以那样工作。一方面,echo "0x012...发送了 ASCII 字符的文字字符串0x12,它只是与设备通信所需的实际二进制数据的 Base-16 表示形式。

或许可以看看 python(您也可以使用许多其他语言来执行此操作,但是 Python 通常是一个不错的起点)以及与 USB 设备进行通信。也许在这里:https://stackoverflow.com/questions/44290837/how-to-interact-with-usb-device-using-pyusb

答案2

你应该写/dev/bus/usb/[vid:pid]vidpid是写在 ID 旁边的数字。对于你的情况,你可以尝试这个命令:

echo "0x12" >> /dev/bus/usb/001/2009:7638

答案3

SDK_DEMO似乎使用COM端口连接到Windows中的指纹扫描仪,并且教程表明使用USB转串口转换器是预期的方式。由于命令集包括CMD_GET_TEMPLATECMD_ADD_TEMPLATE,可能分别用于向扫描仪读取和写入指纹模板,因此 SDK_DEMO 实际上可能是实施大容量存储模拟。

在您的lsusb列表图片中(顺便说一句,请不要附加文本图片;如果可能的话,只需复制并粘贴实际文本),该Bus 001 Device 008设备似乎具有 的 USB 供应商和产品 ID 2009:7638

不幸的是 USB 供应商 ID2009 似乎指的是iStorage,并且在该供应商上,已知仅存在少数闪存驱动器 ID。

另一方面,USB转串口转换器芯片的ID通常是可配置的,因为当这种芯片用作较大产品的一部分时,较大产品的供应商希望它有自己的供应商和产品代码。因此,首先您必须查明具有 ID 的 USB 设备是否2009:7638确实是具有自定义 ID 的 USB 串行转换器,或者是否有其他情况。

为此,请lsusb -d 2009:7638 -v在连接设备时运行该命令。如果输出包含这样的行,则它肯定是 USB 转串口转换器:

  bInterfaceClass       255 Vendor Specific Class
  bInterfaceSubClass    255 Vendor Specific Subclass
  bInterfaceProtocol    255 Vendor Specific Protocol
  iInterface              2 USB Serial Converter

但如果设备实际上提供 USB 大容量存储接口,则输出将包含 或bDeviceClassbInterfaceClass值为 的行8 Mass Storage。如果是这样,那么该设备也应该出现在lsblk输出中。

如果 USB 转串口转换器芯片是 FTDI 产品(如您链接的指南所建议),则其正确的驱动程序模块可能是ftdi_sio.要加载模块并使其了解自定义 ID:

modprobe ftdi_sio
echo 2009 7638 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id

相同的策略也可用于其他 USB 转串口驱动模块;只需替换这两个命令中的模块名称即可。

如果您无法识别正确的驱动程序模块,请运行lsusb -d 2009:7638 -v > /tmp/usbserial-info.txt并编辑您的问题以将结果文件的内容添加/tmp/usbserial-info.txt到其中。

如果 USB 转串口驱动程序识别出该设备,则/dev/ttyUSB0现在应该会出现一个设备节点。这将是用于与指纹扫描仪通信的设备。

/dev/bus/usb/xxx/yyy您尝试使用的设备旨在/dev/bus/usb/001/008libusb,因为它们要求使用设备节点的应用程序了解不同的USB端点USB传输模式。一个 USB 设备至少有一个控制端点并且可能有多个接口,每个都有多个端点。

设备/dev/bus/usb/...节点允许使用 USB 的完整功能集,但正因为如此,它们实际上不能被脚本使用;基本上,这些设备节点的存在是特定系统调用的目标,而不是简单地将数据传入和传出。

相关内容