Aktueller Standort: Startseite> Neueste Artikel> Wie verwendet ich die Packfunktion von PHP, um GPS -Koordinaten und Zeitstempeldaten für die Übertragung von IoT -Geräten zu verpacken?

Wie verwendet ich die Packfunktion von PHP, um GPS -Koordinaten und Zeitstempeldaten für die Übertragung von IoT -Geräten zu verpacken?

M66 2025-06-26

1. Warum binäre Verpackung verwenden?

Normalerweise werden GPS -Koordinaten in schwimmenden Punktzahlen dargestellt, zum Beispiel:

  • Breite: 31.2304

  • Länge: 121.4737

  • Zeitstempel: Zum Beispiel Unix Timestamp 1716720000

Wenn es direkt in Zeichenfolgenform gesendet wird, wie z. B. JSON, ist es groß und ist nicht für IoT -Geräte mit begrenzter Bandbreite geeignet. Mit der Funktion pack () können wir diese Werte in ein Datenpaket mit fester Länge im Binärformat verpacken, Bandbreite speichern und auf der Empfängerseite genau wiederhergestellt werden.


2. Einführung in die Funktion PHP Pack ()

Pack () ist eine integrierte Funktion in PHP, die zum Umwandeln von Daten in binäre Zeichenfolgen verwendet wird, und wird häufig für die Netzwerkkommunikation, die Dateispeicherung usw. verwendet. Die grundlegende Syntax lautet wie folgt:

 string pack(string $format, mixed ...$values)

Das Parameter $ -Format ist eine Formatsteuerzeichenfolge, die den Typ und die Reihenfolge der nachfolgenden Werte angibt, zum Beispiel:

  • F : 32-Bit-schwimmende Punktzahl (kleiner Endian)

  • D : 64-Bit-Schwimmpunktzahl

  • N : 32-Bit Unsigned Ganzzahl (Big Endian)

  • V : 32-Bit Unsigned Ganzzahl (kleiner Endian)


3. Paket -GPS -Koordinaten und Zeitstempel

Für die Kompatibilität und Datenkompaktheit verwenden wir: Wir verwenden:

  • Breitengrad: Float (4 Bytes, Little Endian)

  • Länge: Float (4 Bytes, kleiner Endian)

  • TIMESTAMP: UINT32 (4 Bytes, Little Endian)

Wir können den folgenden Code verwenden, um diese Daten zu verpacken:

 <?php
// GPSDaten
$latitude = 31.2304;
$longitude = 121.4737;
$timestamp = time(); // Aktueller Zeitstempel

// Verpackung mit kleinem Endformat(latitude: float, longitude: float, timestamp: uint32)
$binaryData = pack('ffV', $latitude, $longitude, $timestamp);

// Optional:将打包后的二进制Daten进行HexCodierung,Leicht zu sehen
$hexData = bin2hex($binaryData);

echo "打包后的二进制Daten为: $hexData\n";
?>

Dieser Code gibt Folgendes aus:

 打包后的二进制Daten为: 9ad4fc3f7089514270128c66

Jedes Segment entspricht dem verpackten Breitengrad, Längengrad und Zeitstempel. Sie können expack () verwenden, um es wieder auf dem Server zu analysieren:

 <?php
$receivedData = $binaryData; // Angenommen, es wurde vom Gerät erhalten
$unpacked = unpack('flatitude/flongitude/Vtimestamp', $receivedData);

print_r($unpacked);
?>

4. Vorschläge für Geräteübertragung

Die Geräteseite kann dieselbe binäre Struktur verwenden, um Daten zu verpacken und über MQTT, HTTP Post oder UDP auf den Server hochzuladen. Zum Beispiel:

 $url = "https://m66.net/api/receive.php";
$data = $binaryData;

$options = [
    'http' => [
        'method' => "POST",
        'header' => "Content-Type: application/octet-stream\r\n",
        'content' => $data
    ]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);

echo "Serverantwort: $response\n";

Die Serverseite kann die ursprünglichen Binärdaten über Php: // eingeben und analysieren.


5. Dinge zu beachten

  • Das Floating Point Number-Format in pack () kann geringfügig von verschiedenen Plattformen variieren, und kleiner oder großer Endanlagen sollte einheitlich verwendet werden und das Format sollte aufgezeichnet werden.

  • Stellen Sie sicher, dass das Gerät und der Server dieselbe Byte -Reihenfolge verwenden.

  • Wenn die übertragene Datenstruktur komplex ist, wird empfohlen, eine Datenkopf -Kennung hinzuzufügen (z. B. Typ, Versionsnummer usw.).