求助:如何通过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
相关产品推荐
相关产品推荐

