WLAN Clients einer Time Capsule Abfragen

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 :wink:


<?
//######## 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 :wink: