Hi Leute,
ich habe hier eine Time Capsule rumstehen, die ich auch als WLAN AP nutze. Soweit so gut.
Das Ding spricht SNMP - also kann man es auch in IPS einbinden und z.B. die derzeit angemeldeten WLAN Clients abfragen.
Herausgekommen ist ein erster Script Entwurf (noch relativ unsauber) … funktioniert aber auf den ersten Blick problemlos
<?
//######## CONFIG ##############################################################
$host = "1.2.3.4";
$community = "public";
$varname = "WLAN Clients";
$debug = false;
//######## Ab hier nichts mehr ändern ##########################################
//---- Funktionen --------------------------------------------------------------
function ascii_to_dec($str)
{
for ($i = 0, $j = strlen($str); $i < $j; $i++) {
$dec_array[] = ord($str{$i});
}
return $dec_array;
}
function mac_to_dec($oid, $mac)
{
$count = 2;
for ($i = 0; $i < strlen($mac); $i++) {
$oid .= ".";
$dec = ( ascii_to_dec($mac[$i]));
$oid .= $dec[0];
}
return $oid;
}
//---- Variable anlegen, falls es sie noch nicht gibt --------------------------
if ($debug) echo "------------------------------------------------------
";
// Wo sind wir?
$parentID = IPS_GetObject($IPS_SELF);
$parentID = $parentID['ParentID'];
if ($debug) echo " Parent ID = $parentID
";
// Eine Var für den HTML Output
$var = @IPS_GetVariableIDByName($varname, $parentID);
if ($var === false) //Wenn es die Variable nicht gibt, wird sie angelegt ...
{
$varID = IPS_CreateVariable(3);
IPS_SetName($varID, $varname);
IPS_SetParent($varID, $parentID);
IPS_SetVariableCustomProfile($varID, "~HTMLBox");
if ($debug) { echo "Variable $varID ($varname) wurde angelegt.
"; }
}
else { $varID = $var; }
if ($debug) echo " Ausgabe Var ID = $varID
";
$var = false; //Sicher is sicher ...
// Und noch eine VAR für die Anzahl der derzeit aktiven WLAN Clients
$clientsvar = @IPS_GetVariableIDByName("aktive WLAN Clients", $parentID);
if ($clientsvar === false) //Wenn es die Variable nicht gibt, wird sie angelegt ...
{
$clientsvarID = IPS_CreateVariable(1);
IPS_SetName($clientsvarID, "aktive WLAN Clients");
IPS_SetParent($clientsvarID, $parentID);
if ($debug) { echo "Variable $clientsvarID (aktive WLAN Clients) wurde angelegt.
"; }
}
else { $clientsvarID = $clientsvar; }
if ($debug) echo " Anzahl WLAN Clients Var ID = $clientsvarID
";
$var = false; //Sicher is sicher ...
//------------------------------------------------------------------------------
// 1. Wie viele Clients sind aktiv?
$data = snmpget($host,$community,".1.3.6.1.4.1.63.501.3.2.1.0");
$read_count = (int)$data;
SetValueInteger($clientsvarID, $read_count);
if ($debug) echo "
Anzahl der gefundenen WLAN Clients = $read_count
";
if ($debug) echo "------------------------------------------------------
";
// 2. MACs der Clients auslesen
$oid_mac = ".1.3.6.1.4.1.63.501.3.2.2.1.1.17";
$oid_type = ".1.3.6.1.4.1.63.501.3.2.2.1.2.17";
$oid_strength = ".1.3.6.1.4.1.63.501.3.2.2.1.6.17";
$oid_noise = ".1.3.6.1.4.1.63.501.3.2.2.1.7.17";
$oid_rate = ".1.3.6.1.4.1.63.501.3.2.2.1.8.17";
$values = array();
$mac = "";
$type = "null";
for($count = 1; $count <= $read_count; $count++)
{
// MAC holen (getnext wegen leerem startwert beim 1. Durchlauf)
$oid = mac_to_dec($oid_mac, $mac);
$data = snmpgetnext($host,$community,$oid);
$data = str_replace("\"", "", $data);
$mac = $data; //Nun ist die MAC bekannt und wird ab hier verwendet (snmpget)
$values[$count]['MAC'] = $data;
// Type holen
$oid = mac_to_dec($oid_type, $mac);
$data = snmpget($host,$community,$oid);
$data = str_replace("\"", "", $data);
if ($data == 1) $data = "Station";
elseif ($data == 2) $data = "WDS Station";
else $data = "unknown";
$values[$count]['Type'] = $data;
// Strength holen
$oid = mac_to_dec($oid_strength, $mac);
$data = snmpget($host,$community,$oid);
$data = str_replace("\"", "", $data);
if ($data == -1) $data = "not supported";
else $data .= "dBm";
$values[$count]['Strength'] = $data;
// Noise holen
$oid = mac_to_dec($oid_noise, $mac);
$data = snmpget($host,$community,$oid);
$data = str_replace("\"", "", $data);
if ($data == -1) $data = "not supported";
else $data .= "dBm";
$values[$count]['Noise'] = $data;
// Rate holen
$oid = mac_to_dec($oid_rate, $mac);
$data = snmpget($host,$community,$oid);
$data = str_replace("\"", "", $data);
if ($data == -1) $data = "not supported";
else $data .= "Mbps";
$values[$count]['Rate'] = $data;
}
// --- AUSGABE -----------------------------------------------------------------
$str = "<table width='90%' align='center'>";
$str .= "<tr>";
$str .= "<td align='center' width='80'><b>Client #</b></td>";
$str .= "<td align='center' width='150'><b>MAC</b></td>";
$str .= "<td align='center' width='100'><b>Type</b></td>";
$str .= "<td align='center' width='100'><b>Signalstärke</b></td>";
$str .= "<td align='center' width='100'><b>Noise</b></td>";
$str .= "<td align='center' width='100'><b>Datenrate</b></td>";
$str .= "<td></td>";
$str .= "</tr>";
for($count = 1; $count <= $read_count; $count++)
{
$str .= "<tr>";
$str .= '<td align="center">'.$count.'</td>';
$str .= '<td align="center">'.$values[$count]['MAC'].'</td>';
$str .= '<td align="center">'.$values[$count]['Type'].'</td>';
$str .= '<td align="center">'.$values[$count]['Strength'].'</td>';
$str .= '<td align="center">'.$values[$count]['Noise'].'</td>';
$str .= '<td align="center">'.$values[$count]['Rate'].'</td>';
$str .= '<td></td>';
$str .= "</tr>";
if ($debug)
{
echo " ID: $count
";
echo " MAC: ".$values[$count]['MAC']."
";
echo " Typ: ".$values[$count]['Type']."
";
echo " Signalstärke: ".$values[$count]['Strength']."
";
echo " Noise: ".$values[$count]['Noise']."
";
echo " Durchsatz: ".$values[$count]['Rate']."
";
echo "------------------------------------------------------
";
}
}
$str .= "</table>";
SetValue($varID, $str);
?>
Ich werde das Script nochmal etwas „säubern“ und noch ausgiebig testen. Aber vielleicht gibt es ja hier ein paar Beta-Tester die Lust haben mit „drüber zu schauen“?
Ein Beispiel wie die Ausgabe derzeit aussieht gibts natürlich auch …
Kommentare sind willkommen … solange es produktive sind