#!/usr/bin/env php Find core UPnP devices or services: --device InternetGatewayDevice:2 --service Layer3Forwarding:1 Find vendored devices or services: --device dialreceiver:1 --domain dial-multiscreen-org --service dial:1 --domain dial-multiscreen-org EOH; function show_help() { echo $GLOBALS['help']; } $opts = (object)[ 'help'=>null, 'all'=>null, 'root'=>null, 'device'=>null, 'service'=>null, 'domain'=>null, 'uuid'=>null, 'long'=>null ]; foreach (getopt($opt_short, $opt_long) as $opt=>$value) switch ($opt) { case 'help': case 'h': $opts->help = true; break; case 'all': case 'A': $opts->all = true; break; case 'root': case 'R': $opts->root = true; break; case 'device': case 'd': $opts->device = $value; break; case 'service': case 's': $opts->service = $value; break; case 'domain': case 'd': $opts->domain = $value; break; case 'uuid': case 'u': $opts->uuid = $vaue; break; case 'long': case 'l': $opts->long = true; break; } if ($opts->device && $opts->service) { echo "You can't specify --device and --service at the same time\n"; exit(1); } if ($opts->domain && (!($opts->service || $opts->device))) { echo "You need to provide --service or --device when using --domain\n"; exit(1); } elseif ($opts->domain) { if ($opts->device) { discover_device($opts->device, $opts->domain); } else { discover_service($opts->service, $opts->domain); } exit(0); } elseif ($opts->device) { discover_device($opts->device, $opts->domain); exit(0); } elseif ($opts->service) { discover_service($opts->service, $opts->domain); exit(0); } if ($opts->uuid && ($opts->service || $opts->device || $opts->all || $opts->root)) { echo "You can't combine --uuid with the other search types\n"; exit(1); } elseif ($opts->uuid) { discover_uuid($opts->uuid); exit(0); } if ($opts->all && $opts->root) { echo "You can't specify --all and --root at the same time\n"; exit(1); } elseif ($opts->all) { discover_all(); exit(0); } elseif ($opts->root) { discover_root(); exit(0); } show_help(); exit(0); // ---- discovery functions --------------------------------------------------- function discover_uuid($uuid) { echo "Discovering uuid {$uuid}...\n"; } function discover_device($device, $domain=null) { echo "Discovering devices for {$device}...\n"; $discovery = new Discovery(); list ($device,$version)=explode(":",$device); if ($domain) { $target = SearchTarget::URN_DEVICE($domain,$device,$version); } else { $target = SearchTarget::URN_SCHEMA_DEVICE($device,$version); } $discovery->discover($target); show_results($discovery); } function discover_service($service, $domain=null) { echo "Discovering services for {$service}...\n"; $discovery = new Discovery(); list ($service,$version)=explode(":",$service); if ($domain) { $target = SearchTarget::URN_SERVICE($domain,$service,$version); } else { $target = SearchTarget::URN_SCHEMA_SERVICE($service,$version); } $discovery->discover($target); show_results($discovery); } function discover_all() { echo "Discovering all devices...\n"; $discovery = new Discovery(); $discovery->discover(SearchTarget::ALL); show_results($discovery); } function discover_root() { echo "Discovering root devices...\n"; $discovery = new Discovery(); $discovery->discover(SearchTarget::ROOT_DEVICE); show_results($discovery); } function show_results(Discovery $discovery) { foreach ($discovery as $device) { printf(" %s: %s (%s) %s [%s]\n", $device->getFriendlyName(), $device->getModelName(), $device->getManufacturer(), $device->getDeviceType(), $device->getIp() ); foreach ($device->getServices() as $service) { printf(" + %s\n", $service->getServiceType()); } } }