# SNMP 打印监控使用说明 ## 功能说明 通过 SNMP 协议监控 HP 打印机的物理打印完成状态,而不是仅依赖打印队列的任务提交。 ## 工作原理 1. **提交打印** → `job.print()` 阻塞,等待任务进入打印队列 2. **任务入队** → 返回,记录当前打印机页数计数器 `baseCount` 3. **SNMP 轮询** → 每 2 秒查询一次打印机页数计数器 4. **检测完成** → 当前页数 >= `baseCount + 1` 时,触发回调 5. **超时保护** → 默认 60 秒超时,超时后也触发回调 ## 配置步骤 ### 1. 打印机端配置 HP 3004dn 需要开启 SNMP 支持(出厂默认开启): 1. 进入打印机 Web 管理界面(浏览器访问打印机 IP) 2. 导航:`网络` → `SNMP` 3. 确认: - `启用 SNMP v1/v2c` 已勾选 - `团体名称(读取)` 为 `public`(默认值) - `UDP 端口` 为 `161`(默认值) ### 2. 客户端配置 编辑 `config/print.properties`: ```properties printer.type=hp printer.name=HP LaserJet 3004 # 添加打印机 IP(替换为实际 IP) printer.ip=192.168.1.100 ``` ### 3. 网络配置 确保客户端能访问打印机的 UDP 161 端口: ```bash # Windows 测试连通性 ping 192.168.1.100 # 如果有防火墙,需放行 UDP 161 端口 ``` ## 测试 SNMP 连接 ```bash # 在 mes-print 项目目录 cd C:/Users/jcxa/Desktop/T09/khd/mes-print # 编译测试程序 javac -encoding UTF-8 -d build/classes -cp "lib/*" src/com/mes/print/TestSnmp.java # 运行测试(替换为实际打印机 IP) java -cp "build/classes;lib/*" com.mes.print.TestSnmp 192.168.1.100 ``` **预期输出**: ``` === SNMP 打印机监控测试 === 打印机 IP: 192.168.1.100 1. 测试连接... [PrinterMonitor] 已连接到打印机:192.168.1.100 [PrinterMonitor] 测试连接 - 页数=1234, 状态=3 2. 查询打印机状态... 总打印页数: 1234 打印机状态: 3 (3=空闲, 4=打印中, 5=预热) 3. 开始监控打印完成(请手动发送打印任务)... 按 Ctrl+C 退出监控 ``` 然后手动打印一张测试页,程序会检测到页数变化并输出: ``` [PrinterMonitor] 当前页数=1234,目标=1235 [PrinterMonitor] 当前页数=1235,目标=1235 [PrinterMonitor] 打印完成检测到!页数从 1234 → 1235 ✓ 检测到打印完成! ``` ## 故障排查 ### 1. 连接失败 **错误**:`连接失败,请检查...` **排查**: - 检查打印机 IP 是否正确(能 ping 通) - 检查打印机 SNMP 是否启用 - 检查防火墙是否拦截 UDP 161 端口 - 尝试用 Windows 自带工具测试: ```bash # 安装 SNMP 工具(如果没有) # 控制面板 → 程序 → 启用或关闭 Windows 功能 → SNMP 工具 # 测试查询 snmpget -v2c -c public 192.168.1.100 1.3.6.1.2.1.43.10.2.1.4.1.1 ``` ### 2. 页数不变化 **现象**:打印了但页数计数器不增加 **原因**: - 某些打印机型号的 OID 不同 - 打印任务被取消或失败 **解决**: - 尝试其他 OID(参考打印机 MIB 文档) - 检查打印机实际是否出纸 ### 3. 监控超时 **现象**:60 秒后仍未检测到完成 **原因**: - 打印任务卡在队列(打印机离线/缺纸/卡纸) - 大文件打印耗时超过 60 秒 **解决**: - 增加超时时间(修改 `HpPrinter.java:90` 的 60 改为更大值) - 检查打印机物理状态 ## 性能影响 - **轮询间隔**:2 秒/次 - **网络开销**:每次查询 ~200 字节 - **CPU 占用**:极低(单独线程,非阻塞) - **延迟**:物理打印完成后 0-2 秒内检测到 ## 禁用 SNMP 监控 如果不需要物理打印完成检测,只需注释掉配置: ```properties # printer.ip=192.168.1.100 ``` 此时打印任务提交到队列后立即返回(原有行为)。 ## API 文档 ### PrinterMonitor ```java // 创建监控器 PrinterMonitor monitor = new PrinterMonitor("192.168.1.100"); monitor.init(); // 查询页数 Long count = monitor.getPageCount(); // 查询状态 Integer status = monitor.getPrinterStatus(); // 1=其他, 3=空闲, 4=打印中, 5=预热 // 监控打印完成 monitor.waitForPrintComplete( 1, // 预期页数增量 () -> { // 完成回调 System.out.println("打印完成"); }, 60 // 超时秒数 ); // 关闭监控 monitor.close(); ``` ### HpPrinter ```java HpPrinter printer = new HpPrinter(); // 启用 SNMP 监控 printer.enableSnmpMonitor("192.168.1.100"); // 设置完成回调 printer.setOnPrintComplete(() -> { System.out.println("物理打印完成"); }); // 打印(会阻塞直到物理打印完成) printer.printFlowCard(data); ``` ## 依赖库 - **snmp4j-3.7.7.jar** (631 KB) - 需要添加到项目 classpath ## 支持的打印机型号 理论上支持所有实现了 **Printer MIB (RFC 3805)** 的网络打印机,包括: - HP LaserJet 系列 - Canon 网络打印机 - Epson 网络打印机 - 其他企业级网络打印机 不支持: - USB 本地连接打印机(无网络接口) - 不支持 SNMP 的低端打印机