В виду того, что колонка без проблем управляется приложениями на телефоне BubbleUpnp, делаю вывод, что можно отказаться от google-home-notifier и переписать на php. В сети уже достаточно примеров управления chromecast на php, не думаю что тут должно чем-то сильно отличаться.
В соседней ветке мы ковыряем протокол dnla-render (dnla-sharing
https://majordomo.smartliving.ru/forum/ ... f=6&t=4156), который с помощью HTTP запросов может управлять медиа-устройствами (смарт телевизаторами), тут ситуация аналогичная, только используется немного другой протокол.
Пока я выяснил, что для поиска и управления используется протокол DIAL - некий симбиоз SSDP для поиска и HTTP REST + XML для управления. SSDP, возможно, знаком вам, если вы использовали UPnP и DLNA, а REST-часть достаточно простая. (
https://habrahabr.ru/post/210742/ )
Задача:
1) Обнаружить устройства в домашней сети M-SEARCH запросом (пример этого прокола у меня уже есть, я ранее пытался им просканировать приставки MAG250
https://majordomo.smartliving.ru/forum/ ... 250#p55505 )
Код: Выделить всё
error_reporting(E_ALL);
ini_set('display_errors', 1);
class UPnPFind
{
/**
* Find devices by UPnP multicast message and stores them to cache
*
* @return array Parsed device list
*/
public static function findDevices()
{
$discover = self::discover(10);
return($discover); //!!
/*
$devices = array();
flush();
foreach ($discover as $response) {
$device = new Device();
if ($device->initByDiscoveryReponse($response)) {
$device->saveToCache();
try {
$client = $device->getClient('ConnectionManager');
$protocolInfo = $client->call('GetProtocolInfo');
$sink = $protocolInfo['Sink'];
$tmp = explode(',', $sink);
$protocols = array();
foreach ($tmp as $protocol) {
$t = explode(':', $protocol);
if ($t[0] == 'http-get') {
$protocols[] = $t[2];
}
}
} catch (UPnPException $upnpe) {
$protocols = array();
}
$device->protocolInfo = $protocols;
$cache[$device->getId()] = array(
'name' => $device->getName(),
'services' => $device->getServices(),
'icons' => $device->getIcons(),
'protocols' => $device->getProtocolInfo()
);
}
}
return $cache;
*/
}
/**
* Performs a standardized UPnP multicast request to 239.255.255.250:1900
* and listens $timeout seconds for responses
*
* Thanks to artheus (https://github.com/artheus/PHP-UPnP/blob/master/phpupnp.class.php)
*
* @param int $timeout Timeout to wait for responses
*
* @return array Response
*/
private static function discover($timeout = 2)
{
$msg = 'M-SEARCH * HTTP/1.1' . "\r\n";
$msg .= 'HOST: 239.255.255.250:1900' . "\r\n";
$msg .= 'MAN: "ssdp:discover"' . "\r\n";
$msg .= "MX: 3\r\n";
$msg .= "ST: upnp:rootdevice\r\n";
$msg .= '' . "\r\n";
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1);
socket_sendto($socket, $msg, strlen($msg), 0, '239.255.255.250', 1900);
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
$response = array();
do {
$buf = null;
@socket_recvfrom($socket, $buf, 1024, MSG_WAITALL, $from, $port);
if (!is_null($buf)) {
$response[] = self::discoveryReponse2Array($buf);
}
} while (!is_null($buf));
//socket_close($socket);
return $response;
}
/**
* Transforms discovery response string to key/value array
*
* @param string $res discovery response
*
* @return \stdObj
*/
private static function discoveryReponse2Array($res)
{
$result = array();
$lines = explode("\n", trim($res));
if (trim($lines[0]) == 'HTTP/1.1 200 OK') {
array_shift($lines);
}
foreach ($lines as $line) {
echo '<br>';
$tmp = explode(':', trim($line));
$key = strtoupper(array_shift($tmp));
$value = (count($tmp) > 0 ? trim(join(':', $tmp)) : null);
$result[$key] = $value;
echo $value;
}
return (Object)$result;
}
}
$devices = UPnPFind::findDevices();
//echo $devices;
print_r($devices);
а описание протокола DIAL я нашел по ссылке
https://github.com/jloutsenhizer/CR-Cas ... tation-WIP
он видит другие устройства, но колонка от гугл почему-то на мой запрос не отвечает
2) Отправить контент на устройство HTTP запросом
При очередной распродаже по 30$ за мини версию, считаю что должен купить каждый фан умного дома

Тем более сейчас вроде какая-то акция и можно купить 2 шт за 60$ в американском сторе. Доставка сервисом типа бандерольки у меня вышла 35$. Итого получилось по 47$ (2600 руб.) за штуку. Также я создал группу в телеграм, куда я и члены группы скидывают интересные ссылки на подобные железяки
https://t.me/iot_gadgets
снифинг пакетов программы BubbleUpnp: