Denkovi digital Inputs aus SNMP trap auslesen

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?

Sprach der Chemiker[emoji2]

Such mal nach S0+ plus Zähler auslesen/werten.
Da hatte ich mal eine Auswertung zu geschrieben.

Gesendet von iPad mit Tapatalk

meinst du diesen Skript? Elektronische Haushaltzähler(EHZ) auslesen.

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


TXT: 14.08.2018 15:31:24.00 | RECEIVED [10.10.11.102:65534] | 0><STX><SOH><NUL><EOT><ETX>ips¤4<ACK><HT>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH>@<EOT><LF><LF><VT>f<STX><SOH><ACK><STX><SOH><SOH>C<EOT><NUL><SOH>'c0<NAK>0<DC3><ACK><SO>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH><STX><SOH><SOH><BEL><SOH><STX><SOH><NUL>
HEX: 14.08.2018 15:31:24.00 | RECEIVED [10.10.11.102:65534] | 30 3E 02 01 00 04 03 69 70 73 A4 34 06 09 2B 06 01 04 01 82 CC 09 01 40 04 0A 0A 0B 66 02 01 06 02 01 01 43 04 00 01 27 63 30 15 30 13 06 0E 2B 06 01 04 01 82 CC 09 01 02 01 01 07 01 02 01 00 
TXT: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 0><STX><SOH><NUL><EOT><ETX>ips¤4<ACK><HT>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH>@<EOT><LF><LF><VT>f<STX><SOH><ACK><STX><SOH><SOH>C<EOT><NUL><SOH>'t0<NAK>0<DC3><ACK><SO>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH><STX><SOH><SOH><BEL><SOH><STX><SOH><SOH>
HEX: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 30 3E 02 01 00 04 03 69 70 73 A4 34 06 09 2B 06 01 04 01 82 CC 09 01 40 04 0A 0A 0B 66 02 01 06 02 01 01 43 04 00 01 27 74 30 15 30 13 06 0E 2B 06 01 04 01 82 CC 09 01 02 01 01 07 01 02 01 01 
TXT: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 0><STX><SOH><NUL><EOT><ETX>ips¤4<ACK><HT>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH>@<EOT><LF><LF><VT>f<STX><SOH><ACK><STX><SOH><SOH>C<EOT><NUL><SOH>'?0<NAK>0<DC3><ACK><SO>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH><STX><SOH><SOH><BEL><SOH><STX><SOH><NUL>
HEX: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 30 3E 02 01 00 04 03 69 70 73 A4 34 06 09 2B 06 01 04 01 82 CC 09 01 40 04 0A 0A 0B 66 02 01 06 02 01 01 43 04 00 01 27 83 30 15 30 13 06 0E 2B 06 01 04 01 82 CC 09 01 02 01 01 07 01 02 01 00 
TXT: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 0><STX><SOH><NUL><EOT><ETX>ips¤4<ACK><HT>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH>@<EOT><LF><LF><VT>f<STX><SOH><ACK><STX><SOH><SOH>C<EOT><NUL><SOH>'¡0<NAK>0<DC3><ACK><SO>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH><STX><SOH><SOH><BEL><SOH><STX><SOH><SOH>
HEX: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 30 3E 02 01 00 04 03 69 70 73 A4 34 06 09 2B 06 01 04 01 82 CC 09 01 40 04 0A 0A 0B 66 02 01 06 02 01 01 43 04 00 01 27 A1 30 15 30 13 06 0E 2B 06 01 04 01 82 CC 09 01 02 01 01 07 01 02 01 01 
TXT: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 0><STX><SOH><NUL><EOT><ETX>ips¤4<ACK><HT>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH>@<EOT><LF><LF><VT>f<STX><SOH><ACK><STX><SOH><SOH>C<EOT><NUL><SOH>'¤0<NAK>0<DC3><ACK><SO>+<ACK><SOH><EOT><SOH>?Ì<HT><SOH><STX><SOH><SOH><BEL><SOH><STX><SOH><NUL>
HEX: 14.08.2018 15:31:25.00 | RECEIVED [10.10.11.102:65534] | 30 3E 02 01 00 04 03 69 70 73 A4 34 06 09 2B 06 01 04 01 82 CC 09 01 40 04 0A 0A 0B 66 02 01 06 02 01 01 43 04 00 01 27 A4 30 15 30 13 06 0E 2B 06 01 04 01 82 CC 09 01 02 01 01 07 01 02 01 00 

Net wirklich.
Ist die Suche so schwer.:confused:

S0plus Zähler mit Expert Net Control Reader auswerten

Ps: mit deinen Daten kann man auch was anfangen wenn man den Zusammenhang kennt.

Ein Protokoll ist hier immer von Vorteil. Glaskugel in Rep.

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.

Die Doku zu den Boards ist hier.

Weiteres über die Struktur der UDP-Pakete, welche die SNMP-Traps erhalten, ist nicht vorhanden. Die dazugehörige MIB-file ist hier.

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?

Tipp, auch wenn Du’s ablehnen wirst, versuch’s mal mit JSON
Gruß Helmut

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;
}
 	
	 
?>