本地打印机的SNMP?

时间:2010-04-30 12:35:23

标签: c# vb.net snmp

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

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

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

  • 兄弟HL1430
  • 兄弟HL5150
  • 兄弟HL1230
  • Kyocera 1118
  • Kyocera 1128
  • Kyocera 2000
  • Kyocera 1300
  • Kyocera 3920
  • Kyocera 1920
  • Kyocera 1350

这可能吗?感谢

3 个答案:

答案 0 :(得分:16)

我认为SNMP是正确的方法。大多数打印机实现standard printer MIBRFC 1213 MIB,因此您可以从中获得的任何属性都将与模型无关。例如,如果您查找序列号,您的属性可能是prtGeneralSerialNumber 1.3.6.1.2.1.43.5.1.1.17

对于其他属性,您需要在特定的MIB中进行搜索,例如在HP Laserjet MIB中您有很多东西,例如 print-media-usage,printed-media-simplex-count ,打印介质双面打印,使用平均墨粉覆盖率,扫描介质使用量,总色页数......

要使用SNMP,最扩展的库是Net-SNMP,但它使用的是C API,如果您需要在繁重的多线程应用程序或使用SNMPv3中使用它,我不建议使用它。还有像link text这样的其他库看起来非常有前景,但大多数可靠的库都是商业化而且不是很便宜。

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

修改

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

alt text http://www.dependencywalker.com/snapshot.png

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

alt text http://corypeters.net/wp-content/uploads/netReflector.gif

有一本很棒的书涵盖了Reversing: Secrets of Reverse Engineering

这个方面

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

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:0)

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

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