arduino — PHP: отправьте широковещательное UDP-сообщение и дождитесь ответа

Я использовал этот код для отправки широковещательного UDP-сообщения

$ip = "255.255.255.255";
$port = 8888;
$str = "DEVICE_DISCOVERY";

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
socket_sendto($sock, $str, strlen($str), 0, $ip, $port);

socket_recvfrom($sock, $buf, 20, 0, $ip, $port);
echo "Messagge : < $buf > , $ip : $port <br>";

socket_close($sock);

Я хочу, чтобы некоторые конкретные сетевые устройства (в моем случае некоторые Arduino доски с сетевым экраном) отвечают определенным сообщением.

Код работает, но таким образом я не могу напечатать все ответы, кроме одного.

10

Решение

Вам нужен цикл while, из которого вы выходите, если в течение тайм-аута нет ответа.

Первый тайм-аут, например, 5 секунд:

socket_set_option($sock,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>5,"usec"=>0));

И цикл:

while(true) {
$ret = @socket_recvfrom($sock, $buf, 20, 0, $ip, $port);
if($ret === false) break;
echo "Messagge : < $buf > , $ip : $port <br>";
}

Полный код:

$ip = "255.255.255.255";
$port = 8888;
$str = "DEVICE_DISCOVERY";

$sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_set_option($sock, SOL_SOCKET, SO_BROADCAST, 1);
socket_set_option($sock, SOL_SOCKET, SO_RCVTIMEO, array("sec"=>5, "usec"=>0));
socket_sendto($sock, $str, strlen($str), 0, $ip, $port);

while(true) {
$ret = @socket_recvfrom($sock, $buf, 20, 0, $ip, $port);
if($ret === false) break;
echo "Messagge : < $buf > , $ip : $port <br>";
}

socket_close($sock);
7

Другие решения

Других решений пока нет …