基于BeagleBoard Black实现USB打印请求代理(USB Proxy "Dongle")录制功能的技术咨询
基于BeagleBoard Black实现USB打印请求代理(USB Proxy "Dongle")录制功能的技术咨询
嘿,你的需求完全可行,BeagleBoard Black(BBB)的USB OTG+Host双端口设计正好能适配这个“中间代理+录制”的场景。我来给你拆解下现成方案和自己搭建的核心积木:
一、有没有现成的解决方案?
目前专门针对打印机的USB代理录制工具不多,但通用的USB MITM(中间人)开源项目可以适配调整:
- 可以找找usb-mitm类的开源工具,这类工具原本用于USB设备的抓包和转发,你只需适配打印机的USB功能类(打印机属于USB特定打印功能类),就能实现数据的旁路录制。
- 另外,一些嵌入式USB调试工具的源码也可以参考,比如基于Linux gadget框架的代理实现,不过可能需要你做少量修改来适配打印数据的存储和批量上传逻辑。
如果不想折腾定制,也可以用Linux原生的usbmon工具抓包,但它只能记录数据,没法自动转发——你还得额外写转发逻辑,所以不如直接用MITM工具更高效。
二、自己搭建的核心“积木”
如果要从零搭建,核心分为5个部分,每个部分都有成熟的Linux工具/框架支撑:
1. USB Gadget:模拟打印机让POS识别
BBB的OTG端口可以配置成USB设备模式,用Linux的configfs框架(比旧的gadgetfs更灵活)模拟成和你真实打印机一模一样的USB设备:
- 挂载configfs:
mount -t configfs none /sys/kernel/config - 创建gadget目录,设置和真实打印机一致的VID/PID(避免POS端驱动兼容问题),添加打印功能类,最后启用gadget。
- 完成后,POS会把BBB识别成打印机,直接发送打印请求到BBB的虚拟打印机节点(比如
/dev/usb/lp0)。
2. USB Host:连接真实打印机并转发数据
BBB的Host端口直接连接真实打印机,系统会识别出打印机设备节点(比如/dev/usb/lp1)。你需要写一个简单的转发程序(Python/C都可以):
- 监听虚拟打印机节点的输入数据,同时把数据写入真实打印机节点,保证POS的打印请求能实时传到真实打印机——这一步是核心,必须优先保证转发的稳定性,哪怕录制或上传出问题也不能影响打印。
3. 本地数据录制与缓存
在转发的同时,把打印数据写入本地存储(BBB的eMMC或SD卡):
- 可以按时间戳或批次命名文件,比如
print_job_20240520_1430.dat,避免数据混乱。 - 建议用追加写入的方式,或者每个打印任务生成一个独立文件,方便后续批量上传。
4. 批量上传逻辑
写个定时脚本(用cron或systemd定时器),完成两个任务:
- 检测网络状态:比如ping远程机器,或检查网络接口是否在线。
- 当网络可用时,把本地缓存的打印文件批量发送到远程机器(用
scp、curlPOST都可以),发送成功后删除本地文件,避免重复上传。
5. 高可用性保障
为了确保打印机始终可用,你需要做这些:
- 把转发程序做成systemd服务,配置开机自启、崩溃自动重启,避免程序挂了导致打印中断。
- 转发逻辑要轻量化,用多线程或多进程分开处理“转发”和“录制”,保证转发线程不会被录制/上传操作阻塞。
- 本地存储要预留足够空间,或者添加自动清理逻辑(比如删除已上传超过7天的文件)。
关键注意事项
- VID/PID匹配:一定要让虚拟打印机的VID/PID和真实打印机完全一致,否则POS可能不认,或者用错驱动导致打印乱码。
- 打印数据格式:大多数POS打印机用ESC/POS指令集,都是原始字节流,不需要解析,直接转发和存储就行。
- 网络离线时的可靠性:确保本地缓存不会丢失,尽量用eMMC存储(比SD卡更稳定),或者定期备份缓存文件到外置存储。
备注:内容来源于stack exchange,提问作者Stefan




