La boîte à Tutoriels de Christopher PECAUD

Top

Utilisation de la bibliothèque de type OLEPRN.DLL avec Delphi

Laisser un commentaire

SOMMAIRE

I. INTRODUCTION
II. LE PROTOCOLE SNMP
III. MISE EN OEUVRE DE SNMP avec Delphi
IV. CONCLUSION

I Introduction

Au cous de ce tutoriel je vais bous montrer comment utiliser la bibliothèque de types oleprn.dll afin de récupérer des informations sur une ou plusieurs imprimantes rattachées à un réseau. Nous allons pouvoir récupérer des informations générales comme son adresse IP ou encore des informations sur des jobs en cours de traitement. Au cours de ce tutoriel nous allons détailler les principas d'utilisation du protocole SNMP...

II Le protocole SNMP

Avant de commencer à coder notre application, je voudrai vous donner quelques informations sur ce protocole.

1. Définition

SNMP (Simple Network Management Protocol) est un protocole permettant de communiquer avec différents périphériques sur un réseau si ceux-ci le prennent en charge. Cela permet donc aux administrateurs réseau de pouvoir diagnostiquer rapidement une faille touchant un de ces éléments sur le réseau. Dans ce tutoriel nous allons nous intéresser seulement aux imprimantes, mais ce protocole permet de mettre en place une surveillance des hubs, des switchs, etc...

On communique avec ces périphériques par l’intermédiaire d’objets gérables qui sont rangés dans une table ordonnée que l’on appelle MIB (« Management Information Base »). La MIB contient donc différents objets renfermant une information spécifique pouvant être lue ou mise à jour apr l’intermédiaire du protocole SNMP via un identifiant que l’on nomme OID.

Pour plus d’informations sur ce protocole je vous renvoie sur la page wiki en anglais qui donne plus d’informations que la versions française : Voir.

2. Activer le protocole SNMP sur les imprimantes

Normalement toutes imprimantes récentes sont compatibles avec ce protocole, mais celui-ci n’est pas forcément activer par défaut, il convient donc de le faire par l’intermédiaire de l’interface de gestion web de l’imprimante.

3. Logiciel de navigation SNMP

Différents logiciels spécialisé existent pour effectuer une navigation de MIBs. Parmi les plus connus on peut citer Nagios, Cacti, etc... Je vous propose un petit logiciel plus simple à utiliser. Il s’agit de MIB Browser édité par la société iReasoning Network et il existe en plusieurs versions dont une gratuite pour un usage personnel qui est la Free Personal Edition. Cette version est téléchargeable à l’adresse suivante : Voir.

Lorsque l’application est démarrée il suffit de renseigner l’adresse ip dans le champ texte suivant :

image montrant la zone de texte permettant de taper l'adresse IP de l'imprimante

Une fois ceci effectué il devient possible de faire afficher les différentes OIDs...

En sélectionnant l’opération « Walk», vous aurez à votre disposition la totalité des OIDs disponibles pour ce périphérique, Voici un aperçu :

image montrant un aperçu des OIDs

Les autres opérations possibles sont :

  • « Get Next » permet de retourner la valeur OID du prochain objet dans l’arbre...
  • « Get » permet de déterminer la valeur d’un objet en donnant en paramètre la valeur de l’OID. Bien entendu l’OID doit exister pour que cette commande aboutisse.
  • « Get Bulk » permet de récupérer une liste de valeurs à a partir d’une liste d’OIDs. C’est une version améliorée de la commande « Get » idéale pour de très grandes MIBs.
  • « Set » permet de modifier la valeur d’une des variable de la MIB.

III Mise en oeuvre de SNMP sous Delphi

Nous allons maintenant passer aux choses sérieuses en montrant comment accéder aux fonctions de la bibliothèque de fonctions oleprn.dll.

1. Création du projet

Pour ce tutoriel nous allons créer un projet de type de VCL, mais vous pourrez utiliser ceci pour les différents autres types de projet. Agencez votre fiche comme ceci :

Stacks Image 360

Maintenant nous allons importer la bibliothèque de types.

2. Importation de la bibliothèque de types

Pour pouvoir utiliser les objets inclus dans la bibliothèque de types il faut d'abord importer la dll "oleprn 1.0 Type Library".

Pour ce faire il suffit d'utilisr l'importateur de composant inclus dans Delphi. Voici la démarche. Dans un premier temps il faut sélectionner la commande de menu "Importer un composant" dans le menu "Composant", comme ceci :

Stacks Image 364

Une fenêtre s'affiche alors à l'écran vous permettant de sélectionner le type de composant souhaité. Il faut alos sélectionner "Importer une Bibliothèque de types" et cliquer sur le bouton "Suivant".

Stacks Image 368

Vous allez devoir maintenant rechercher dans la liste la dll voulue et la sélectionner et ensuite cliquer de nouveau sur le bouton "Suivant".

Stacks Image 372

Cliquer une autre fois sur le bouton "Suivant" en ne changeant aucune option dans la fenêtre qui suit.

Enfin il suffit de sélectionner l'option "création d'une unité" pour l'ajouter à votre projet et de cliquer sur le bouton "Terminer".

Stacks Image 376

Pour terminer, il suffit d'ajouter une référence à l'unité créée dans toutes les autres unités où vous aurez besoin de cette bibliothèque. Pour ce faire il faut utiliser cette ligne de code dans la section uses de votre unité :

uses ..., OLEPRNLib_TLB,...

3. Utliisation de l'objet Isnmp

Maintenant nous allons découvrir ensemble un objet très intéressant inclus dans cette bibliothèque de types et qui est Isnmp. C'est un peut l'objet de base qui va vous permettre de créer des requètes snmp.

Nous allons voir un petit exemple qui va vous permettre de récupérer le niveau de toner restant pour une imprimante donnée.

Tout d'abord il faut créer une instance de cette objet. Tout d'abord déclarons notre objet :

snmp_client : Isnmp;

Ensuite nous devons créer l'instance de l'objet celà se fait par l'intermédiaire de la fonction Create de l'objet CoSNMP :

snmp_client := CoSNMP.Create;

Une fois l'objet créé nous devons ouvrir une connexion avec la fonction Open qui prend en argument l'adresse Ip de l'imprimante, la CommunityString qui permet d’assurer un niveau de sécurité étendu, puis ensuite nous avons le nombre d’essais de connexion voulu dans notre cas, on essayera de se connecter une seule fois, et le nombre de milisecondes demandées pour la tentative de connexion.

snmp_client.Open(sIpAddress, 'public', 1, 2000);

Dans notre cas, et c’est le cas par défaut notre CommunityString est fixée à « public ». En effet dans ce petit projet nous nous connectons que pour obtenir des informations. Si vous voulez aller plus loin il est nécessaire de mettre en place un niveau de sécurité avancé en définissant un accès SNMP v2 ou v3... Une fois que la communication avec l’imprimante est établie (si elle l’est pas on renvoie la chaîne de caractère « informations non disponible » que l’on gère par l’intermédiaire d’un bloc try...catch... pour éviter tout plantage) nous devons donc récupérer les valeurs définies précédemment.

Pour récupérer les niveaux de toners on va utiliser la fonction Get qui va nous retourner les valeurs voulues. En fait il nous faut la valeur du niveau maximal du toner et la valeur du toner actuel.

Normaement les constructeurs utilisent des OIDs normalisés mais dans la pratique ce n'est pas toujours le cas. Cependant dans la plupart des cas les OIDs permettant de récupérer ces valeurs sont les suivants :

  • pour le toner noir .1.3.6.1.2.1.43.11.1.1.9.1.1 pour récupérer le niveau actuel et .1.3.6.1.2.1.43.11.1.1.8.1.1 pour récupérer le niveau maximal ;
  • pour le toner jaune .1.3.6.1.2.1.43.11.1.1.9.1.2 pour récupérer le niveau actuel et .1.3.6.1.2.1.43.11.1.1.8.1.2 pour récupérer le niveau maximal;
  • pour le toner cyan .1.3.6.1.2.1.43.11.1.1.9.1.3 pour récupérer le niveau actuel et .1.3.6.1.2.1.43.11.1.1.8.1.3 pour récupérer le niveau maximal ;
  • pour le toner magenta .1.3.6.1.2.1.43.11.1.1.9.1.4 pour récupérer le niveau actuel et .1.3.6.1.2.1.43.11.1.1.9.1.4 pour récupérer le niveau maximal.

Attention ces valeurs devraient être standard mais ne le sont pas en pratique, c’est pour cette raison que j’ai effectué une conversion pour les imprimante Dell de la série 3010cn, cela devient donc :

  • pour le toner cyan .1.3.6.1.2.1.43.11.1.1.9.1.1 donc même traitement pour récupérer le niveau maximal;
  • pour le toner magenta.1.3.6.1.2.1.43.11.1.1.9.1.2 donc même traitement pour récupérer le niveau maximal;
  • pour le toner jaune.1.3.6.1.2.1.43.11.1.1.9.1.3 donc même traitement pour récupérer le niveau maximal;
  • pour le toner noir .1.3.6.1.2.1.43.11.1.1.9.1.4 donc même traitement pour récupérer le niveau maximal.

Donc reportez-vous à la notice du fabricant pour récupérer les bons OIDs... Ou vous pouvez utiliser l'application MIB Browser pour retrouver les valeurs correspondantes à votre imprimante.

Voyons maintenant la procédure permettant de récupérer l'ensemble des niveaux de toners restants :

procedure GetTonersLevels;
var i : integer;

begin
snmp_client := CoSNMP.Create;
snmp_client.Open(sIpAddress, 'public', 1, 2000);
try
For i:= 1 to 4 do
begin
currentlevel := snmp_client.Get('.1.3.6.1.2.1.43.11.1.1.9.0.' + intToStr(i));
maxlevel := snmp_client.Get('.1.3.6.1.2.1.43.11.1.1.8.0.' + intToStr(i));
remaininglevel := (currentlevel * 100) div maxlevel;
if (i = 1) then
  Form1.Label1.Caption := Label1.Caption + ' ' + intToStr(remaininglevel) + '%';
if (i = 2) then
  Form1.Label2.Caption := Label2.Caption + ' ' + intToStr(remaininglevel) + '%';
if (i = 3) then
  Form1.Label3.Caption := Label3.Caption + ' ' + intToStr(remaininglevel) + '%';
if (i = 4) then
  Form1.Label4.Caption := Label4.Caption + ' ' + intToStr(remaininglevel) + '%';
end;
finally
  Application.MessageBox('Impossibilité d''obtenir les informations demandées', 'Erreur');

end;

end;

4. Utilisation de l'objet Coasphelp

Une autre interface très importante incluse dans cette bibliothèque de types est Iasphelp. Nous y aurons accès par l'intermédiaire de la classe associée Coasphelp. Celle-ci permet de créer une page Web Asp afin d'obtenir certaines informations sur une imprimante donnée.

Cette interface est disponible pour les versions de Windows allant de 2000 à celles plus récentes. Celle-ci est tout à fait utilisable pour des applications de bureau. Elle est très utile pour obtenir des informations à intervalles réguliers comme le nombre de travaux en cours ou son état à un moment donné. C'est pour cela que j'ai placé un objet Timer sur ma fiche. Pas besoin de le rafraichir trop souvent surtout si vous avez plusieurs imprimante dans votre parc informatique.

Pour utiliser les méthodes de cette interface il va fallor créer une instance d'objet CoAsphelp. Tout d'abord créons une variable de type iAspHelp :

var asphelp : iAsphelp;
Nous pouvons alors créer l'instance :
asphelp := CoAspHelp.Create; 

Comme vous pouvez le voir le constructeur ne prend aucun paramètre. Il est par exemple possible de récupérer l'adresse ip d'une imprimante. Pour ce faire, comme pour l'utilisation de l'interface iSnmp, nous devons ouvrir une connexion avec l'imprimante mais cette fois-ci la fonction Open prend en paramètre le nom de l'imprimante tel qu'il apparaît dans la fenêtre "Périphériques et imprimantes" de Windows.

asphelp.Open(printerName);

Vous me direz mais comment peut-on récupérer la liste des imprimantes connectées au réseau. Nous le verrons dans un prochain article qui traitera de WMI. Pour le moment attribuez lui son nom en dur sous forme de chaîne de caractères.

Pour obtenir l'adresse ip de l'imprimante il faut utiliser la propriété "Portname", comme ceci :

ipAdddress := aspHelp.portname;

une fois que vous avez récupéré toutes les informations nécessaires il faut fermer la connexion.

asphelp.Close;

C'est tout simple il suffit de sélectionner la propriété voulue, pour récupérer la valeur voulue... Par exemple pour récupérer l'ordinateur connecté à l'imprimante il suffit d'utiliser la propriété "Computername". Pour récupérer la résolution maximale il suffit d'utiliser la propriété "MaximumResolution".

Pour récupérer le nombre de travaux en attente il faut utiliser la propriété "PendingJobCount". Mais attention avant de pouvoir l'utiliser il faut appeler la procédure CalcJobETA.

asphelp.CalcJobETA;
propName := IntToStr(asphelp.PendingJobCount);
lblTotaljobs.Caption := 'Nombre de travaux en attente : ' + propName;

Si vous activez le timer avec cette propriété vous pourrez voir la valeur augmenter et diminuer au fur et à mesure que les travaux d'impression sont exécuutés.

IV CONCLUSION

Dans ce tutoriel, vous avez pu entrevoir comment utiliser la bibliothèque de types oleprn.dll qui permet d'obtenir des informations par l'intermédaire des objets fournis par celle-ci. Vous pouvez utiliser le protocole SNMP par l'intermédiaire de la classe CoSNMP (interface iSNMP), ou utiliser des propriétés prédéfinies par l'intermédiaire de l'objet CoAspHelp (interface iAspHelp). Vous verrez dans un prochain tutoriel comment utiliser WMI sous Delphi pour vous permettre d'obtenir des informations complémentaires comme obtenir la liste des imprimantes installées sur un ordinateur. A noter que la version Starter de Delphi est suffisante pour pouvoir utiliser ces technologies.