Ответ 1
Я думаю, что SNMP - правильный подход. Большинство принтеров реализуют стандартный принтер MIB и RFC 1213 MIB, поэтому любое свойство, которое вы можете получить, будет независимым от модели. Например, если вы ищете серийный номер, ваше свойство, вероятно, prtGeneralSerialNumber 1.3.6.1.2.1.43.5.1.1.17
Для других свойств вам нужно будет искать в определенных MIB, например, в HP Laserjet MIB у вас есть много таких вещей, как использование печатных носителей, число печатных носителей, число симплексных, печатные -media-duplex-count, средняя загрузка тонера, использование отсканированных носителей, общее количество страниц в цвете.....
Чтобы использовать SNMP, наиболее расширенной библиотекой является Net-SNMP, но она использует API C, и я не рекомендую ее использовать, если вам нужно использовать ее в многопоточных приложениях или при использовании SNMPv3. Есть и другие библиотеки, такие как текст ссылки, которые выглядят очень многообещающе, но большинство надежных библиотек там коммерческие и не очень дешевые.
Все вышеперечисленное довольно легко реализовать, если принтер подключен к сети, теперь, если принтер подключен через USB или PPI, вам нужно заполучить агента HP SNMP Proxy Agent, вы можете найти отличное сообщение здесь. В нем говорится, что в основном это небольшое программное обеспечение Windows, которое поддерживает стандартную службу Windows SNMP и предоставляет данные SNMP на принтере HP по умолчанию, подключенном к компьютеру через USB или параллельный кабель. Я не знаю, работает ли он с другими брендами, но похоже, что он использует стандартный протокол DOT4 через USB для эмуляции типичной связи TCP/IP. Если есть какой-либо стандартный способ подключения ко всем этим принтерам, этот вариант является наиболее перспективным. Еще один метод, который я могу придумать, - это взломать отдельные драйверы каждой модели, чтобы увидеть, предоставляют ли они такую информацию (что, безусловно, делают), и сделать соответствующие обращения к ним, чтобы получить ее, но в этой задаче я думаю, что вы на свой собственный.
EDIT
Под взломом драйвера я подразумеваю реверс-инжиниринг, вероятно, инструментов каждого драйвера. Например, если у принтера есть утилита, показывающая состояние тонера, попытайтесь понять, как он работает, я бы начал использовать Зависит от, чтобы открыть исполняемый файл и посмотреть, какие библиотеки он использует и какие методы они публикуют, если в dll вы найдете такой метод, как GetTonerStatus, который стоит попробовать.
(источник: dependencywalker.com)
Если инструмент написан на .Net, это намного проще, потому что у вас может быть доступ к исходному коду путем его декомпиляции (я не знаю о юридических проблемах этого метода). Используйте отражатель, чтобы сделать это, и вы увидите это ясно.
(источник: corypeters.net)
Существует замечательная книга, посвященная этим аспектам, которая называется Реверс: Секреты обратного инжиниринга
.Как уже говорилось, это долгий путь, но, вероятно, единственный, который позволит вам достичь того, что вы хотите сделать, вы можете пересмотреть жизнеспособность проекта после небольшого изучения упомянутых мною тем.