Bonjour à tous,
suite à une demande de mon supérieur, je dois créer un programme qui récupère les informations d'une BS (station de base) via des requêtes SNMP. Je vais vous expliquer un peu plus la situation dans laquelle je dois procéder.
Pour une source (point haut), nous avons des antennes émettrices (antenne Alvarion, des Base Station (BS)) où se connecte des clients (les antennes clientes).
Sur chaque BS est disponible une table d'associations des antennes clientes avec divers informations. Via un explorateur Mib Browser et une requête SNMPTABLE, je peux récupérer ces informations.
L'OID correspondant à ce tableau est : .1.3.6.1.4.1.12394.1.1.11.5.1.2
Pour avoir le fichier qui sera plus lisible, il y la pièce jointe de disponible.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 brzaccVLAdbIndex brzaccVLAdbMacAddress brzaccVLAdbStatus brzaccVLAdbSwVersion brzaccVLAdbSNR brzaccVLAdbMaxModulationLevel brzaccVLAdbTxFramesTotal brzaccVLAdbDroppedFramesTotal brzaccVLAdbTxSuccessModLevel1 brzaccVLAdbTxSuccessModLevel2 brzaccVLAdbTxSuccessModLevel3 brzaccVLAdbTxSuccessModLevel4 brzaccVLAdbTxSuccessModLevel5 brzaccVLAdbTxSuccessModLevel6 brzaccVLAdbTxSuccessModLevel7 brzaccVLAdbTxSuccessModLevel8 brzaccVLAdbTxFailedModLevel1 brzaccVLAdbTxFailedModLevel2 brzaccVLAdbTxFailedModLevel3 brzaccVLAdbTxFailedModLevel4 brzaccVLAdbTxFailedModLevel5 brzaccVLAdbTxFailedModLevel6 brzaccVLAdbTxFailedModLevel7 brzaccVLAdbTxFailedModLevel8 brzaccVLAdbCirTx brzaccVLAdbMirTx brzaccVLAdbCirRx brzaccVLAdbMirRx brzaccVLAdbCirMaxDelay brzaccVLAdbDistance brzaccVLAdbHwRevision brzaccVLAdbCpldVer brzaccVLAdbCountryCode brzaccVLAdbBootVer brzaccVLAdbAtpcOption brzaccVLAdbAdapModOption brzaccVLAdbBurstModeOption brzaccVLAdbConcatenationOption brzaccVLAdbSecurityMode brzaccVLAdbAuthOption brzaccVLAdbDataEncyptOption brzaccVLAdbAge brzaccVLAdbUnitName brzaccVLAdbRSSI brzaccVLAdbIpAddress Index Value 1 00-10-E7-XX-XX-XX associated 5.2.11 30 modLevel-8 281201 0 2 1 1 1 1 1 103042 178152 0 0 0 0 0 0 0 0 512 7168 512 2048 5000 4 hwRevisionE 5 1064 1.0.14 enable enable enable enable wep openSystem disable 8 AAAA -59 192.168.XX.XX 1 2 00-10-E7-XX-XX-XX associated 6.6.2 20 modLevel-5 681241 0 3 1 1 1 143038 538197 0 0 0 0 0 0 0 0 0 0 128 3072 128 2048 5000 3 hwRevisionE 5 1064 6.5.3 enable enable enable enable wep openSystem disable 8 BBBB -69 10.128.XX.XX 2 3 00-10-E7-XX-XX-XX associated 6.6.2 13 modLevel-8 39660 322 15 31 33619 5995 0 0 0 0 0 0 0 319 3 0 0 0 128 6016 128 2048 5000 8 hwRevisionE 5 1064 6.5.3 enable enable enable enable wep openSystem disable 7 CCCC -76 10.128.XX.XX 3
Jusque là, tout va bien. Le programme, étant écrit en PHP (pour des questions de souplesse), a besoin de la fonction snmptable que certains connaissent peut-être). Sauf qu'en PHP, elle n'existe pas "vraiment" d'origine.
Une solution équivalente à cette fonction est disponible sur le site PHP (http://php.net/manual/en/function.snmprealwalk.php). Je l'ai enrichie de quelques lignes afin d'avoir plus de sécurité.
La fonction fait son travail, c'est à dire qu'elle me retourne sans soucis les infos dans un array qui est facilement manipulable ... encore faut-il qu'elle me retourne tout dans le bon ordre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 function oldsnmptable($host, $community, $oid) { #TODO: get original state and restore at bottom snmp_set_oid_numeric_print(TRUE); snmp_set_quick_print(TRUE); snmp_set_enum_print(TRUE); $retval = array(); $raw = @snmpwalkoid($host, $community, $oid); if(!is_array($raw)) return null; #No response if(count($raw) == 0) return $retval; #No data $prefix_length = 0; $largest = 0; foreach($raw as $key => $value) { if($prefix_length == 0) { #Don't just use $oid's length since it may be non-numeric $prefix_elements = count(explode('.',$oid)); $tmp = '.' . strtok($key, '.'); while($prefix_elements > 1) { $tmp .= '.' . strtok('.'); $prefix_elements--; } $tmp .= '.'; $prefix_length = strlen($tmp); } $key = substr($key, $prefix_length); $index = explode('.', $key, 2); isset($retval[$index[1]]) or $retval[$index[1]] = array(); if($largest < $index[0]) $largest = $index[0]; $retval[$index[1]][$index[0]] = $value; } if(count($retval) == 0) return $retval; #No data #Fill in holes and blanks the agent may "give" you foreach($retval as $k => $x) { for($i = 1; $i <= $largest; $i++) if(!isset($retval[$k][$i])) $retval[$k][$i] = ''; asort($retval[$k]); } return $retval; }
Le soucis est que les données se mélangent, c'est à dire que à un instant t, le tableau retourné par MIB Browser et la fonction sera ... différent.
Avec quelques tests, la fonction me redonne des résultats entremêlés, c'est à dire que pour la ligne 1, elle va me retourner l'IP de la ligne 3, le tout aléatoirement. La ligne 3 n'aura pas forcément l'IP de la ligne 1 (c'est là ce que ça se gâte pour le coup).
J'utilise la MIB fournie par le constructeur de l'antenne, c'est à dire "MIB/brzAccVL.mib" (facilement trouvable sur le net).
Par exemple, ici, je teste un point haut :
On détecte 3 BS émettrices, sur chaque, je teste la commande suivante :
J'ai mis à jour le serveur avec les derniers paquets dispo (php5-snmp en tête). J'avoue que je suis un peu à court d'idée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #Récupération du tableau des infos $tableBS = snmptable($oBS->IP(), $oBS->Communaute(), '.1.3.6.1.4.1.12394.1.1.11.5.1.2');
Si vous avez des demandes sur le matos utilisé ou bien une question sur la programmation utilisée ici, n'hésitez pas.
Je vous remercie.








Répondre avec citation
Partager