我正在寻找一种从本地打印机获取信息的方法.也许使用SNMP协议?
打印机连接USB或PPI(并行端口).所有打印机都具有内部TotalPagesCount并支持SNMP.
这里有一些打印机的例子:
这可能吗?谢谢
Cri*_*n T 17
我认为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 Proxy Agent,您可以在此处找到一篇好文章.它说,基本上它是一个小型的Windows软件,它背负着标准的Windows SNMP服务,并通过USB或并行电缆在连接到计算机的默认HP打印机上提供SNMP数据.我不知道它是否适用于任何其他品牌,但看起来它使用标准协议DOT4 over USB来模拟典型的TCP/IP通信.如果有任何标准方法连接到所有这些打印机,这是最有希望的.我能想到的另一种方法是破解每个模型的各个驱动程序,看看它们是否提供了这些信息(大多数肯定会这样做),然后分别调用它们来获取它,但是在这个任务上,我认为你在你自己.
编辑
对于驱动程序黑客,我的意思是逆向工程可能是每个驱动程序的工具 例如,如果打印机有一个显示碳粉状态的实用程序试图了解它的工作原理,我会开始使用Depends打开可执行文件,看看它正在使用哪些dll以及它们发布的方法,如果你找到像GetTonerStatus这样的方法在DLL中,值得尝试使用它.
替代文字http://www.dependencywalker.com/snapshot.png
如果该工具是用.Net编写的,那就更容易了,因为你可以通过反编译访问源代码(我不知道这个方法的法律问题).使用反射器来做它,你会清楚地看到它.
alt text http://corypeters.net/wp-content/uploads/netReflector.gif
有一本很棒的书涵盖了这个方面,称为逆转:逆向工程的秘密
如前所述,这是一条漫长的道路,但可能是唯一一个实现您想要做的事情,您可能需要在调查我提到的主题之后重新考虑项目的可行性.