PHP: как получить ответ с UDP-сервера - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь реализовать это сообщение об обнаружении лампы Yeelight (ссылка на руководство: http://www.yeelight.com/download/Yeelight_Inter-Operation_Spec.pdf)

The searching message generated by 3rd device should follow below format and rules and
being sent to multi-cast address 239.255.255.250:1982 over UDP.
-------------------------------------------------------------
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1982
MAN: "ssdp:discover"
ST: wifi_bulb
-------------------------------------------------------------
1. The start line must be "M-SEARCH * HTTP/1.1" without any leading LWP.
2. "HOST" header is optional, if it's present, the value should be "239.255.255.250:1982".
3. "MAN" header is required. The value for "MAN" header must be "ssdp:discover",
double quotes included.
4. "ST" header is required. The value for "ST" header must be "wifi_bulb".
5. The headers are case-insensitive while the start line and all the header values are case
sensitive. Each line should be terminated by "\r\n".

Я признаю: я не могу работать с сокетом, поэтому я попытался и потерпел неудачу (нет ответа, на var dump только "int (116)").

$discover_message = "M-SEARCH * HTTP/1.1\r\n
        HOST: 239.255.255.250:1982\r\n
        MAN: \"ssdp:discover\"\r\n
        ST: wifi_bulb\r\n";

        $socket=socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Cannot create a socket");
        socket_connect($socket,'239.255.255.250','1982') or die("Couldnot connect to socket");
        $ret = socket_sendto($socket,$discover_message,strlen($discover_message),0,'239.255.255.250','1982');
        socket_set_nonblock($socket);
        var_dump($ret);

Я тоже попробовал добавить

$socket=socket_create(AF_INET, SOCK_DGRAM, SOL_UDP) or die("Cannot create a socket");
        socket_connect($socket,'239.255.255.250','1982') or die("Couldnot connect to socket");
        $ret = socket_sendto($socket,$discover_message,strlen($discover_message),0,'239.255.255.250','1982');
        socket_set_nonblock($socket);
        var_dump($ret);
        $sec = 0;
        $usec = $sec === null ? null : (($sec - floor($sec)) * 1000000);
        $r = array($socket);
        while (socket_select($r, $x, $x, $sec, $usec)) {
            $data = socket_read($socket, 4096, PHP_BINARY_READ);
            var_dump($data);
        }

(читая, как реализовано в другом проекте github, в этом используется сокет-пакетист, который сам является оберткой)

но я снова получаю int(116).

Ответ должен быть (как указано в руководстве)

-------------------------------------------------------------
HTTP/1.1 200 OK
Cache-Control: max-age=3600
Date:
Ext:
Location: yeelight://192.168.1.239:55443
Server: POSIX UPnP/1.0 YGLC/1
id: 0x000000000015243f
model: color
fw_ver: 18
support: get_prop set_default set_power toggle set_bright start_cf stop_cf set_scene
cron_add cron_get cron_del set_ct_abx set_rgb 

power: on
bright: 100
color_mode: 2
ct: 4000
rgb: 16711680
hue: 100
sat: 35
name: my_bulb
-------------------------------------------------------------

Как получить мой список ламп, как указано в руководстве?

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...