현재 위치: > 최신 기사 목록> PHP의 팩 기능을 사용하여 IoT 장치의 전송을위한 GPS 좌표 및 타임 스탬프 데이터를 포장하는 방법은 무엇입니까?

PHP의 팩 기능을 사용하여 IoT 장치의 전송을위한 GPS 좌표 및 타임 스탬프 데이터를 포장하는 방법은 무엇입니까?

M66 2025-06-26

1. 이진 포장을 사용하는 이유는 무엇입니까?

일반적으로 GPS 좌표는 플로팅 포인트 번호로 표시됩니다.

  • 위도 : 31.2304

  • 경도 : 121.4737

  • 타임 스탬프 : 예를 들어, UNIX 타임 스탬프 1716720000

JSON과 같은 문자열 양식으로 직접 전송되면 크기가 크며 대역폭이 제한된 IoT 장치에는 적합하지 않습니다. Pack () 함수를 사용하여 이러한 값을 이진 형식의 고정 길이 데이터 패킷으로 포장하여 대역폭을 저장 한 후 수신기 측에서 정확하게 복원 할 수 있습니다.


2. PHP Pack () 함수 소개

Pack () 는 PHP의 내장 기능이며 데이터 데이터를 이진 문자열로 변환하는 데 사용되며 종종 네트워크 통신, 파일 스토리지 등에 사용됩니다. 기본 구문은 다음과 같습니다.

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

매개 변수 $ 형식은 예를 들어 후속 값의 유형 및 순서를 지정하는 형식 제어 문자열입니다.

  • F : 32 비트 플로팅 포인트 번호 (Little Endian)

  • D : 64 비트 플로팅 포인트 번호

  • N : 32 비트 서명되지 않은 정수 (Big Endian)

  • V : 32 비트 서명되지 않은 정수 (Little Endian)


3. 패키지 GPS 좌표 및 타임 스탬프

호환성 및 데이터 소형성을 위해 다음을 사용한다고 가정합니다.

  • 위도 : 플로트 (4 바이트, 작은 엔디 언)

  • 경도 : 플로트 (4 바이트, 작은 엔디언)

  • 타임 스탬프 : UINT32 (4 바이트, 리틀 엔디언)

다음 코드를 사용 하여이 데이터를 포장 할 수 있습니다.

 <?php
// GPS데이터
$latitude = 31.2304;
$longitude = 121.4737;
$timestamp = time(); // 현재 타임 스탬프

// 소규모 엔디안 형식을 사용한 포장(latitude: float, longitude: float, timestamp: uint32)
$binaryData = pack('ffV', $latitude, $longitude, $timestamp);

// 선택 과목:将打包后的二进制데이터进行Hex코딩,보기 쉽습니다
$hexData = bin2hex($binaryData);

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

이 코드는 다음을 출력합니다.

 打包后的二进制데이터为: 9ad4fc3f7089514270128c66

각 세그먼트는 각각 포장 위도, 경도 및 타임 스탬프에 해당합니다. Unpack ()을 사용하여 서버에서 다시 구문 분석 할 수 있습니다.

 <?php
$receivedData = $binaryData; // 장치에서 수신되었다고 가정하십시오
$unpacked = unpack('flatitude/flongitude/Vtimestamp', $receivedData);

print_r($unpacked);
?>

4. 장비 전송 제안

장치 측은 동일한 바이너리 구조를 사용하여 데이터를 패키지하고 MQTT, HTTP Post 또는 UDP를 통해 서버에 업로드 할 수 있습니다. 예를 들어:

 $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 "서버 응답: $response\n";

서버 측은 php : // 입력을 통해 원래 바이너리 데이터를 읽고 구문 분석 할 수 있습니다.


5. 주목할만한 것들

  • pack () 의 ​​부동 소수점 번호 형식은 다른 플랫폼마다 약간 다를 수 있으며, 작은 엔디언 또는 대규모 엔디언은 균일하게 사용해야하며 형식을 기록해야합니다.

  • 장치와 서버가 동일한 바이트 순서를 사용하는지 확인하십시오.

  • 전송 된 데이터 구조가 복잡한 경우 데이터 헤더 식별자 (예 : 유형, 버전 번호 등)를 추가하는 것이 좋습니다.