项目概述
MDB-Sniffer 是一个基于 C/C++ 开发的开源工具,旨在为自动售货机(Vending Machine)的 MDB (Multi-Drop Bus) 协议提供非侵入式的数据监听与分析能力。
在自动售货机行业中,MDB 是事实上的标准通信协议,用于连接主控制器(VMC)与各类外设(如硬币机、纸币接收机、信用卡支付终端等)。由于 MDB 协议采用的是一种特殊的 9600 波特率、9 位数据位的串行通信,且物理层电压较高,开发者在调试设备或分析第三方硬件时,往往难以直接获取实时数据流。
MDB-Sniffer 填补了这一空白,它允许开发者将硬件接口(通常是通过串口转接)连接到 MDB 总线,将原始的二进制数据流转换为可读的文本日志,从而实现对交易流程、错误代码和设备状态的实时监控。
核心技术原理
1. MDB 协议特性
MDB 采用的是 主从架构 (Master-Slave)。主控制器 (VMC) 掌控总线,只有在 VMC 发起请求后,外设才能响应。其物理层特点包括: - 波特率:9600 bps。 - 数据位:9 位(第 9 位通常用于区分地址帧和数据帧)。 - 逻辑电平:非标准的 RS-232,通常需要专门的电平转换电路。
2. Sniffer 的工作模式
MDB-Sniffer 并不参与总线通信(不发送数据),而是处于 监听模式 (Promiscuous Mode)。它通过捕捉总线上的电平变化,将捕获到的字节流根据 MDB 协议定义的帧结构进行切分,并将其映射为人类可读的指令。
项目功能特性
- 实时流捕获:支持对 MDB 总线数据的实时截获,无延迟显示。
- 协议解析:将原始的十六进制 (Hex) 数据转换为 MDB 标准指令(例如:
VMC -> CoinMech: POLL)。 - 多设备支持:能够识别并区分不同地址的外设(硬币机、纸币机、支付终端等)。
- 日志记录:支持将捕获的数据导出为文件,方便后续进行离线分析和故障回溯。
- 轻量化设计:使用 C/C++ 编写,具有极高的执行效率,确保在高速数据流下不会丢失数据包。
快速上手实例
要运行 MDB-Sniffer,你不仅需要软件,还需要一个简单的硬件链路。
硬件连接方案
由于 PC 无法直接处理 MDB 的 9 位数据和电平,你通常需要:
MDB 总线 \(\rightarrow\) MDB-to-UART 转换板 \(\rightarrow\) USB-to-Serial 适配器 \(\rightarrow\) PC
软件编译与运行
假设你已经克隆了项目仓库:
git clone https://github.com/MarginallyClever/MDB-Sniffer.git cd MDB-Sniffer mkdir build && cd build cmake .. make
运行程序(以 Linux 为例,假设设备在 /dev/ttyUSB0):
./mdb_sniffer /dev/ttyUSB0
数据输出实例分析
当你启动程序后,你会看到类似下面的输出流:
场景:用户投入一枚硬币
[10:05:21.123] VMC -> CoinMech: POLL (0x10) [10:05:21.125] CoinMech -> VMC: ACK (0x00) [10:05:22.450] VMC -> CoinMech: POLL (0x10) [10:05:22.452] CoinMech -> VMC: CREDIT_ADDED (0x02), Value: 1.00 [10:05:22.455] VMC -> CoinMech: ACK (0x00)
解析:
1. POLL (0x10):VMC 询问硬币机:“你那边有新消息吗?”
2. ACK (0x00):硬币机回答:“没有,一切正常。”
3. CREDIT_ADDED:当用户投入硬币,硬币机在响应 POLL 时发送了 0x02 状态码,告知 VMC 增加了 1.00 单位的余额。
进阶应用场景
1. 支付终端调试
当你集成一个新的信用卡支付模块时,如果支付失败但设备没有报错,可以使用 MDB-Sniffer 查看 VMC 发出的 PAYMENT_REQUEST 是否被正确接收,以及支付终端返回的 PAYMENT_REJECTED 错误码具体是什么。
2. 兼容性测试
验证第三方外设是否严格遵守 MDB 标准。例如,检查外设在响应时间是否超过了协议规定的时限(Timeout),这在实际部署中是导致设备随机重启或掉线的常见原因。
3. 逆向分析
对于某些闭源的旧款售货机,通过监听其与外设的通信,可以推断出其自定义的扩展指令集,为开发兼容硬件提供依据。
开发建议与注意事项
如果你计划基于此项目进行二次开发,请注意以下几点:
- 9 位数据位处理:大多数标准的 UART 驱动只支持 8 位数据。在 Linux 下,你可能需要使用
termios结构体中的CSIZE设置,或者通过将波特率翻倍并利用奇偶校验位(Parity Bit)来模拟第 9 位。 - 电平保护:绝对不要将 MDB 总线直接连接到你的电脑串口!MDB 的电压远高于 TTL 电平,直接连接会瞬间烧毁你的主板或 USB 转串口芯片。必须使用隔离电路或专门的 MDB 适配器。
- 性能优化:在处理高频通信时,建议将日志写入异步队列,避免因为磁盘 I/O 阻塞导致串口缓冲区溢出而丢包。
总结
MDB-Sniffer 是一个极其纯粹且高效的底层工具。它将复杂的二进制协议透明化,让开发者能够像使用 Wireshark 分析网络包一样分析自动售货机的内部通信。无论你是硬件工程师还是嵌入式软件开发者,这个项目都是进入 Vending 行业协议世界的绝佳入口。



还没有评论,来说两句吧...