Abfragen von DruckgerÀten mit SNMP, wÀhrend der Drucker druckt



Ich erzĂ€hle Ihnen von meinen Erfahrungen beim Erstellen einer Anwendung, die Statistiken ĂŒber DruckgerĂ€te mithilfe des SNMP-Protokolls sammelt. Insgesamt werden mehr als 1000 GerĂ€te und die Umfrage in Echtzeit durchgefĂŒhrt, wĂ€hrend der Drucker druckt. Wie dies alles umgesetzt wird, erfahren Sie aus dem Artikel.



EinfĂŒhrung


SNMP ist ein Standard-Internetprotokoll zum Verwalten von GerÀten in IP-Netzwerken basierend auf TCP / UDP-Architekturen.

Bei Verwendung von SNMP werden keine Informationen ĂŒber den Benutzer erfasst, der die Datei zum Drucken gesendet hat. DarĂŒber hinaus kann SNMP nicht fĂŒr lokale Drucker verwendet werden, die ĂŒber USB angeschlossen sind.
Um diese Probleme zu lösen, mĂŒssen Sie einen Client erstellen, der Informationen sammelt und alle Statistiken an den Server sendet. Die Organisation war so etabliert, dass auf allen Client-Computern dasselbe Linux-Betriebssystem installiert war. Dementsprechend wird der Client zum Sammeln von Druckstatistiken als Daemon (ein Analogon des Dienstes in Windows) in das Linux-System geschrieben.

Print Information Collection Client


Der Drucksammlungsclient (in Python geschrieben) fĂŒhrt die folgenden Aufgaben aus:

  1. fÀngt Nachrichten vom CUPS-Druckdienst ab
  2. speichert Druckinformationen in einer CSV-Datei
  3. Sendet CSV-Dateien per FTP an einen Ordner auf dem Server

Die CSV-Datei enthÀlt die folgenden Felder:

  1. Datum und Uhrzeit des Druckauftrags
  2. IP-Adresse oder DomÀnenname des Computers, von dem das Dokument zum Drucken gesendet wurde
  3. IP-Adresse oder Host des DruckgerÀts
  4. Cups Job ID - Job ID vom CUPS Print Service
  5. Jobname - Dies ist meistens der Dateiname
  6. Name des Benutzers, der zum Drucken gesendet hat
  7. Seitenzahl
  8. DruckauftragsgrĂ¶ĂŸe (AuftragsgrĂ¶ĂŸe in KB)
  9. Druckstatus (Auftragsstatus)
  10. Anzahl der Exemplare (Anzahl der Exemplare)
  11. Die Anzahl der Kopien in der Auftragsdatei - wird verwendet, um die Anzahl der Kopien genauer zu bestimmen.
  12. Anzahl der Seiten nach SNMP-Protokoll - wird verwendet, um die Anzahl der Seiten genauer zu bestimmen
  13. SNMP ist verfĂŒgbar - dies ist ein Zeichen dafĂŒr, dass das GerĂ€t wĂ€hrend des Druckens des Dokuments kontinuierlich mit dem SNMP-Protokoll abgefragt werden sollte
  14. Der ZĂ€hler des DruckgerĂ€ts zum Zeitpunkt des Druckstarts (SNMP-Variablenwert) ist der ÜberprĂŒfungszĂ€hler, der den Beginn der SNMP-Abfrage durch den Server bestimmt

Der Client hat keine GUI-OberflÀche, alle Einstellungen sind in der Konfigurationsdatei registriert

Beispiel fĂŒr eine Konfigurationsdatei
[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


Der Client ist also geschrieben. Jetzt benötigen wir einen Server, der nicht nur Informationen von allen Clients sammelt, sondern der Server sollte auch abnormale Situationen ĂŒberwachen - Druckpause, fehlendes oder gestautes Papier usw.

Print Information Collection Server-Architektur


Der Server ist in C # geschrieben, das DBMS ist MSSQL.

  1. Database Configurator ist eine GUI-Anwendung, mit der Sie eine Datenbank erstellen und löschen können.
    Die Datenbank wird maximal normalisiert, sodass die Hauptstatistiktabelle keine Textfelder enthÀlt, um Speicherplatz zu sparen.
  2. , GUI SNMP-, OID, .



  3. ( Windows)



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


Bevor der Dienst das Drucken in Echtzeit ĂŒberwacht, mĂŒssen die alten CSV-Dateien (die sich bis zum Betrieb des Servers angesammelt haben) analysiert und die Informationen in der Datenbank gespeichert werden. Wir werden diesen Punkt als "erste Lesung des CSV-Dateiverzeichnisses" bezeichnen, um schnell Statistiken des alten Drucks zu sammeln und in der Datenbank zu speichern.

Anschließend wechselt der Dienst zur stĂ€ndigen Überwachung des Erscheinungsbilds von CSV-Dateien in einem Ordner in einem separaten Stream mit einem Intervall von 1 Sekunde. Jede CSV-Datei wird in einem separaten Stream verarbeitet.

Wenn sich viele CSV-Dateien im Ordner befinden, ist in diesem Fall die Anzahl der gleichzeitigen Leseströme von Dateien begrenzt, damit die Anwendung stabil funktioniert. Wenn der Dienst gestartet wird, können sich viele CSV-Dateien im Ordner befinden, und diese Dateien werden ohne SNMP-Abfrage verarbeitet. Dementsprechend ist beim ersten Lesen des Verzeichnisses die Anzahl der CSV-Dateiverarbeitungsthreads separat begrenzt (es wurde experimentell festgestellt, dass die Anzahl der Threads beim ersten Lesen von CSV liegt Dateien sollten viel kleiner sein als die Anzahl der Threads, nachdem eine große Anzahl von Dateien verarbeitet wurde.

Der Algorithmus ermöglicht das Bestimmen der IP-Adresse anhand des GerĂ€tenamens und umgekehrt (Ermitteln des GerĂ€tenamens anhand der IP-Adresse) mithilfe der System.Net.Dns.GetHostEntry () -Methode. Wenn keine Verbindung zum GerĂ€t besteht, dauert die Methode System.Net.Dns.GetHostEntry () sehr lange. In diesem Zusammenhang wurde der Client, der diese Informationen in CSV bereitstellt, finalisiert. Diese PrĂŒfung blieb jedoch auf dem Server und die System.Net.Dns.GetHostEntry () -Methode ist immer noch ein Engpass.

Informationen in der Datenbank speichern


ZusĂ€tzlich zu Informationen zum Drucken speichert die Datenbank Informationen fĂŒr Statistiken:

  1. Start- und Endzeit der SNMP-Abfrage
  2. Gesamtzahl der Zeilen in der CSV-Datei
  3. Die Anzahl der Zeilen mit aktiviertem SNMP-Polling.

Es wird eine Liste von GerĂ€ten bereitgestellt, die nicht abgefragt werden sollen, sogenannte Ausnahmen, fĂŒr die nichts in der Datenbank gespeichert ist.

Nach dem Lesen der gesamten CSV-Datei werden Informationen zu allen DruckauftrĂ€gen im List-Objekt gesammelt, die durch SNMP-Abfragen ĂŒberwacht werden sollten. Nach dem Lesen der CSV-Datei wird diese, sofern in den Einstellungen angegeben, in das Archiv ĂŒbertragen und anschließend die CSV-Datei gelöscht.

Nachdem die CSV-Datei vollstĂ€ndig gelesen wurde, wird ĂŒberprĂŒft, ob die Abrufeinstellungen mithilfe des SNMP-Protokolls konfiguriert wurden. Anschließend werden die GerĂ€te nach PrioritĂ€t sortiert:

  1. Die Standardgruppe, in der sich alle GerĂ€te der Basis ricoh_dmnx befinden, ist der Name der Datenbank des Überwachungssystems des Herstellers Ricoh, aus der wir die Liste der abzufragenden GerĂ€te entnehmen.
  2. GerÀte, die sich in der Datenbank ricoh_dmnx befinden, jedoch nicht in Gruppen
  3. GerÀte, die sich in der Datenbank ricoh_dmnx befinden und sich in Gruppen befinden
  4. GerÀte, die sich nicht in der Datenbank ricoh_dmnx befinden, sondern in unserer Servicedatenbank

Jedes GerĂ€t verfĂŒgt ĂŒber eine Druckwarteschlange, sodass zu einem bestimmten Zeitpunkt eine SNMP-Abfrage nur mit einem Druckauftrag ausgefĂŒhrt werden kann. WĂ€hrend das GerĂ€t mit dem SNMP-Protokoll abgefragt wird, kann der Benutzer eine weitere Datei zum Drucken senden und eine neue CSV-Datei auf dem Server empfangen, die sofort in der Datenbank gespeichert wird. Die Abfrage wird jedoch nach der aktuellen durchgefĂŒhrt dokumentieren.

Die SNMP-Abfrage verfolgt Änderungen des DruckzĂ€hlers, des GerĂ€testatus und ein Zeichen eines GerĂ€tefehlers wĂ€hrend des Druckvorgangs. Die Latenz zwischen SNMP-Abfragen betrĂ€gt 300 ms.

Unterwasserfelsen


Der Serveralgorithmus wurde stÀndig verbessert, da es viele verschiedene Situationen gab, in denen der ZÀhler falsch betrachtet wurde. Hier einige Tipps aus persönlicher Erfahrung:

1) Setzen Sie die Abfrage nicht fort, wÀhrend sich das GerÀt in einem Fehlerzustand befindet (z. B. Papierstau).

2) Ein Druckerfehler kann sich im Laufe der Zeit Ă€ndern, sodass das SNMP-Abfragezeitlimit nicht funktionieren sollte, wenn sich der Fehler Ă€ndert (z. Der Drucker hat kein Papier mehr, aber nach dem HinzufĂŒgen von Papier zum Fach hat sich der Druckerstatus geĂ€ndert.)

3) Wenn mehrere AuftrÀge gleichzeitig an das DruckgerÀt gesendet werden, Àndert der ZÀhler nach dem Drucken des ersten Auftrags:
- den Status nicht
- Àndert den ZÀhler

System-OIDs von DruckgerÀten


Basierend auf der Analyse dieser drei OIDs wurde meine Anwendung zum

Abrufen von SNMP-GerÀten geschrieben: 1) [1.3.6.1.2.1.43.10.2.1.4.1.1] - GesamtgerÀtezÀhler

2) [1.3.6.1.2.1.25.3.5.1 .1.1] - GerÀtestatus



3) [1.3.6.1.2.1.25.3.2.1.5.1] - GerÀtefehler beim Drucken

Berichte


Berichte werden mit SQL Server Reporting Services implementiert.

Monatlicher Druckvergleichsbericht




Gedruckte Jobs nach Benutzer




SNMP-Anforderungszusammenfassungsbericht




SNMP-Anforderungsstatistik




Fazit


Ich freute mich, meine Erfahrungen bei der Implementierung einer meiner komplexesten Anwendungen zu teilen, die seit 2018 erfolgreich funktioniert.

Eine Besonderheit bei der Umsetzung des Drucksammlungsprojekts war, dass ich keinen einzigen Drucker bei mir hatte. Arbeitete ĂŒber einen Emulator , der schnell installiert und konfiguriert werden kann (nur eine MIB-Datei fĂŒr die Einstellungen des DruckgerĂ€ts).

In Zukunft werde ich darĂŒber schreiben, wie das Management von Druckagenten durchgefĂŒhrt wurde.

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


All Articles