Ich habe das originale Script aus UniFi Modul Reloaded - Seite 13 wenig angepasst, damit man mehr sieht. Die ankommenden Daten werden jetzt ins Meldungsfenster geschrieben.
Vorher sind manuell 3 Stringvariable, eine RegisterVariable Instance und eine UDP Socket Server Instance und das Script wie folgt anzulegen
<?php
$ipvar=21174; //Anpassen auf eigene ID
$leavevar=31157; //Anpassen auf eigene ID
$entervar=50118; //Anpassen auf eigene ID
//Prüfung, ob das Script von der Registervariable Instance gestartet wurde
if ($_IPS['SENDER'] == "RegisterVariable") {
$regvar = $_IPS['INSTANCE'];
$newdata = $_IPS['VALUE'];
// Daten in Puffer speichern wird hier verzichtet
//$buffer = RegVar_GetBuffer($regvar);
//$buffer .= $newdata;
//RegVar_SetBuffer($regvar, $buffer);
// in UTF8 wandeln
$utf8data = utf8_decode($newdata);
IPS_LogMessage("Syslog","Daten herhalten:".$newdata); //Auskommentieren für Normalbetrieb
// Fall 1: Endgerät hat WLAN verlassen
if (strpos($utf8data, "EVENT_STA_LEAVE") !== false)
{
preg_match_all("/\b[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}\b/su", $utf8data, $macs);
$mac = $macs[0][0];
SetValue($leavevar, $mac);
IPS_LogMessage("Syslog", "WLAN verlassen durch ".$mac);
}
// Fall 2: Endgerät hat sich ins WLAN eingebucht
if (strpos($utf8data, "EVENT_STA_JOIN") !== false)
{
preg_match_all("/\b[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}\b/su", $utf8data, $macs);
$mac = $macs[0][0];
SetValue($entervar, $mac);
IPS_LogMessage("Syslog","WLAN betreten von ".$mac);
}
// Fall 3: IP-Adresse des Endgerätes nach Einbuchen auslesen
if (strpos($utf8data, "EVENT_STA_IP") !== false)
{
preg_match_all("/\b[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}:[[:xdigit:]]{2}\b/su", $utf8data, $macs);
$mac = $macs[0][0];
preg_match_all("/(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/", $utf8data, $ips);
$ip = $ips[0][1];
SetValue($ipvar, $ip);
IPS_LogMessage("Syslog","IP:".$ip);
}
} else {
echo "Script muss von Registervariable aufgerufen werden";
}
Die Registervariable Instance bekommt als Target das Script und als Gateway die UDP Socket Server Instance.
Die Socketserver-Instance ist wie folgt definiert
Sendehost: freilassen ( wir wollen nur empfangen)
Sendeport: 514 (da muss was rein)
Empfangshost: Container-ID
Empfangsport: 514
Reuse Address: aktiviert
Die relevanten Docker Container Port Einstellungen
-p 3777:3777 \
-p 5544:5544 \
-p 2001:2001 \
-p 2010:2010 \
-p 11514:514/udp \
Im Unifi Controler die IP des Dockerhostes/Synology und Port 11514 eintragen.
Im Debug der registervariable kann man gut sehen, was gesendet wurde.
Mit
logger -n <synology-ip> -P 11514 "test"
von einem Linux System kann man auch selbst was senden.
Am Ende sieht es so aus: