/** * @param integer $discoverTime * @return $this */ public function discover(int $discoverTime = 10) : self { $client = new UDPClient(); $client->setHost($this->host); $client->setPort($this->port); $client->setTimeout($discoverTime, 0); $client->setAllowBrowscast(true); $client->connect(); $client->write($this->buildPacket('OPTIONS', max(1, $discoverTime / 2))); $client->write($this->buildPacket('M-SEARCH', max(1, $discoverTime / 2))); $endTime = time() + $discoverTime; while (time() < $endTime) { if ($this->server) { $this->server->listen(1); } /** @var string $msg */ if (!($msg = $client->read())) { usleep(0.01); continue; } self::$eventHandler->fireEvent(EventDiscover::EVENT_NAME, new EventDiscover((new SsdpResponse())->setFromString($msg))); } $client->disconnect(); return $this; }
/** * @param InputInterface $input * @param OutputInterface $output * @return integer */ protected function execute(InputInterface $input, OutputInterface $output) { /** @var SsdpResponse[] $services */ $services = []; $server = new SimpleServiceDiscoveryProtocolServer(); $server->addAllowedMulticastAddress('239.255.255.250'); $server->bind(); $client = new SimpleServiceDiscoveryProtocolClient($this->discoverTime); $client->setServer($server); $client->addEvent(EventDiscover::EVENT_NAME, function (EventDiscover $event) use(&$services) { $service = $event->getSsdpResponse(); if (isset($services[$service->getLocation()])) { return; } $services[$service->getLocation()] = $service; printf("%s\n\t<%s>\n\n", $service->getServer(), $service->getLocation()); }); $client->discover($this->discoverTime); return 0; }