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.
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)
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);
?>
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.
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.).