访问USB扫描仪

0 投票
1 回答
2386 浏览
提问于 2025-04-18 12:20

我需要和一个USB扫描仪(具体来说是Epson Perfection V550)进行连接。我试过了ImageScanner,但是它似乎找不到我的设备(我也尝试安装过twain,但出现了一些问题)。

Could not find any downloads that satisfy the requirement twain.)

所以我转而使用PyUSB,它可以识别到设备的存在。现在我面临的问题是,我不确定需要发送什么指令给设备,才能让它扫描并把图片传回给我。

这是我运行的代码:

import usb.core
import usb.util
import sys

venderID = 0x04B8
productID = 0x013B

dev = usb.core.find(idVendor=venderID, idProduct=productID)
for cfg in dev:
    print cfg

运行的结果是:

CONFIGURATION 1: 2 mA ====================================
   bLength              :    0x9 (9 bytes)
   bDescriptorType      :    0x2 Configuration
   wTotalLength         :   0x20 (32 bytes)
   bNumInterfaces       :    0x1
   bConfigurationValue  :    0x1
   iConfiguration       :    0x0
   bmAttributes         :   0xc0 Self Powered
   bMaxPower            :    0x1 (2 mA)
    INTERFACE 0: Vendor Specific ===========================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x0
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x2
     bInterfaceClass    :   0xff Vendor Specific
     bInterfaceSubClass :   0xff
     bInterfaceProtocol :   0xff
     iInterface         :    0x0
      ENDPOINT 0x81: Bulk IN ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x81 IN
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :   0xff
      ENDPOINT 0x2: Bulk OUT ===============================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :    0x2 OUT
       bmAttributes     :    0x2 Bulk
       wMaxPacketSize   :  0x200 (512 bytes)
       bInterval        :   0xff

1 个回答

0

如果你能让你的扫描仪在Windows上正常工作,你可以在Linux主机上设置一个Windows虚拟机。我推荐使用gnome-boxes或者KVM。你需要一台支持CPU虚拟化的主机(大多数现代CPU都支持这个功能)。

然后在主机上安装Wireshark。通过Wireshark,你可以监控Windows扫描仪驱动和设备之间的USB通信。根据这些信息,你可以尝试逆向工程USB协议。一旦你理解了这个协议,使用PyUSB来实现它就相对简单了。

撰写回答