Diese nette Funktion findet alle im Netzwerk vorhandenen SONOS Player und gibt diese als Array zurück
Ich würde jedoch, aus sicherheits gründen, das Srcipt erstmal auf einem test System auszubrobieren, da es bei mir aus bisher nicht nachvollziehbaren gründen, immer nur einmal lief, dann erst wieder wenn ich den IPS Server neu gestartet habe.
Wers testen will hier noch mein Tipp: Mini-WebServer-für-Entwickler
so nun der code:
<?
$devices=discover();
print_r($devices);
function discover($ip = '239.255.255.250', $port = 1900) {
$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($sock, getprotobyname('ip'), IP_MULTICAST_TTL, 2);
$data = "M-SEARCH * HTTP/1.1
HOST: {$ip}:reservedSSDPport
MAN: ssdp:discover
MX: 1
ST: urn:schemas-upnp-org:device:ZonePlayer:1
";
socket_sendto($sock, $data, strlen($data), null, $ip, $port);
$read = [$sock];
$write = $except = [];
$name = $port = null;
$tmp = '';
$buff = '';
while (socket_select($read, $write, $except, 1) && $read) {
socket_recvfrom($sock, $tmp, 2048, null, $name, $port);
$buff .= $tmp;
}
$datas = [];
foreach (explode("
", $buff) as $reply) {
if ( ! $reply) continue;
$arr =& $datas[];
foreach (explode("
", $reply) as $line) {
if (($colon = strpos($line, ':')) !== false) {
$name = strtolower(substr($line, 0, $colon));
$val = trim(substr($line, $colon + 1));
$arr[$name] = $val;
}
}
}
$unique = [];
$devices = [];
foreach ($datas as $data) {
if(in_array($data['usn'],$unique)) continue;
$url = parse_url($data['location']);
$devices[]="{$url['host']}:{$url['port']}";
$unique[] = $data['usn'];
}
return $devices;
}
?>
Ach und Rückmeldungen ob es bei euch läuft, wären wie immer super
cu Xaver