Receba datagramas de pacotes UDP em PHP

Estou trabalhando no php para criar um servidor de escuta para um sistema de rastreamento GPS. O GPS envia dados através de pacotes UDP, que eu posso exibir executando o script abaixo. No entanto, os dados reais aparecem em símbolos, então eu acho que estou perdendo uma conversão

//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); 

Eu não fiz isso com o PHP antes, mas meu primeiro palpite seria que você está recebendo uma string binária de volta, que você precisará converter em ASCII (ou qualquer outro conjunto de caracteres que esteja usando).

Parece que você deveria poder usar o PHP desempacotar para isso.

É difícil saber exatamente qual formato fornecer pacote sem saber quais dados você está recuperando. Parece descompactar, pelo menos, ser capaz de devolver uma série de valores decimais (assumindo que você está recebendo caracteres de volta), o que você poderia converter em ASCII, com chr . Pode ser algo assim:

 //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]); } 

Depende do design do protocolo sobre o quão complexo é a sua análise dos dados binários (isto é, você está apenas enviando dados de string, ou uma mistura de números inteiros e strings, etc ... Você precisa analisar os dados binários de acordo ).

EDITAR: atualizei a seqüência de formato para coincidir com um número indefinido de caracteres, usando o nome do elemento da matriz 'chars' conforme o formato listado aqui .

EDIT: adicionou uma conversão elementar de ASCII ao exemplo de código.