Я получаю данные по UDP в PHP. После прохождения буфера через функцию BIN2HEX в PHP я в конечном итоге с чем-то, напоминающим Raw Data
, как показано ниже в примереПеревести UDP-пакет данных в удобочитаемую форму в PHP
Вот мой PHP код:
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, "0.0.0.0" , 20500);
$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 512, 0, $from, $port);
$file = 'testudp.txt';
// Open the file to get existing content
$current = file_get_contents($file);
// Append a new log line(s) to file
$current .= "New Connection " . date('Y-m-d H:i:s') . " \n" . bin2hex($buf) . "\n";
// Write the contents back to the file
file_put_contents($file, $current);
echo "Received connection from remote address $from and remote port $port" . PHP_EOL;
Какие результаты в чем-то вроде 83 05 01 02 03 04 05 01 01 01 02 00 01 4F B4 64 88 4F B4 64 88 13 BF 71 A8 BA 18 A5 06 00 00 1333 00 00 00 00 11 11 02 ...
, но без пространства.
Пример данных и что он ought, чтобы перевести на: обратите внимание, что перевод начинается только после первых 9 байтов, затем по адресу 2, а затем снова пропускает 2.
Raw Data:
83 05 01 02 03 04 05 01 01 01 02 00 01 4F B4 64 88 4F B4 64
88 13 BF 71 A8 BA 18 A5 06 00 00 1333 00 00 00 00 11 11 02
33 44 44 55 55 66 77 88 99 10 11 ?? 00 ??
Decoded:
-------Message Header--------
01 Service Type, for this message 1 = Acknowledged Request
02 Message Type, for this message 2 = Event Report
-------Event Report----------
4FB46488 Update Time (5/17/12 @ 2:38pm)
4FB46488 Time of Fix (5/17/12 @ 2:38pm)
13BF71A8 Latitude (33.1313576)
BA18A506 Longitude (-117.2790010)
00001333 Altitude
00000000 Speed
1111 Heading
02 Satellites
33 Fix Status
4444 Carrier
5555 RSSI
66 Comm State
77 HDOP
88 Inputs
99 Unit Status
10 Event Index
11 Event Code
?? Accums (# of 4-byte Accum List values)
00 Spare
?? Accum List (Varies depending on the # of Accums reporting)
Я попробовал различные декодеры шестнадцатеричной к ASCii, я также пытался распаковку() в PHP все безрезультатно.
Как вы переводите данные в нечто похожее на пример с помощью PHP? i.e. Как бы BA18A506
в конечном итоге дать мне данные (неформатированные или нет), чтобы соответствовать Longitude (-117.2790010)
в удобной для читаемости форме?
EDIT: Документов указать Note that all bytes in multi-byte fields are transmitted in Net Endian format (Big Endian) where the most significant bits are transmitted first. For example, for a 32-bit field, bits 31-24 are transmitted first, 16-23 second, 8-15 third and 0-7 last
, если это помогает на всех.
Я думаю, вам нужно прочитать документацию/руководство источника, предоставляющего вам эти данные. Я имею в виду, как '13BF71A8' перевести на' Latitude (33.1313576) ', если он не следует определенному« стандарту »или« шаблону », который настроен у поставщика? Меньший пример, я мог бы дать вам '10', вы, возможно, подумаете о числе * десять *, но я на самом деле имел в виду * два *, так как он двоичный с моей точки зрения. – HamZa
@HamZa Большое спасибо, что посмотрели. Я прочитал довольно скудную документацию, и они не упоминают ничего конкретного, поэтому я надеялся, что кто-то здесь может иметь ключ. Ценить это. Если это не актуально, я удалю вопрос. –
Вы разрешили декодирование пакета? Не могли бы вы поделиться тем, что у вас получилось? – waney