我正在寻找一种从本地打印机获取信息的方法。也许使用 SNMP 协议?
打印机通过 USB 或 PPI(并行端口)连接。所有打印机都有一个内部 TotalPagesCount 并支持 SNMP。
以下是打印机的一些示例:
- 兄弟HL1430
- 兄弟HL5150
- 兄弟HL1230
- 京瓷1118
- 京瓷1128
- 京瓷2000
- 京瓷1300
- 京瓷3920
- 京瓷1920
- 京瓷1350
这可能吗?谢谢
我认为 SNMP 是正确的方法。大多数打印机都实现了标准打印机 MIB和RFC 1213 MIB,因此您可以从那里获得的任何属性都将与模型无关。例如,如果您查找序列号,您的属性可能是 prtGeneralSerialNumber 1.3.6.1.2.1.43.5.1.1.17
对于您需要在特定 MIB 中搜索的其他属性,例如在HP Laserjet MIB中,您有很多东西,例如打印介质使用、打印介质单工计数、打印介质双工计数, 使用平均碳粉覆盖率, 扫描介质使用率, 总颜色页数.....
要使用 SNMP,最扩展的库是Net-SNMP,但它使用 C API,如果您需要在繁重的多线程应用程序中使用它或使用 SNMPv3,我不推荐它。还有其他库,如链接文本,看起来很有前途,但大多数可靠的库都是商业的,而且不是很便宜。
如果打印机是网络连接的,以上所有内容都非常容易实现,现在如果打印机是 USB 或 PPI 连接的,您需要动手使用 HP SNMP 代理,您可以在这里找到一篇很棒的帖子。它说基本上它是一个小型 Windows 软件,搭载标准 Windows SNMP 服务,并在通过 USB 或并行电缆连接到计算机的默认 HP 打印机上提供 SNMP 数据. 我不知道它是否适用于任何其他品牌,但看起来它使用标准协议 DOT4 over USB 来模拟典型的 TCP/IP 通信。如果有任何标准方法可以连接到所有这些打印机,那么这个是最有前途的。我能想到的另一种方法是破解每个模型的各个驱动程序,以查看它们是否提供此类信息(肯定会提供)并分别调用它们以获取它,但在这项任务中,我认为您正在你自己。
编辑
对于驱动程序黑客,我的意思是逆向工程可能是每个驱动程序的工具。例如,如果打印机有一个显示墨粉状态的实用程序尝试了解它是如何工作的,我会开始使用Depends打开可执行文件并查看它正在使用哪些 dll 以及它们发布的方法,如果你找到像 GetTonerStatus 这样的方法在 dll 中值得尝试使用它。
(来源:dependencywalker.com)
如果该工具是用 .Net 编写的,那就更容易了,因为您可以通过反编译来访问源代码(我不知道这种方法的法律问题)。用反光板来做,你会看得很清楚。
(来源:corypeters.net)
有一本很棒的书涵盖了这方面的内容,称为Reversing: Secrets of Reverse Engineering
如前所述,这是一条漫长的道路,但可能是实现您想要做的唯一的道路,您可能想在调查一下我提到的主题后重新考虑项目的可行性。
您可以通过 WMI 获取有关打印机的大量信息,但我不确定它是否包含您要查找的信息:http:
//msdn.microsoft.com/en-us/library/Aa394363
我认为 HP 打印机将其序列号存储在此注册表项下的某处(可能是称为身份或类似的项):
HKEY_LOCAL_MACHINE\SOFTWARE\Hewlett-Packard\
我从来没有使用过 SNMP,虽然我记得这个库如果你走这条路可能有用:http:
//www.codeproject.com/KB/cs/SNMPDLL.aspx
SNMP 标准不支持 USB 或其他连接类型。它仅支持以太网上的 TCP/IP 堆栈。因此,答案应该是NO或不可能。
但我们确实看到一些公司在其他网络/连接类型上实施 SNMP。但是,这样的定制不是标准化的,您不能使用标准 MIB 浏览器等进行 SNMP 查询。