socket ejemplo php udp packet data-conversion

ejemplo - socket udp en php



Recibir datagramas de paquete UDP en PHP (1)

Estoy trabajando en php para construir un servidor de escucha para un sistema de localización por GPS. El GPS envía datos a través de paquetes UDP, que puedo visualizar ejecutando el script siguiente. Sin embargo, los datos reales aparecen en símbolos, así que supongo que me falta una conversión.

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


No he hecho esto con PHP anteriormente, pero mi primera suposición sería que estás recuperando una cadena binaria, que necesitarás convertir a ASCII (o cualquier conjunto de caracteres que estés usando).

Parece que deberías poder usar el desempaquetado de PHP para esto.

Es difícil saber exactamente qué formato debe proporcionar el paquete sin saber qué datos está obteniendo. Parece que desempaquetar al menos podría devolver una matriz de valores decimales (asumiendo que está recuperando los caracteres), que luego podría convertir en ASCII, con chr . Puede ser algo como esto:

//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 del diseño del protocolo en cuanto a qué tan complejo debe ser el análisis sintáctico de los datos binarios (es decir, si solo está enviando datos de cadena, o una mezcla de enteros y cadenas, etc.). Debe analizar los datos binarios en consecuencia. )

EDITAR: He actualizado la cadena de formato para que coincida con un número indefinido de caracteres, utilizando el nombre del elemento de matriz ''caracteres'' según el formato que se muestra aquí .

EDITAR: Agregó alguna conversión ASCII elemental al ejemplo del código.