Получение UDP-пакетных дейтаграмм в PHP

Я работаю в php для создания сервера прослушивания для системы слежения GPS. GPS отправляет данные через UDP-пакеты, которые я могу отобразить, выполнив приведенный ниже сценарий. Однако фактические данные выводятся в символах, поэтому я предполагаю, что мне не хватает конверсии

//Reduce errors error_reporting(~E_WARNING); //Create a UDP socket if(!($sock = socket_create(AF_INET, SOCK_DGRAM, 0))) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Couldn't create socket: [$errorcode] $errormsg \n"); } echo "Socket created \n"; // Bind the source address if( !socket_bind($sock, "192.168.1.29" , 1731) ) { $errorcode = socket_last_error(); $errormsg = socket_strerror($errorcode); die("Could not bind socket : [$errorcode] $errormsg \n"); } echo "Socket bind OK \n"; //Do some communication, this loop can handle multiple clients while(1) { echo "\n Waiting for data ... \n"; //Receive some data $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port); echo "$remote_ip : $remote_port -- " . $buf; //Send back the data to the client //socket_sendto($sock, "OK " . $buf , 100 , 0 , $remote_ip , $remote_port); } socket_close($sock); 

Solutions Collecting From Web of "Получение UDP-пакетных дейтаграмм в PHP"

Я раньше не делал этого с PHP, но сначала я предполагал, что вы получите двоичную строку назад, которую вам нужно будет преобразовать в ASCII (или любой другой набор символов, который вы используете).

Похоже, вы должны использовать для этого распаковку PHP.

Трудно точно узнать, какой формат предоставить пакет, не зная, какие данные вы возвращаете. Похоже, что распаковка по крайней мере сможет вернуть массив десятичных значений (при условии, что вы получите символы назад), которые затем можно преобразовать в ASCII с помощью chr . Это может быть что-то вроде этого:

 //Receive some data $r = socket_recvfrom($sock, $buf, 512, 0, $remote_ip, $remote_port); //Convert to array of decimal values $array = unpack("c*chars", $buf); //Convert decimal values to ASCII characters: $chr_array = array(); for ($i = 0; $i < count($array); $i++) { $chr_array[] = chr($array[$i]); } 

Это зависит от дизайна протокола, насколько сложным является ваш синтаксический анализ двоичных данных (т. Е. Вы просто отправляете строковые данные или сочетание целых чисел и строк и т. Д.). Вам необходимо проанализировать двоичные данные соответственно ).

EDIT: я обновил строку формата, чтобы соответствовать неопределенному количеству символов, используя имя элемента массива «chars» в соответствии с указанным здесь форматом.

EDIT: добавлено некоторое элементарное преобразование ASCII в пример кода.