ABUS Secvest 2015 (FUAA50000) an IP Symcon

Moin, moin!

Ich habe die letzten Tage meine Secvest (FUAA50000) in Betrieb genommen, welche meine in die Jahre gekommene FAZ-3000 ersetzt, für die ELV ja keine Teile mehr liefert.

Eine Anbindung an SYMCON wäre ganz nett. Dazu habe ich mir folgende Gedanken gemacht (mein Symcon läuft übrigens auf Linux).

Gewünscht wäre:
1.) Status der Alarmanlage (unscharf/intern-scharf/scharf) in Symcon (zeitnah!)
2.) Bei Alarmauslösung sofortige Meldung an Symcon mit Alarmgrund (Einbruch, Sabo, Feuer, etc) und ggf. Meldername
3.) Eventuell Bedienung der Anlage über Symcon
4.) Nice to have: Status der Melder bei unscharfer Anlage (=> Nutzung der Melder als Sensoren in Symcon)

Folgende Möglichkeiten der Einbindung bietet die Anlage:
a.) Status als XML/Json Struktur:
Die Abfrage ist hier in einem anderen Thread beschrieben. Ich gehe später vielleicht näher drauf ein.
Vorteile:

  • Liefert info zum Status und wahrscheinlich auch Alarm
  • Einfach in Symcon zu verarbeiten
    Nachteile:
  • Muss gepollt werden (Last & Zeitverzögerung)
  • Da man eingeloggt sein muss, wird das Log der Anlage zugemüllt (und evtl. die Flash-Karte gekillt?)

b.) Anlage sendet Mails:
Man kann das Mailverhalten weitgehend konfigurieren.
Vorteile:

  • Die Anforderungen 1. und 2, werden erfüllt
  • Die Anlage muss nicht gepollt werden
    Nachteile:
  • Symcon muss eine Mailbox pollen (sollte nicht da riesen Problem sein, aber ggf. Zeitverzögerung)
  • Symcon kann zwar IMAP/POP3, man muss aber wohl die ganze Logik zum Auswerten der Mails (checken ob meine Mails, holen nur der neuen Mails, auswerten, usw.) selbst programmieren. Dazu bin ich wahrscheinlich nicht fit genug.

c.) Die Anlage bedient Relais mit Einbindung über zB Z-Wave:
Die Anlage hat 4 programmierbare Ausgänge die praktisch alles mögliche signalisieren können, sowie 2 Draht (Alarm-)Eingänge.
Vorteile:

  • Unmittelbare Meldung am Symcon (falls der Sensor mitspielt…)
    Nachteile:
  • Man braucht pro Ausgang einen Sensoreingang (Hardware Aufwand)
    1. und oder 2. werden nur Teilweise erfüllt (man muss sich entscheiden was man signalisieren möchte)

d.) Simulation der Secvest APP
Die Anlage kann über eine APP bedient werden, welche alle Anforderungen erfüllt.
Vorteile:

  • Alarmmeldung via Push
  • Bedienung der Anlage
  • Sogar Anzeige der offenen Zonen wäre möglich
    Nachteile:
  • Protokoll liegt nicht offen

e.) Lauschen auf Contact-ID over IP Datagramme (fertiges Skript weiter unten)
Vorteile:

  • Detaillierte Alarm- Status- und Störungs-Meldungen via Push (Anforderung 2 voll erfüllt)
    Nachteile:
  • Keine Bedienung der Anlage (Anforderung 3 nicht erfüllt)
  • Keine Unterscheidung inter/extern scharf (daher Anforderung 1 nur teilweise erfüllt)
  • Keine Statusmeldung der Melder bei unscharfer Anlage (Anforderung 4)

Ich würde in diesem Thread gerne Code-Schnipsel sammeln und mögliche Lösungen im Detail diskutieren und hoffe auf rege Beteiligung der anderen Secvest-Besitzer hier.

zu c.)
Ich habe mir den Fibaro Universal-Binary Sensor besorgt, wobei natürlich optimal gewesen wäre, wenn das Teil auch noch über Symcon Schaltbare Ausgänge gehabt hätte, aber man kann nicht alles habe.

Das Teil ist übrigens klein genug (ca. daumengroß), um in die Dose hinter der Anlage zu passen und würde sogar mühelos in der Gehäuse der Anlage passen. Die Stromversorgung kann die Anlage direkt gewährleisten (hat einen 12V AUX Ausgang).

Habe die 2 Relais-Ausgänge (OP301 und OP302) verwendet um „Einbruch“ und „Feuer“ zu signalisieren. Ob Feuer hier wirklich Sinn macht, sein bei einem unverschämten Preis von 110 Euro für einen Rauchmelder mal dahingestellt, aber was soll’s.

Zum Anschluss des Binary Sensors:

  • rot/blau an die AUX Stromversorgung der Anlage (rot: 12V, blau: 0V/GND)
    1. blauer Draht (auch GND) vom Sensor an OP301, Klemme C
  • Brücke von OP301-C nach OP302-C
  • Gelber Draht (IN1) an OP301, Klemme NO
  • Grüner Draht (IN2) an OP302, Klemme NO

Nachdem ich den Binary-Sensor ein zweites Mal angelernt habe, zeigte er auch beide Eingänge (als Untergeräte) an. Es gibt insgesamt 3 Statusvariablen (1x Hauptgerät und je 1x pro Untergerät). Eine der Variablen ist nur True, wenn beide Eingänge True sind (also eine UND Verknüpfung). Das und die Tatsache, dass die andere beim ersten Anlernen nicht angezeigt wurde, hat mich 2 Stunde troubleshooting gekostet.

Über die Testfunktion im Errichtermenue der Anlage kann man nun das Verhalten testen.

Meine Enttäuschung war allerdings grenzenlos, als ich feststellte, dass der Sensor gepollt werden muss. WTF! Wo ist da der Sinn???

Daher meine erste Frage an die Gemeinschaft. Kann der Fibaro Binary-Sensor eine Statusmeldung am Sensor-Eingang auch direkt melden (ohne poll)???

zu c.)

Wenn man die Untergeräte auf „Basic Klasse erzwingen“ stellt, dann funktioniert die spontane Meldung der Relaiszustände.

Jetzt muss ich nur noch ein paar Skripte schreiben.
Bei Feuer sollen die Rollläden aufgehen und das Licht an.
Bein Einbruch sollen die Rollläden zu gehen (ist das sinnvoll?) und eine Mail verschickt werden. Das macht die Anlage zwar auch, aber doppelt gemoppelt hält besser :slight_smile:

Ich denke zur Erfassung und Anzeige der Zustände der Anlage (scharf/unscharf), werde ich mich als nächstes mal mit dem direkten polling a.) befassen.

Gruss,
Stefan

Hallo Stefan,
Rollläden zu bei Alarm würde ich gut überlegen. Sicher willst Du dir Einbrecher nicht „stellen“, sondern vertreiben …

LG Dirk

Habe ich auch drüber nachgedacht, wobei die Schwachstelle bei uns die Terassentüren sein dürften und da fände ich es schon geil, wenn der Rollladen zu fährt, sobald jemand die Tür aufhebelt. Ich mache das bisher auch nur bei den Terrassentüren. Die Fenster fahren nicht zu.

Macht das wirklich Sinn. Da drück ich kurz dagegen und die Motoren schalten entweder durch den Hindernisschutz oder die Schutzschaltung ab.
Innen fahren sie dann manuell hoch.

Gesendet von iPhone mit Tapatalk

Zu a.)

Beispiel:
Aufruf: https://SECVEST-IP:4433/system/partitions/
Passwort muss eingegeben werden daher Eintrag im Log :frowning:

Super Sache eigentlich…

Ausgabe:

[
{
„id“: „1“,
„name“: „HAUS“,
„state“: „unset“,
„zones“ : [
„201“,
„301“,
]
},
{
„id“: „2“,
„name“: „Teilber. 2“,
„state“: „unset“,
„zones“ : [
]
},
{
„id“: „3“,
„name“: „Teilber. 3“,
„state“: „unset“,
„zones“ : [
]
},
{
„id“: „4“,
„name“: „Teilber. 4“,
„state“: „unset“,
„zones“ : [
]
}
]

zu b.) Anlage sendet Mails:

Habe ich diese Woche versucht einzubauen. Leider scheint das Symcon POP3 Modul einen Bug zu haben. Es kann die Mails die die AA sendet wohl nicht wichtig verarbeiten. Bin noch nicht sicher woran das liegt.

So, hier mal was ich bis jetzt habe:

Hier gibt es eine brauchbare Beschreibung zum Protokoll und Aufbau der ACK Message:
https://www.securityindustry.org/SiteAssets/Standards/Intrusion%20Subcommittee/DC-09%20Preparing%20for%20ANSI%20Public%20Review.pdf

  1. Im Symcon einen Server-Socket aufsetzten und auf den Port auf den die Secvest Konfiguriert ist einstellen
  2. RegisterVariable auf den Server-IO verweisen und als Action-Script:
<?

if ($_IPS['SENDER'] != "RegisterVariable")
return false;

$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;

// Relevanten Teil ausschneiden, alles andere wird ignoriert
// Eine Prüfung des Protokols und des Absenders findet nicht statt
$cut = substr ($data, 40, 11);
SetValueString(27901 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Receiver\CID_raw]*/, $cut);

$message = substr($data, 18, -22);  // -1 is for the invisible <CR>
$messageACK = '"ACK"'.$message.'[]';
$crc = strtoupper(crc16($messageACK));
$len = "00".dechex(strlen($messageACK));

$output = "
".$crc.$len.$messageACK."\r";

// Ack senden (enpfangenen Datensatz echoen):
RegVar_SendPacket(42884 /*[EigeneProgramme\Alarmanlage\Secvest_ContactID_Buffer]*/, $output, "192.168.1.23", 1792);

// -------------------------------------------------------------
// 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;
    }
// -------------------------------------------------------------
?>
  1. Das Decoder-Script auf die Symcon-Variable mit der Message triggern:
<?

/* ---------------------------------------------------------
 Ademco Contact-ID Message Composition:
 The form of the message is: ACCT MT QXYZ GG CCC S
 ACCT = 4 Digit Account Number
 MT   = Message Type (18 = Contat ID) also possible 98
 Q    = Evant Qualifier
 XYZ  = Event Code
 GG   = Group/Partition Number (Teilbereich)
 CCC  = Zone Number or User Number!
  
	(C) 2017, Stefan Frank, Version V0.02 (18-04-2017) 
-------------------------------------------------------------- */

$CIDcodes = array(
100 => array('Medizinischer Alarm', 'Medizin. Alarm'),
101 => array('Pflege-Notfall', 'Medizin. Alarm'),
110 => array('Feueralarm', 'Feuer'),
120 => array('Ueberfall (Panik) Zone, Still, Tastatur, Funk-Bedienteil', 'Ueberfallalarm'),
121 => array('Bedrohungscode Alarm', 'Ueberfallalarm'),
129 => array('Ueberfall (Panik) bestaetigt', 'Ueberfallalarm'),
130 => array('Einbruchalarm', 'Einbruchalarm'),
137 => array('Sabotage Zentrale Gehaeusefront, Tastatur, Melder, Bedienteil, Schallgeber, Funk-Bedienteil, Externe Sirenen, UVM, Tuerschloss', 'Sabotagen'),
139 => array('Alarm Bestaetigung', 'Einbruchalarm'),
150 => array('Technischer Alarm', 'Technik'),
// 150 => array('Schluesselkasten Offen oder Geschlossen', 'Schluesselkasten'),  // weitere Bedingung auswerten!
300 => array('Stoerung Aux 12V, System 12V', 'Stoerungen'),
301 => array('Stoerung A/C Stromnetz', 'Stoerungen'),
302 => array('Akku Zentrale Leer/Stoerung', 'Stoerungen'),
305 => array('System oder Teilbereich zurueckgesetzt', 'Info'),
311 => array('Akku Zentrale/Extern Leer/Fehlt', 'Stoerungen'),
320 => array('Stoerung Zone Externer Signalgeber, UVM Stoerung', 'Stoerungen'),
337 => array('Rauchwarnmelder/UVM (externe)PSU Stoerung', 'Stoerungen'),
338 => array('Externe Sirene/UVM leere Batterie/Akku Stoerung', 'Stoerungen'),
338 => array('Externe PSU niedrige Spannung via Zone n', 'Stoerungen'),
342 => array('Externe PSU AC Stoerung', 'Stoerungen'),
344 => array('RF Jamming Stoerung', 'Stoerungen'),
351 => array('Kommunikationsweg Stoerung', 'Stoerungen'),
373 => array('Rauchwarnmelder Stoerung', 'Stoerungen'),
375 => array('Zone Ueberfallkomponente Stoerung', 'Stoerungen'),
381 => array('Supervision Stoerung Zone, Funk-Bedienteil, Externe Sirene, UVM, Tuerschloesser', 'Stoerungen'),
384 => array('Zone leere Batterie Stoerung', 'Stoerungen'),
401 => array('System oder Teilbereich aktiviert und deaktiviert', 'Aktiv./Deaktiv.'),   // weitere Bedingung auswerten!
// 401 => array('System oder Teilbereich intern aktiviert', 'Intern Aktiv'),			    // weitere Bedingung auswerten!
406 => array('Alarmabbruch', 'Einbruchalarm'),
409 => array('System oder Teilbereich mit Schluesselschalter aktiviert und deaktiviert', 'Aktiv./Deaktiv.'),  // weitere Bedingung auswerten!
// 409 => array('System oder Teilbereich mit Schluesselschalter intern aktiviert', 'Intern Aktiv'),              // weitere Bedingung auswerten!
412 => array('Herunterladen erfolgreich', 'Herunterladen'),
457 => array('Ausgang Zeitueberschreitung', 'Info'),
461 => array('Eingabe von 4 falschen Benutzercodes hintereinander', 'Sabotagen'),
573 => array('Benutzer/System Zone ausgeblendet, Zone eingeblendet', 'Info'),
601 => array('Manuelles Ausloesen Test Report', 'Test'),
602 => array('Periodischer/Automatischer Test Report', 'Test'),
625 => array('Zeit und Datum neu eingestellt', 'Info'),
627 => array('Errichtermodus Start Zentrale (Web)', 'Info'),
628 => array('Errichtermodus Ende Zentrale (Web)', 'Info'),
);

$EVENTcodes = array(
1 => 'Alarm neu (Event)',
2 => 'Zustand offen/deaktiviert',
3 => 'Alarm aus (Restore)',
4 => 'Zustand geschlossen/aktiviert',
5 => 'kein Alarm',
6 => 'Alarm Status (Update)',
);

$ZONEcodes = array(
'000' => 'Errichter oder undefiniert',    // Users starting here
'001' => 'User1 (Admin)',
'002' => 'User2',
'003' => 'User3',
'051' => 'Schnell Aktiv',
'052' => 'Level 4 Benutzer',
'053' => 'System',
'054' => 'Schluesselschalter',
'055' => 'Fernzugriff AES/NSL',
'056' => 'Downloader',
'057' => 'Virtuelles Bedienteil',
'058' => 'RF Prozess',
'059' => 'Ausgangsruf Zentrale',
'060' => 'IP-Finder',
'061' => 'ABUS-Server DDNS Client',
'101' => 'Melder XXX (Draht)',          // Zones staring here
'201' => 'Kontakt Kueche Fenster (Funk)',
'203' => 'Kontakt Wohnzimmer Terassentueren (Funk)',
'301' => 'Kontakt Haustuer',
);

$PARTITIONcodes = array(
0 => 'undefiniert',
1 => 'Haus',
2 => 'Bereich 2',
3 => 'Bereich 3',
3 => 'Bereich 3',
);

// Start decodierung:
$event = '-unknown-';
$cidLong = '-unknown-';
$cidGroup = '-unknown-';
$partition = '-unknown-';
$zone = '-unknown-';

$raw = GetValueString(27901 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Receiver\CID_raw]*/);
echo $raw."<br>";

$eventCODE = substr($raw, 1, 1);
$event = $EVENTcodes[$eventCODE]; 
SetValueString(52355 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Decoder\EventTyp]*/, $event);
echo $eventCODE.':'.$event."<br>";;

$CIDcode = substr($raw, 1, 3);
$cidLong = $CIDcodes[$CIDcode][0];
$cidGroup = $CIDcodes[$CIDcode][1];
SetValueString(39107 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Decoder\Meldung]*/, $cidLong);
SetValueString(56191 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Decoder\MeldungGruppe]*/, $cidGroup);
echo $CIDcode.':'.$cidLong.' - '.$cidGroup."<br>";;

$partitionCODE = substr($raw, 6, 1);
$partition = $PARTITIONcodes[$partitionCODE]; 
SetValueString(22173 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Decoder\Teilbereich]*/, $partition);
echo $partitionCODE.':'.$partition."<br>";;

$zoneCODE = substr($raw, 8, 3);
$zone = $ZONEcodes[$zoneCODE]; 
SetValueString(48644 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Decoder\ZoneUser]*/, $zone);
echo $zoneCODE.':'.$zone."<br>";

$now = date("d.m.Y H:i");

$longTEXT = $now.': '.$event.':'.$cidLong.':'.$partition.':'.$zone;
SetValueString(49306 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Decoder\LongStatusText]*/, $longTEXT);

?>

Leider scheint die Anlage immer noch nicht die ACK Message zu verarbeiten. In der Folge wird die erste Message endlos wiederholt und keine weitere gesendet.

So sieht der Trace aus:
RECEIVED [192.168.1.23:9999] <LF>D3A6002B"ADM-CID"0001L0#224401[#224401|1628 01 000]<CR>
TRANSMIT [192.168.1.23:1792] <LF>C9760014"ACK"0001L0#224401<CR>

Hat jemand eine Idee warum beim Debug der RegVariable Port 9999 angezeigt wird, obwohl der Socket nur 1792 öffnet?

Received Message: "ADM-CID"0001L0#224401[#224401|1628 01 000]
Length = 002Bh; CRC16: D3A6h
Transmitted Message: "ACK"0001L0#224401
Length = 0014h; CRC16: C976h

Ich habe die CRC Berechnung hier geprüft:
http://www.sunshine2k.de/coding/javascript/crc/crc_js.html
Da ich hiermit die Empfangene CRC immer korrekt nachrechnen kann, gehe ich davon aus, dass die CRC auch bei meiner selbst berechneten Transmit-Message korrekt ist, weil meine Funktion auf das gleiche Ergebnis kommt.

Hab es geknackt. Ein tcpdump hat geholfen. Nachdem ich das ACK jetzt an Port 9999 zurückschicke funktioniert alles.
Muss wohl ein Bug in der Secvest sein. Senden tut sie nämlich über den frei einstellbaren Port.

Nicht vergessen: Contact_ID gibt es bei vielen AA Herstellern (Zum Beispiel Bosch, Honneywell, usw.). Das ganze ist also recht universell einsetzbar!

Ich habe noch eine CRC und Längenprüfung eingebaut. Nachrichten die hier durchfallen bekommen ein NAK, was eine Wiederholung triggern sollte. Das dürfte aber innerhalb eines LANs eigentlich nie vorkommen.

Leider bin ich schon etwas enttäuscht worden, da die Anlage bei intern-scharf und extern-scharf exakt das gleiche Datagramm sendet. Das kann man also nicht unterscheiden. Eigentlich unverständlich!

Hier also der neue Code für den CONTACT-ID Receiver:

<?
// Receiver for Contact-ID Messages
// (c) 2017 Stefan Frank, V1.00
// Musst be set a script for a RegVar of a ServerSocket 

if ($_IPS['SENDER'] != "RegisterVariable")
return false;

$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, alles andere wird ignoriert
// Eine Prüfung des Protokols und des Absenders findet nicht statt
$cut = substr ($data, 40, 11);
SetValueString(27901 /*[EigeneProgramme\Alarmanlage\Secvest_CID_Receiver\CID_raw]*/, $cut);

// Zusammenbau der ACK Message mit CRC Berechnung
$message = substr($data, 18, -22);  // -1 is for the invisible <CR>
$messageACK = $response.$message.'[]';
$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 /*[EigeneProgramme\Alarmanlage\Secvest_ContactID_Buffer]*/, $output, "192.168.178.235", 9999); // 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;
    }

// -------------------------------------------------------------

?>

Bei TCP ist es aber so das angehend immer ein zufälliger Highport genutzt wird.
Wenn deine Anlage immer 9999 nimmt OK, aber eigentlich nicht korrekt.
Darum gibt es ja extra die Systemvariablen — IP-Symcon :: Automatisierungssoftware
Da gibt es auch ClientIP und ClientPort.

Bezüglich deiner Längenprüfung und Aussage dass das im LAN nicht vorkommen sollte , muss ich dir wiedersprechen.
Du nutzt ja den Buffer der RegVar gar nicht um die Daten bis zum Erreichen der Länge zu buffern.
Das GetBuffer ist, wenn du nie SetBuffer aufrufst, sinnlos.

Und ganz wichtig, niemals die Rohdaten (in eine IPS-Variable schreiben, sonst kannst du dir die Settings kaputtmachen oder die Verbindung Console, WebFront, App.
Michael

  • Mein Symcon „Server Socket“ lauscht auf Port 1793

  • Meine Antwort muss ich an Port 9999 der Alarmanlage senden (obwohl dort 1793) für das Contact-ID Protokoll eingestellt ist.

  • Die Längen(und CRC)Prüfung mach ich nicht auf das TCP Paket, sondern auf die Nutzdaten des TCP Pakets (welche dem eingebetteten Contact-ID Datagramm entsprechen). Diese haben eine eigenen Längenangabe und Prüfsumme.

  • Die Anlage sendet einzelne Datagramme mit der festen Länge 53, welche jeweils in ein TCP Paket passen

All das hier oben genannte funktioniert jetzt, daher hinterfrage ich es nicht mehr.

Der Buffer der RegVar wird ausschließlich durch den ServerSocket befüllt. Ich greife nur lesend darauf zu.
Insofern werden da durch den Socket schon Rohdaten eingeschrieben. Ich wüsste auch nicht, wie ich das verhindern könnte/sollte, denn genau diese Rohdaten will ich ja auswerten.

Meint ihr damit bin gefährde ich meine Konfig?

Ist diese Befehlsfolge sinnvoll order nicht, um an den Inhalt der RegVar zu kommen die durch den ServerSocket beschrieben wird??? Bitte um Kommentare hierzu?
„“
$data = RegVar_GetBuffer($_IPS[‚INSTANCE‘]);
$data .= $_IPS[‚VALUE‘];
„“

Wenn du nie SetBuffer nutzt, ist Getbuffer unnötig.
Deine Daten kommen aus $_IPS[‚VALUE‘]
Wenn du in der Anlage 1793 einstellst ist es korrekt in IPS auf den Port zu lauschen.
Der Port auf den die Anlage diese Daten versendet muss eigentlich ein zufälliger Port sein, wenn es bei deine Anlage immer 9999 ist schön und gut.
Diesen Port liefert IPS in $_IPS[‚CLIENTPORT‘] und auf den musst du antworten.
Der abgehende Port bei TCP kann eigentlich nie konfiguriert werden.
Logisch das du die Länge und CRC nicht auf das TCP-Paket machst, dass macht das OS.
Aber was wenn du nur 30 im ersten Paket und dann 0,5ms später 22 Bytes in einem weiteren Paket bekommst?
Dann haut das nicht hin.
Musst es ja nicht umsetzen, kann dir aber auch Mal um die Ohren fliegen.
Man sollte soetwas immer hinterfragen, sonst wundert man sich nachher über Fehler :wink:
Michael

Hallo Michael,

Das getBuffer habe ich rausgenommen. Danke.

Der Verbindungsaufbau bei TCP sieht imho nur vor eine „noch freie Portnummer“ zu wählen, was ja logisch ist. Hier steht nichts von „zufällig“.

Den Ziel-Port wähle ich beim senden aus: RegVar_SendPacket(42884, $output, „192.168.178.35“, 9999);

Das ein Paket über mehrere TCP Pakete aufgeteilt wird, wird mit ziemlicher Sicherheit nicht vorkommen. Das Contadt-ID Protokoll wurde ursprünglich für die Übertragung via Telefonleitung entwickelt. Daher sind die Diagramme nur ein paar Zeichen lang.

Mir ist klar, dass ich hier zur Vereinfachung Kompromisse eingegangen bin. Ich bin mir aber ziemlich sicher, dass diese keine negativen Auswirkungen im Sinne von nicht erfassten Daten haben werden.

Halli Hallo,
zunächst einmal lieben Dank für die Arbeit :slight_smile: Ich will das gleich mal einbauen… :slight_smile:

Auch wenn es schon ein wenig her ist… wollt ich nochmal kurz hierauf eingehen…

Hierbei gibts Du den Zielport an. Der ausgehende Port ist immer zufällig und ausserhalb der „Privilegierten“ Ports. Privilegierte Ports befinden sich unterhalb 1024.
Ich versuche ein Beispiel (Ein vereinfachter Auszug!):
2 Rechner im Netz wollten eine HTTP Seite aufrufen. (HTTP benutzt Port 80)
Rechner 1 sendet eine HTTP anfrage an Google. Ausgehend über Port 32100 Zielport 80
Rechner 2 sendet eine HTTP anfrage an Yahoo. Ausgehen über Port 21540 Zielport 80
Google sendet seine Antwort an die Öffentliche IP (Die deines Routers im Internet) auf den Port 32100. Der Router hat sich gemerkt, dass Rechner 1 über Port 32100 angefragt hatte und kann somit die Google Antwort auch korrekt an Rechner 1 weiterleiten.
Gleiches Gilt für Yahoo, der an die gleiche Öffentliche IP Antwortet, nur eben mit dem Port 21540. Hier weiß Dein Reuter dass ja Rechner 2 über diese Port ausgehen angefragt hatte und leitet die Antwort von Yahoo korrekt an Rechner 2 weiter.

Würden nun mal angenommen beide Rechner ausgehen Ihre Anfrage über Port 80 aussenden, wüsste der Router ja gar nicht wem er was weiterleiten soll.

Dann noch… Stell Dir vor Du betreibst auf Deinem Server den IIS der Default auch auf Port 80 lauscht. Nun Willst Du Surfen. Absenderport = 80. Antwort kommt also auch auf Port 80 und landet nicht in Deinem Browser, sondern im IIS (InternetInformationsServer von MS).

Ich hoffe ich konnte so ein wenig Licht in die Sache bringen? Würde mich zumindest ein wenig freuen :slight_smile:
LG
//Sven

Das Scrpt funktioniert noch Fehlerfrei mit der aktuellen Firmware (3.00.04) der Secvest.

Beim Update und späteren Rücksichern der Konfig in die Alarmanlage bleibt allerdings der von mir geänderte Port auf dem Default Wert. Nach der Anpassung den den ursprünglichen Wert funkionierte wieder alles.