You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何通过WebUSB配置佳能DR-M160扫描仪实现文档扫描?

WebUSB配置Canon DR-M160扫描仪的解决方案思路

我之前帮朋友折腾过类似的佳能文档扫描仪WebUSB适配问题,结合你的设备信息和测试代码,给你几个关键方向来推进:

1. 先明确设备的通信协议类型

你的Canon DR-M160属于专业文档扫描仪,它不遵循通用的USB视频类(UVC)协议(UVC主要针对摄像头),而是使用佳能自定义的私有USB命令集。你当前发送的request: 0x22 vendor命令显然不被设备识别,这也是导致controlTransfer返回stall的核心原因。

2. 先验证基础USB通信是否正常

先抛开扫描命令,用标准USB控制命令验证设备连接是否没问题,比如读取厂商字符串描述符:

navigator.usb.requestDevice({ filters: [{ vendorId: 0x1083 }] })
 .then(selectedDevice => { device = selectedDevice; return device.open(); })
 .then(() => device.selectConfiguration(1))
 .then(() => device.claimInterface(0))
 // 读取厂商字符串描述符(index 1,英文语言ID 0x0409)
 .then(() => device.controlTransferIn({
     requestType: 'standard',
     recipient: 'device',
     request: 0x06, // GET_DESCRIPTOR
     value: 0x0301, // 0x03是字符串描述符类型,0x01是描述符索引
     index: 0x0409
   }, 256))
 .then(result => {
   const decoder = new TextDecoder();
   console.log('厂商字符串:', decoder.decode(result.data));
 })
 .catch(error => { console.log(error); });

如果这个命令能成功返回CANON,说明你的基础USB通信链路是通的,问题完全出在扫描相关的私有命令上。

3. 逆向现有驱动获取私有命令

佳能不会公开这类私有协议,但你可以通过现有开源驱动抓包或看源码来获取命令细节:

  • SANE驱动源码:SANE项目里有针对Canon DR系列的canon_dr驱动,里面包含了完整的设备初始化、参数配置、触发扫描、读取图像的命令序列,你可以直接参考这些命令来写WebUSB代码。
  • USB抓包:在Linux上用usbmon工具,或者在Windows上用Wireshark+USBPcap,抓取官方扫描工具(比如佳能ScanGear)和设备的通信包,就能看到初始化扫描时发送的所有controlTransfer和bulk传输数据。

4. 调整扫描流程的正确步骤

正常的扫描仪WebUSB流程应该是这样的:

  • 打开设备 -> 选择配置 -> 声明接口
  • 发送初始化命令(厂商私有),设置扫描参数(分辨率、颜色模式、纸张尺寸等)
  • 发送触发扫描命令
  • 从Bulk IN端点(你的设备是EP 0x81)读取二进制图像数据(注意是RAW或TIFF格式,不能用TextDecoder解析,要直接处理ArrayBuffer)
  • 同时监听Interrupt IN端点(EP 0x83),这个端点会返回设备状态(比如扫描进度、错误信息),能帮你判断设备是否准备好发送数据

5. 解决transferIn pending的问题

你当前的transferIn一直pending,是因为之前的controlTransfer返回stall,导致设备端点挂起。解决这个问题的前提是找到正确的初始化命令,让设备进入就绪状态,之后才会从Bulk IN端点返回数据。

内容的提问来源于stack exchange,提问作者Hatem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:36:52