Ich versuche, die Digital Inputs eines Denkovi DAEnetIP4 auszulesen. Das Gerät sended SNMP traps, die OIDs sind: „.1.3.6.1.4.1.42505.1.2.1.1.7.x“, wobei x ist 0 bis 7.
Ich kann die Werte (0 oder 1) problemlos mit snmpget auslesen. Nun habe ich ein UDP-Socket und eine Registervariable in IPS eingerichtet. Letztere scheint die Zeichen vom Trap zu empfangen. Aber ich weiss nicht, wie ich aus diesen Zeichen die Werte der Inputs distillieren soll. Kann mir jemand helfen?
Kann ich das 1:1 auf die SNMP-Traps von Denkovi übertragen? Oder muss ich etwas anpassen? Hier ist ein Beispiel für die Denkovi-Traps (aus der UDP-Socket):
Denkovi ist eine bulgarische Firma und verkauft IP-Relais mit digitalen und analogen Inputs. Diese Geräte sind in meiner Erfahrung viel stabiler und zuverlässiger als die „Pokeys“. Sie bieten allerdings keine integrierte Programmierung, weswegen die Logik über IPS erfolgen muss.
Ich denke dass ich den Herrn Denkov bitten muss, zusätzliche Erklärungen zu liefern. Oder lässt sich die Struktur ohne weiteres entziffern anhand der MIB-File? Ich habe auch StackOverflow abgesucht nach PHP-Snippets um ein SNMP Trap zu parsen, wurde aber nicht fündig.
Ich habe einige Perl-Scripts gefunden, die SNMP Traps decoden können, aber nichts in PHP. Perl kann man aber nicht ohne weiteres in IPS einbinden, oder?
danke, ich habe nichts gegen JSON, er und ich sind gute Freunde! Aber wie soll das gehen? Der Grund für die Traps ist dass sie als UDP direkt von Denkovi verschickt werden. Das reduziert den Overhead massiv, weil es nur einen Listener braucht. Alle Alternativen müssten m.E. ein aktives Polling betreiben, am besten 2x pro Sekunde. Oder sehe ich das falsch?
Ich habe es gelöst. Dieser kleine Script wird der RegVar zugeordnet, welche die SNMP Traps vom Denkovi empfängt. Geliefert wird ein assoziativer Array mit 2 keys: Id (kann von 0 bis 7 gehen) und State (0 und 1, on oder off). Die Schaltvorgänge der digitalen inputs werden geloggt.
<?
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable") {
// bereits im Puffer der Instanz vorhandene Daten in $data kopieren
//$data = RegVar_GetBuffer($_IPS['INSTANCE']);
// neu empfangene Daten an $data anhängen
$data .= $_IPS['VALUE'];
// wenn das Trennzeichen ; in $data gefunden worden ist
if (strpos($data, ';')) {
// $data in durch ; separierte Datensätze zerlegen
$datasets = explode(';', $data);
// alle nicht durch ; terminierten Datensätze ausgeben
for ($i = 0; $i < count($datasets) - 1; $i++) {
echo "empfangener Datensatz: ".$datasets[$i]."
";
}
// $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
$data = $datasets[count($datasets) - 1];
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}
$dataString = bin2Hex($data);
$lenDs = strlen($dataString);
$digitalInput = array(
"state" => substr($dataString, $lenDs-1,1),
"id" => substr($dataString, $lenDs-7, 1)
);
//add data to file
file_put_contents('C:\Users\aag\Desktop\denkovi_logfile.txt', date("Y-m-d H:i:s") .
" id: " . $digitalInput["id"] .
" state: ". $digitalInput["state"] . " " .
bin2Hex($data) . PHP_EOL, FILE_APPEND);
function String2Hex($string){
$hex='';
for ($i=0; $i < strlen($string); $i++){
$hex .= dechex(ord($string[$i]));
}
return $hex;
}
?>
Ich habe es gelöst. Dieses kleine Skript wird der RegVar zugeordnet, welche die SNMP Traps vom Denkovi empfängt. (Die RegVar muss wiederum auf eine UDP socket zuhören, port 162, IP-Addresse des Denkovi). Keine Cutter-Instanz nötig. Geliefert wird ein assoziativer Array mit 2 keys: Id (kann von 0 bis 7 gehen) und State (0 und 1, on oder off). Die Schaltvorgänge der digitalen inputs werden geloggt.
<?
// wenn das Skript von einer RegisterVariable-Instanz aus aufgerufen worden ist
if ($_IPS['SENDER'] == "RegisterVariable") {
// bereits im Puffer der Instanz vorhandene Daten in $data kopieren
//$data = RegVar_GetBuffer($_IPS['INSTANCE']);
// neu empfangene Daten an $data anhängen
$data .= $_IPS['VALUE'];
// wenn das Trennzeichen ; in $data gefunden worden ist
if (strpos($data, ';')) {
// $data in durch ; separierte Datensätze zerlegen
$datasets = explode(';', $data);
// alle nicht durch ; terminierten Datensätze ausgeben
for ($i = 0; $i < count($datasets) - 1; $i++) {
echo "empfangener Datensatz: ".$datasets[$i]."
";
}
// $data auf den Inhalt des letzten (unvollständigen) Datensatzes setzen
$data = $datasets[count($datasets) - 1];
}
// Inhalt von $data im Puffer der RegisterVariable-Instanz speichern
RegVar_SetBuffer($_IPS['INSTANCE'], $data);
}
$dataString = bin2Hex($data);
$lenDs = strlen($dataString);
$digitalInput = array(
"state" => substr($dataString, $lenDs-1,1),
"id" => substr($dataString, $lenDs-7, 1)
);
//add data to file
file_put_contents('C:\Users\aag\Desktop\denkovi_logfile.txt', date("Y-m-d H:i:s") .
" id: " . $digitalInput["id"] .
" state: ". $digitalInput["state"] . " " .
bin2Hex($data) . PHP_EOL, FILE_APPEND);
function String2Hex($string){
$hex='';
for ($i=0; $i < strlen($string); $i++){
$hex .= dechex(ord($string[$i]));
}
return $hex;
}
?>