UPNP Discover - Findet Sonos Player im Netztwerk

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

cu Xaver

interessant!

Denkst Du, das kann man auch für die squeeze player verwenden? Wie kommst Du auf diese Abfrage:

urn:schemas-upnp-org:device:ZonePlayer:1

gruss Andi

Ja ich denke schon, ich hbe die Packete protokolliert und da kann man sehen das die Sonos Player Software damit die Player findet.
Die ganzen anderen Funktionen stehen in den device_descriptions.xml daten.

cu
Xaver

Die ganzen anderen Funktionen stehen in den device_descriptions.xml daten.[/QUOTE]

Xml? Ist das sonos spezifisch oder welches xml meinst du?

Alle mir bekannten Geräte die sich per XMLRPC steuern lassen, liefern über eine info.xml datei , die leider immer verschiedene namen hat, alles wesentliche zum funktionsumfang. Daraus lassen sich auch allen urns ect heraus finden.
Aber als ob die unterschiedlichen xml dateinamen nicht genug wären, lauschen auch alle mir bekannten geräte auf unterschiedlichen ports auf eine anfrage :frowning:

cu
Xaver