本地打印机的SNMP?

我正在寻找一种从本地打印机获取信息的方法。 也许使用SNMP协议?

打印机连接USB或PPI(并行端口)。 所有打印机都具有内部TotalPagesCount并支持SNMP。

这里有一些打印机的例子:

  • 兄弟HL1430
  • 兄弟HL5150
  • 兄弟HL1230
  • 京瓷1118
  • 京瓷1128
  • 京瓷2000
  • 京瓷1300
  • 京瓷3920
  • Kyocera 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,如果您需要在繁重的multithreading应用程序或使用SNMPv3中使用它,我不建议使用它。 还有像链接文本这样的其他库看起来非常有前途,但大多数可靠的库都是商业化而且不是很便宜。

如果打印机是网络连接的,以上所有内容都很容易实现,现在如果打印机是USB或PPI连接,您需要亲自进入HP SNMP代理程序,您可以在此处找到一篇好文章。 它说,基本上它是一个小型的Windows软件,它背负着标准的Windows SNMP服务,并通过USB或并行电缆在连接到计算机的默认HP打印机上提供SNMP数据 。 我不知道它是否适用于任何其他品牌,但看起来它使用标准协议DOT4 over USB来模拟典型的TCP / IP通信。 如果有任何标准方法连接到所有这些打印机,这个是最有希望的。 我能想到的另一种方法是破解每个模型的各个驱动程序,看看它们是否提供了这些信息(大多数肯定会这样做),然后分别调用它们来获取它,但是在这个任务中,我认为你在你自己。

编辑

对于驱动程序黑客,我的意思是逆向工程可能是每个驱动程序的工具 例如,如果打印机有一个显示碳粉状态的实用程序试图了解它的工作原理,我会开始使用Depends打开可执行文件,看看它正在使用哪些dll以及它们发布的方法,如果你找到像GetTonerStatus这样的方法在dll中值得尝试使用它。

替代文字http://sofzh.miximages.com/c%23/snapshot.png

如果该工具是用.Net编写的,那就更容易了,因为你可以通过反编译来访问源代码(我不知道这个方法的法律问题)。 使用reflection器来做它,你会清楚地看到它。

alt text http://sofzh.miximages.com/c%23/netReflector.gif

有一本很棒的书涵盖了这个方面,称为逆转:逆向工程的秘密

如前所述,这是一条漫长的道路,但可能是唯一一个实现您想要做的事情,您可能需要在调查我提到的主题之后重新考虑项目的可行性。

您可以通过WMI获取有关打印机的相关信息,但我不确定它是否包含您正在寻找的信息:
http://msdn.microsoft.com/en-us/library/Aa394363

我认为HP打印机将其序列号存储在此注册表项下的某个位置(可能是一个名为identity或类似的键):
HKEY_LOCAL_MACHINE \ SOFTWARE \惠普\

我从来没有使用过SNMP,虽然我记得这个库如果沿着这条路走下去可能会有用:
http://www.codeproject.com/KB/cs/SNMPDLL.aspx

SNMP标准不支持USB或其他连接类型。 它仅支持以太网上的TCP / IP堆栈。 因此,答案应该是否定的。

但我们确实看到一些公司在其他网络/连接类型上实现了SNMP。 但是,此类自定义不是标准化的,您无法使用标准MIB浏览器等进行SNMP查询。