Habituellement, les coordonnées GPS sont représentées dans les nombres de points flottants, par exemple:
Latitude: 31.2304
Longitude: 121.4737
Horodatage: par exemple, horodatage Unix 1716720000
S'il est envoyé directement sous forme de chaîne, comme JSON, il est de grande taille et ne convient pas aux appareils IoT avec une bande passante limitée. À l'aide de la fonction Pack () , nous pouvons emballer ces valeurs dans un paquet de données de longueur fixe au format binaire, enregistrer la bande passante et le restaurer avec précision du côté récepteur.
Pack () est une fonction intégrée en PHP, utilisée pour convertir les données en chaînes binaires, et est souvent utilisée pour la communication réseau, le stockage de fichiers, etc. La syntaxe de base est la suivante:
string pack(string $format, mixed ...$values)
Le format de paramètre $ est une chaîne de contrôle de format qui spécifie le type et l'ordre des valeurs suivantes, par exemple:
F : Numéro de point flottant 32 bits (Little Endian)
D : numéro de point flottant 64 bits
N : entier non signé 32 bits (Big Endian)
V : entier non signé 32 bits (Little Endian)
Pour la compatibilité et la compacité des données, supposons que nous utilisons:
Latitude: flotteur (4 octets, peu endian)
Longitude: flotteur (4 octets, petit endian)
Timestamp: Uint32 (4 octets, Little Endian)
Nous pouvons utiliser le code suivant pour emballer ces données:
<?php
// GPSdonnées
$latitude = 31.2304;
$longitude = 121.4737;
$timestamp = time(); // Horodatage actuel
// Emballage utilisant un format petit-endian(latitude: float, longitude: float, timestamp: uint32)
$binaryData = pack('ffV', $latitude, $longitude, $timestamp);
// Facultatif:将打包后的二进制données进行Hexcodage,Facile à visualiser
$hexData = bin2hex($binaryData);
echo "打包后的二进制données为: $hexData\n";
?>
Ce code sortira ce qui suit:
打包后的二进制données为: 9ad4fc3f7089514270128c66
Chaque segment correspond respectivement à la latitude, à la longitude et au horodatage emballées respectivement. Vous pouvez utiliser unpack () pour l'analyser sur le serveur:
<?php
$receivedData = $binaryData; // Supposons qu'il a été reçu de l'appareil
$unpacked = unpack('flatitude/flongitude/Vtimestamp', $receivedData);
print_r($unpacked);
?>
Le côté périphérique peut utiliser la même structure binaire pour emballer les données et les télécharger sur le serveur via MQTT, HTTP Post ou UDP. Par exemple:
$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 "Réponse du serveur: $response\n";
Le côté serveur peut lire les données binaires d'origine via PHP: // l'entrée et l'analyser.
Le format de numéro de point flottant dans pack () peut varier légèrement de différentes plates-formes, et les petits-endiens ou les grands-endiens doivent être utilisés uniformément et le format doit être enregistré.
Assurez-vous que l'appareil et le serveur utilisent la même commande d'octets.
Si la structure de données transmise est complexe, il est recommandé d'ajouter un identifiant d'en-tête de données (tel que le type, le numéro de version, etc.).