Moin,
Seit dem 5.5 Update vom 08.11. funktioniert mein Abus Secvest Script nicht mehr.
Das Skript setzt eine sehr einfachen Mechanismus zum empfangen von Contact-ID (Notrufmessages) um. Im wesentlichen nimmt es das Datagramm entgegen und schreibt es in eine Variable. Dazu muss eine ACK message berechnet werden (mit CRC16 Prüfsumme).
Details zu meinen Skripten gibt’s übrigens hier: https://www.symcon.de/forum/threads/33746-ABUS-Secvest-2015-%28FUAA50000%29-an-IP-Symcon?highlight=secvest
Komischerweise hat es mit älteren Version der 5.5 noch funktioniert, aber seit gestern läuft es plötzlich nicht mehr richtig.
Hilfe! Irgendjemand eine Idee?
Möglicherweise eine PHP Inkompatibilität in der CRC Berechnung?
Ich bin zur Zeit Ratlos. Ich auch schon eine Weile her, dass ich das geschrieben habe.
<?
// Receiver for Contact-ID Messages
//
if ($_IPS['SENDER'] != "RegisterVariable")
return false;
$ip = "192.168.178.12"; // IP-Adresse der Alarmanlage
$port = 9999; // Port der Alarmanlage für die Antworten
$data ="";
// $data = RegVar_GetBuffer($_IPS['INSTANCE']);
$data .= $_IPS['VALUE'];
// Ein einfacher Check. Die Strings haben immer die gleiche Länge (53)
if(strlen($data) > 53)
return false;
// Laenge und CRC der empgangenen Nachricht pruefen
$INcrc = substr($data, 1, 4); echo $INcrc.' ';
$INlen = substr($data, 5, 4); echo $INlen;
$INmessage = substr($data, 18, -22); // -1 is for the invisible <CR>
$CHECKlen = dechex(strlen($INmessage));
$CHECKlen = str_pad($INlen, 4, '0', STR_PAD_LEFT);
$CHECKcrc = strtoupper(crc16($INmessage));
$CHECKcrc = str_pad($INcrc, 4, '0', STR_PAD_LEFT);
if ($INlen == $CHECKlen AND $INcrc == $CHECKcrc)
$response = '"ACK"';
else
$response = '"NAK"';
// Relevanten Teil ausschneiden, der Rest wird ignoriert
// Dieser Wert wird bei korrekt empfangener Nachricht in die Symcon raw Variable geschrieben
$cut = substr ($data, 40, 11);
if ($response =='"ACK"')
SetValueString(27901, $cut);
// Zusammenbau der Antwort-Message mit Laengen+CRC Berechnung
$message = substr($data, 18, -22);
$messageACK = $response.$message.'[]';
if ($response == '"NAK"')
$messageACK = substr_replace($messageACK, '0000', 5, 4); // Die NAK Massage muss mit Sequence Number 0000 gesendet werden
$crc = strtoupper(crc16($messageACK));
$crc = str_pad($crc, 4, '0', STR_PAD_LEFT);
$len = dechex(strlen($messageACK));
$len = str_pad($len, 4, '0', STR_PAD_LEFT);
$output = "
".$crc.$len.$messageACK."\r";
RegVar_SendPacket(42884, $output, $ip, $port); // scheint immer 9999 zu sein, egal was man einstellt!
// -------------------------------------------------------------
// CRC-16_ARC with the following parameter:
// Poly = 0x8005; Init = 0x0000; Xor = 0x0000
// Refin = True; Refout = True; Output in Hex
function crc16($data) {
$crc = 0x0000; // Init
$len = strlen($data);
$i = 0;
while ($len--) {
$crc ^= reversebyte(ord($data[$i++])) << 8;
$crc &= 0xffff;
for ($j = 0; $j < 8; $j++){
$crc = ($crc & 0x8000) ? ($crc << 1) ^ 0x8005 : $crc << 1;
$crc &= 0xffff;
}
}
// $crc ^= 0x0000; // Final XOR
$crc = reversebits($crc);
$crc = dechex($crc);
return $crc;
}
function reversebyte($byte) {
$ob = 0;
$b = (1 << 7);
for ($i = 0; $i <= 7; $i++) {
if (($byte & $b) !== 0) {
$ob |= (1 << $i);
}
$b >>= 1;
}
return $ob;
}
function reversebits($cc) {
$ob = 0;
$b = (1 << 15);
for ($i = 0; $i <= 15; $i++) {
if (($cc & $b) !== 0) {
$ob |= (1 << $i);
}
$b >>= 1;
}
return $ob;
}
// -------------------------------------------------------------
?>