tftp - Empfangen Sie UDP-Paketdatagramme in PHP



tcp php (1)

Ich arbeite in PHP, um einen Listening-Server für ein GPS-Tracking-System zu bauen. Das GPS sendet Daten über UDP-Pakete, die ich durch Ausführen des folgenden Skripts anzeigen kann. Die tatsächlichen Daten erscheinen jedoch in Symbolen, daher rate ich, dass mir eine Konvertierung fehlt

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

Ich habe dies noch nicht mit PHP gemacht, aber meine erste Vermutung wäre, dass Sie eine binäre Zeichenfolge zurückbekommen, die Sie in ASCII konvertieren müssen (oder welchen Zeichensatz Sie auch verwenden).

Es sieht so aus, als ob Sie in der Lage sein sollten, das Entpacken von PHP zu verwenden.

Es ist schwierig, genau zu wissen, welches Format zu liefern ist, ohne zu wissen, welche Daten Sie zurückbekommen. Es sieht so aus, als ob unpack zumindest ein Array von Dezimalwerten zurückgeben könnte (vorausgesetzt, Sie erhalten Zeichen zurück), die Sie dann in ASCII konvertieren könnten, mit chr . Es könnte so etwas sein:

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

Es hängt vom Protokollentwurf ab, wie komplex Ihre Analyse der binären Daten sein muss (dh, Sie senden nur String-Daten oder eine Mischung aus ganzen Zahlen und Strings usw.). Sie müssen die binären Daten entsprechend analysieren ).

BEARBEITEN: Ich habe die Format-Zeichenfolge aktualisiert, um eine unbestimmte Anzahl von Zeichen zu entsprechen, indem Sie den Array-Elementnamen 'chars' gemäß dem hier aufgelisteten Format verwenden.

EDIT: Einige elementare ASCII-Konvertierung zum Codebeispiel hinzugefügt.





data-conversion