打印机打印时使用SNMP轮询打印设备



我将告诉您我在创建使用SNMP协议收集有关打印设备统计信息的应用程序方面的经验。总共有1000多种设备,并且在打印机打印时实时进行调查。如何实现所有这些,您将从本文中学习。



介绍


SNMP是用于基于TCP / UDP架构管理IP网络中设备的标准Internet协议。

使用SNMP不会收集有关发送文件进行打印的用户的信息。另外,SNMP不能用于通过USB连接的本地打印机。
为了解决这些问题,您需要创建一个客户端,该客户端必须收集信息并将所有统计信息发送到服务器。建立该组织的目的是,所有客户端计算机上都安装了相同的Linux OS。因此,用于收集打印统计信息的客户端作为守护程序(Windows中服务的类似物)写在Linux系统中。

打印信息收集客户端


打印收集客户端(用Python编写)执行以下任务:

  1. 拦截来自CUPS打印服务的消息
  2. 将打印信息保存到CSV文件
  3. 通过FTP将CSV文件发送到服务器上的文件夹

CSV文件包含以下字段:

  1. 打印作业的日期和时间
  2. 用来发送文档的计算机的IP地址或域名
  3. IP地址或打印设备的主机
  4. 杯子作业ID-CUPS打印服务中的作业ID
  5. 职位名称-这通常是文件名
  6. 发送打印的用户名
  7. 页数
  8. 打印作业大小(作业大小,以KB为单位)
  9. 打印状态(作业状态)
  10. 份数(份数)
  11. 作业文件上的份数-用于更准确地确定份数;
  12. SNMP协议的页数-用于更准确地确定页数
  13. SNMP可用-这表明在打印文档时应使用SNMP协议对设备进行连续轮询
  14. 开始打印时打印设备的计数器(SNMP变量值)是验证计数器,它确定服务器启动SNMP轮询的时间

客户端没有GUI界面,所有设置都注册在配置文件中

配置文件示例
[main]
#    
app_directory = /opt/printwatcher

#  .    
#        )
stat_file_directory = /opt/printwatcher/data

# ,      
state_file = /opt/printwatcher/data/state.pickle

# ,       
command_state_file = /opt/printwatcher/data/command.state

#    
#   :
#  datetime -     ISO 8601
#  random -    8 
stat_filename_template = {random}_print_jobs.csv

#      
# (    )
max_stat_file_size_mb = 10

#  CSV.  : TAB, SPACE, SEMICOLON, COMMA
csv_delimiter = SEMICOLON

#      
start_service = start


[logging]

#   (DEBUG, INFO, TRACE)
level = DEBUG

#  
log_file = /var/log/printwatcher.log

#      
restart_log_file = /var/log/printwatcher-restart.log

#   
# (  /   logrotate)
max_log_file_size_mb = 10


[cups]

# ,      CUPS
spool_directory = /var/spool/cups/

#    CUPS    
# ( )
job_file_lifetime_hours = 48

#           
# ( )
job_info_lifetime_hours = 48


#  FTP
[ftp]

host = 192.168.1.39
user = ftpuser
password = P@ssw0rd
port = 21

#         FTP
# ( )
connection_retry_seconds = 10

#  ,       FTP
# ( )
connection_timeout_seconds = 3600

#        FTP 
# ( )
polling_interval = 30

#     ftp-
management_directory = /management

#       ftp-
response_directory = /management

#   
update_directory = /update

#      
data_directory = /data

#  SNMP
[snmp]
#      SNMP
retrieve_snmp_info = false
community = public
oid = 1.3.6.1.2.1.43.10.2.1.4.1.1
port = 161


因此,编写了客户端程序,现在我们需要一台服务器,该服务器不仅将收集所有客户端程序的信息,而且该服务器还应监视紧急情况-暂停打印,纸张丢失或卡纸等。

打印信息收集服务器体系结构


服务器是用C#编写的,DBMS是MSSQL。

  1. Database Configurator是一个GUI应用程序,允许您创建和删除数据库。
    数据库已进行最大程度的规范化,因此主统计表中没有文本字段可节省磁盘空间。
  2. , GUI SNMP-, OID, .



  3. ( Windows)



  1. CSV-
  2. CSV
  3. CSV-
  4. CSV- ( ) [ ]
  5. CSV-
  6. OID'
  7. ,


在该服务实时监视打印之前,有必要分析旧的CSV文件(这些文件会一直累积到服务器正常工作为止),然后将信息保存在数据库中。我们将这一点称为“ CSV文件目录的第一读”,它可以帮助快速收集旧打印的统计信息并将其保存到数据库中。

然后,该服务将以1秒的间隔切换到持续监视单独流中的文件夹中CSV文件的外观。每个CSV文件都在单独的流中处理。

如果文件夹中有很多CSV文件,那么在这种情况下,同时读取文件流的数量将受到限制,以使应用程序稳定运行。服务启动时,文件夹中可能有很多CSV文件,并且这些文件在没有SNMP轮询的情况下进行处理;因此,目录的第一次读取对CSV文件处理线程的数量有单独的限制(通过实验确定,第一次读取CSV的线程数量是处理大量文件后,文件数应远小于线程数)。

该算法提供使用System.Net.Dns.GetHostEntry()方法通过设备名称确定IP地址,反之亦然(通过IP地址确定设备名称)的方法。如果没有与设备的连接,则System.Net.Dns.GetHostEntry()方法将花费很长时间,与此相关,将此信息提供给CSV的客户端已经完成。但是此检查仍保留在服务器上,并且System.Net.Dns.GetHostEntry()方法仍然是瓶颈。

将信息保存在数据库中


除了有关打印的信息外,数据库还存储统计信息:

  1. SNMP轮询开始和结束时间
  2. CSV文件中的总行数
  3. 启用S​​NMP轮询的行数。

提供了不应该轮询的设备列表,即所谓的异常,在数据库中没有任何存储。

读取整个CSV文件后,有关所有打印作业的信息将收集在List对象中,应通过SNMP轮询对其进行监视。读取CSV文件后,如果设置指定,则将其传输到存档中,然后删除CSV文件。

完全读取CSV文件后,将检查是否使用SNMP协议配置了轮询设置,然后按优先级对设备进行了排序:

  1. 包含ricoh_dmnx基数的所有设备的默认组是制造商Ricoh的监视系统数据库的名称,我们从中获取要轮询的设备列表。
  2. ricoh_dmnx数据库中但不在组中的设备
  3. ricoh_dmnx数据库中且在组中的设备
  4. 不在ricoh_dmnx数据库中但在我们的服务数据库中的设备

每个设备都有一个打印队列,因此在某个时间点,SNMP轮询仅适用于一个打印作业。因此,在使用SNMP协议查询设备时,用户可以发送另一个文件进行打印,并且可以在服务器上接收到新的CSV文件,该文件立即保存在数据库中,但是轮询将在当前文件之后执行。文献。

SNMP轮询跟踪打印期间打印计数器的变化,设备状态以及设备错误的迹象。SNMP轮询之间的延迟为300毫秒。

水下岩石


服务器算法已得到不断改进,因为在许多不同的情况下都错误地考虑了计数器。以下是一些个人经验提示:

1)当设备处于错误状态时(例如:卡纸),请勿继续轮询

。2)打印机错误可能会随着时间而改变,因此,如果错误发生更改,SNMP轮询超时将不起作用(例如,打印机的纸张用完了,但是在向纸盒中添加纸张后,打印机的状态发生了变化)

3)如果同时将多个作业发送到打印设备,则打印第一个作业后的计数器:
-不更改状态
-更改计数器

打印设备的系统OID


基于对这三个OID的分析,编写了我的SNMP设备轮询应用程序:

1)[1.3.6.1.2.1.43.10.2.1.4.1.1]-设备总数

2)[1.3.6.1.2.1.25.3.5.1 .1.1]-设备状态



3)[1.3.6.1.2.1.25.3.2.1.5.1]-打印期间设备错误

报告书


使用SQL Server Reporting Services实施报表。

每月印刷比较报告




用户打印作业




SNMP请求摘要报告




SNMP请求统计




结论


我很高兴分享自己实施最复杂的应用程序之一的经验,该应用程序自2018年以来已成功运行。

实施打印收集项目的一个特点是我没有一台打印机。通过可以快速安装和配置仿真器进行工作(足以为打印设备的设置提供一个MIB文件)。

将来,我将写有关打印代理的管理方法。

Source: https://habr.com/ru/post/undefined/


All Articles