Interrogation des périphériques d'impression à l'aide de SNMP pendant que l'imprimante imprime



Je vais vous raconter mon expérience dans la création d'une application qui collecte des statistiques sur les périphériques d'impression utilisant le protocole SNMP. Au total, plus de 1000 appareils et l'enquête sont effectués en temps réel pendant que l'imprimante imprime. Comment tout cela est mis en œuvre, vous apprendrez de l'article.



introduction


SNMP est un protocole Internet standard pour la gestion des périphériques dans les réseaux IP basé sur des architectures TCP / UDP.

L'utilisation de SNMP ne collecte pas d'informations sur l'utilisateur qui a envoyé le fichier à imprimer. De plus, SNMP ne peut pas être utilisé pour les imprimantes locales connectées via USB.
Pour résoudre ces problèmes, vous devez créer un client qui doit collecter des informations et envoyer toutes les statistiques au serveur. L'organisation était tellement établie que le même système d'exploitation Linux était installé sur toutes les machines clientes. En conséquence, le client de collecte des statistiques d'impression est écrit dans le système Linux en tant que démon (un analogue du service sous Windows).

Client de collecte d'informations d'impression


Le client de collecte d'impression (écrit en Python) effectue les tâches suivantes:

  1. intercepte les messages du service d'impression CUPS
  2. enregistre les informations d'impression dans un fichier CSV
  3. envoie des fichiers CSV vers un dossier sur le serveur via FTP

Le fichier CSV contient les champs suivants:

  1. Date et heure du travail d'impression
  2. Adresse IP ou nom de domaine de l'ordinateur à partir duquel le document a été envoyé pour impression
  3. Adresse IP ou hôte du périphérique d'impression
  4. Cups Job ID - ID de travail du service d'impression CUPS
  5. Nom du travail - il s'agit le plus souvent du nom de fichier
  6. Nom de l'utilisateur qui a envoyé l'impression
  7. Nombre de pages
  8. Taille du travail d'impression (taille du travail en Ko)
  9. Statut d'impression (Statut du travail)
  10. Nombre d'exemplaires (nombre d'exemplaires)
  11. Le nombre de copies sur le fichier de travail - est utilisé pour déterminer plus précisément le nombre de copies;
  12. Nombre de pages par protocole SNMP - utilisé pour déterminer plus précisément le nombre de pages
  13. SNMP est disponible - c'est un signe que le périphérique doit être interrogé en continu en utilisant le protocole SNMP pendant l'impression du document
  14. Le compteur du périphérique d'impression au moment du démarrage de l'impression (valeur variable SNMP) est le compteur de vérification, qui détermine le début de l'interrogation SNMP par le serveur

Le client n'a pas d'interface graphique, tous les paramètres sont enregistrés dans le fichier de configuration

Exemple de fichier de configuration
[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


Ainsi, le client est écrit, maintenant nous avons besoin d'un serveur qui non seulement collectera les informations de tous les clients, mais aussi le serveur doit surveiller les situations d'urgence - pause d'impression, papier manquant ou coincé, etc.

Architecture du serveur de collecte des informations d'impression


Le serveur est Ă©crit en C #, le SGBD est MSSQL.

  1. Le configurateur de base de données est une application graphique qui vous permet de créer et de supprimer une base de données.
    La base de données est normalisée au maximum afin qu'il n'y ait pas de champs de texte dans le tableau de statistiques principal pour économiser de l'espace disque.
  2. , GUI SNMP-, OID, .



  3. ( Windows)



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


Avant que le service ne surveille l'impression en temps réel, il est nécessaire d'analyser les anciens fichiers CSV (qui se sont accumulés jusqu'à ce que le serveur fonctionne) et d'enregistrer les informations dans la base de données. Nous appellerons ce point «la première lecture du répertoire du fichier CSV», ce qui peut aider à collecter rapidement les statistiques de l'ancienne impression et à l'enregistrer dans la base de données.

Ensuite, le service passe à une surveillance constante de l'apparence des fichiers CSV dans un dossier dans un flux séparé avec un intervalle de 1 seconde. Chaque fichier CSV est traité dans un flux distinct.

S'il y a beaucoup de fichiers CSV dans le dossier, alors dans ce cas il y a une limite sur le nombre de flux de lecture simultanés de fichiers pour que l'application fonctionne de manière stable. Lorsque le service démarre, il peut y avoir beaucoup de fichiers CSV dans le dossier et ces fichiers sont traités sans interrogation SNMP; en conséquence, la première lecture du répertoire a une limite distincte sur le nombre de threads de traitement de fichiers CSV (il a été établi expérimentalement que le nombre de threads lors de la première lecture de CSV les fichiers doivent être beaucoup plus petits que le nombre de threads après avoir traité un grand nombre de fichiers).

L'algorithme permet de déterminer l'adresse IP par le nom du périphérique et vice versa (déterminer le nom du périphérique par l'adresse IP) à l'aide de la méthode System.Net.Dns.GetHostEntry (). S'il n'y a pas de connexion avec le périphérique, la méthode System.Net.Dns.GetHostEntry () prend très longtemps, en relation avec cela, le client qui fournit ces informations dans CSV a été finalisé. Mais cette vérification est restée sur le serveur et la méthode System.Net.Dns.GetHostEntry () est toujours un goulot d'étranglement.

Enregistrement d'informations dans la base de données


En plus des informations sur l'impression, la base de données stocke des informations pour les statistiques:

  1. Heure de début et de fin de l'interrogation SNMP
  2. nombre total de lignes dans le fichier CSV
  3. Nombre de lignes avec interrogation SNMP activée.

Une liste des périphériques qui ne doivent pas être interrogés est fournie, ce que l'on appelle des exceptions pour lesquelles rien n'est stocké dans la base de données.

Après avoir lu l'intégralité du fichier CSV, des informations sur tous les travaux d'impression sont collectées dans l'objet List, qui doit être contrôlé par l'interrogation SNMP. Après avoir lu le fichier CSV, il est transféré dans l'archive, si spécifié par les paramètres, puis le fichier CSV est supprimé.

Une fois le fichier CSV entièrement lu, il est vérifié que les paramètres d'interrogation sont configurés à l'aide du protocole SNMP, puis les périphériques sont triés par priorité:

  1. Le groupe par défaut, dans lequel se trouvent tous les appareils de la base ricoh_dmnx, est le nom de la base de données du système de surveillance du fabricant Ricoh, à partir de laquelle nous prenons la liste des appareils à interroger.
  2. Périphériques qui se trouvent dans la base de données ricoh_dmnx, mais pas dans les groupes
  3. Périphériques qui se trouvent dans la base de données ricoh_dmnx et qui sont en groupes
  4. Appareils qui ne figurent pas dans la base de données ricoh_dmnx, mais qui se trouvent dans notre base de données de services

Chaque périphérique possède une file d'attente d'impression de sorte qu'à un moment donné, une interrogation SNMP fonctionne avec un seul travail d'impression. Ainsi, pendant que le périphérique est interrogé à l'aide du protocole SNMP, l'utilisateur peut envoyer un autre fichier pour impression et un nouveau fichier CSV peut être reçu sur le serveur, qui est enregistré immédiatement dans la base de données, mais l'interrogation sera effectuée après le courant document.

L'interrogation SNMP suit les modifications du compteur d'impression, l'état du périphérique et le signe d'une erreur de périphérique pendant l'impression. La latence entre les interrogations SNMP est de 300 ms.

Roches sous-marines


L'algorithme du serveur a été constamment amélioré, car il y avait de nombreuses situations différentes dans lesquelles le compteur était mal considéré. Voici quelques conseils tirés de votre expérience personnelle:

1) Ne continuez pas à interroger lorsque le périphérique est dans un état d'erreur (par exemple: du papier est coincé)

2) Une erreur d'imprimante peut changer avec le temps, de sorte que le délai d'interrogation SNMP ne devrait pas fonctionner si l'erreur change (par exemple, l'imprimante n'a plus de papier, mais après avoir ajouté du papier dans le bac, l'état de l'imprimante a changé)

3) Si plusieurs travaux sont envoyés au périphérique d'impression en même temps, le compteur après l'impression du premier travail:
- ne change pas l'Ă©tat
- change le compteur

OID système des périphériques d'impression


Sur la base de l'analyse de ces trois OID, ma demande d'interrogation de périphériques SNMP a été écrite:

1) [1.3.6.1.2.1.43.10.2.1.4.1.1] - Compteur total de périphériques

2) [1.3.6.1.2.1.25.3.5.1 .1.1] - État du périphérique



3) [1.3.6.1.2.1.25.3.2.1.5.1] - Erreur du périphérique lors de l'impression

Rapports


Les rapports sont implémentés à l'aide de SQL Server Reporting Services.

Rapport mensuel de comparaison d'impression




Travaux imprimés par utilisateur




Rapport récapitulatif des demandes SNMP




Statistiques sur les requĂŞtes SNMP




Conclusion


J'ai été heureux de partager mon expérience dans la mise en œuvre de l'une de mes applications les plus complexes, qui fonctionne avec succès depuis 2018.

Une particularité dans la mise en œuvre du projet de collecte d'impression était que je n'avais pas une seule imprimante avec moi. Fonctionné via un émulateur , qui peut être rapidement installé et configuré (il suffit d'avoir un fichier MIB pour les paramètres du périphérique d'impression).

À l'avenir, j'écrirai comment la gestion des agents d'impression a été effectuée.

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


All Articles