我刚买了一个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á
不幸的是,我不知道如何复制粘贴十六进制部分
现在我如何取出ID部分?我努力了echo hexdec(mb_substr($data, 4, 7));
数据遵循此协议
从文件:
GPRS数据包的命令格式如下: 从服务器到跟踪器: @@\r\n 从跟踪器到服务器: $$\r\n 笔记: 写命令时不要输入''。 所有多字节数据都遵循以下顺序:高字节在低字节之前。 一个GPRS数据包(包括数据)的大小约为100字节 项目规格 @@ 2 个字节。它表示从服务器到跟踪器的数据包头。 它是 ASCII 码(十六进制码:0x40) $$ 2 个字节。它是从跟踪器到服务器的数据包头。 它是 ASCII 码(十六进制码:0x24) L 2 个字节。这意味着整个数据包的长度,包括 标题和结束字符,它是十六进制代码 ID 7 字节,ID 必须是数字且不超过 14 位,未使用的字节 将被“f”或“0xff”填充。它是十六进制代码的格式。 例如,如果 ID 是 13612345678,那么它将显示为 如下:0x13、0x61、0x23、0x45、0x67、0x8f、0xff。 如果 7 个字节全部为 0xff,则为广播命令。ID 是十六进制代码 命令 2 个字节。命令代码是十六进制代码。请参考 命令列表如下。 数据 最小 0 字节和最大 100 字节。“数据”的描述见附件 1。 校验和 2 个字节。它表示 CRC-CCITT(默认为 0xffff)校验和 所有数据(不包括 CRC 本身和结束字符)。 它是十六进制代码。 例如: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 个字节。它是结束字符和十六进制代码 (十六进制代码中的 0x0d,0x0a)
更新
有了 Anomie 的回答,我能够把它拼凑起来
$arr = unpack('H4length/H14id/H4cmd/H4crc/H4end', mb_substr($data, 2, 11) . mb_substr($data, -4));
var_dump($arr);
这将输出类似
数组(5){ [“长度”]=> 字符串(4)“0054” [“身份证”]=> 字符串(14)“004512345678ff” [“命令”]=> 字符串(4)“9955” [“CRC”]=> 字符串(4)“c97e” [“结束”]=> 字符串(4)“0d0a” }