我刚买了一个GPS跟踪器,它可以很好地给手机发短信。它还支持通过GPRS向服务器报告。
我已经将设备设置为在端口8123上与我自己的服务器联系,这是一个freebsd服务器,我已经检查过在该端口上接收数据包。
我成功地安装了一个用php编写的监听器服务器,并且可以从设备接收数据。但是如何将部分十六进制数据转换成有用的(ASCII)?
数据字符串示例:

$$^@T^@E Y'^WÿU210104.000,A,5534.4079,N,01146.2510,E,0.00,,170411,,*10|1.0|72|0000á

Unfortunately i don't know how i can copy-paste the HEX parts

Now how do i get the ID part out? I have tried echo hexdec(mb_substr($data, 4, 7));

The data is following this protocol

From the document:

Command format of GPRS packets are as follows:

From server to tracker:
@@\r\n

From tracker to server:
$$\r\n

Note:
Do NOT input ‘’ when writing a command.
All multi-byte data complies with the following sequence: High byte prior to low byte.
The size of a GPRS packet (including data) is about 100 bytes

Item        Specification
@@          2 bytes. It means the header of packet from server to tracker.
            It is in ASCII code (Hex code: 0x40)

$$          2 bytes. It is the header of packet from tracker to server.
            It is in ASCII code (Hex code: 0x24)

L           2 bytes. It means the length of the whole packet including
            the header and ending character and it is in hex code

ID          7 bytes, ID must be digit and not over 14 digits, the unused byte
            will be stuffed by ‘f’ or ‘0xff’. It is in the format of hex code.
            For example, if ID is 13612345678, then it will be shown as
            follows: 0x13, 0x61, 0x23, 0x45, 0x67, 0x8f, 0xff.
            If all 7 bytes are 0xff, it is a broadcasting command. ID is in hex code

command     2 bytes. The command code is in hex code. Please refer to the
            command list below.

data        Min 0 byte and max 100 bytes. See Annex 1 for description of ‘data’.

checksum    2 bytes. It indicates CRC-CCITT (default is 0xffff) checksum of
            all data (not including CRC itself and the ending character).
            It is in hex code.
            For example: 24 24 00 11 13 61 23 45 67 8f ff 50 00 05 d8 0d 0a
            0x05d8 = CRC-CCITT (24 24 00 11 13 61 23 45 67 8f ff 50 00)

\r\n        2 bytes. It is the ending character and in hex code
            (0x0d,0x0a in hex code)

Update

With the answer from Anomie, i was able to piece this together

$arr = unpack('H4length/H14id/H4cmd/H4crc/H4end', mb_substr($data, 2, 11) . mb_substr($data, -4));

var_dump($arr);

这样会有点像
数组(5){
[“长度”]=>
字符串(4)“0054”
[“id”]=>
字符串(14)“004512345678FF”
[“命令”]=>
字符串(4)“9955”
[“CRC”]=>
字符串(4)“C97E”
[“结束”]=>
字符串(4)“0d0a”
}

最佳答案

听起来您需要将二进制数据转换为整数或字符串。最直接的方法是使用unpack
例如,要提取您已经知道可以使用的长度

$length_bin = substr($string, 2, 2);

要将其转换为整数,可以使用
$length = unpack('v', $length_bin); $length = $length[1];

对于长度和校验和,'v'代码有效;如果您有一个存储为4字节的数字,请使用'V',对于ID,可以使用'H*'将其作为十六进制数字的字符串获取。其他代码在the documentation中列出。
在使用unpack withC*获取所有字节值的数组之后,一种稍微不那么简单的方法是手动进行位操作。例如,
$bytes = unpack('C*', $length_bin);
$length = ($bytes[0] << 8) | $bytes[1];

07-28 02:09
查看更多