1

我刚买了一个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”
}
4

3 回答 3

2

听起来您需要将二进制数据转换为整数或字符串。最直接的方法是使用unpack.

例如,要提取您已经知道可以使用的长度

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

要将其转换为整数,您可以使用类似

$length = unpack('v', $length_bin); $length = $length[1];

'v'代码适用于长度和校验和;如果您有一个存储为 4 个字节的数字,请使用'V',对于 ID,您可以使用'H*'它作为十六进制数字字符串来获取它。其他代码在文档中列出。


一种不太直接的方法是在使用 unpack withC*获取所有字节值的数组之后手动进行位操作。例如,

$bytes = unpack('C*', $length_bin);
$length = ($bytes[0] << 8) | $bytes[1];
于 2011-04-26T16:41:17.927 回答
0

您需要知道将从设备接收到的消息的格式。您可以从制造商处获取此信息。然后,取决于此,您必须在服务器端创建一个适当的侦听器。

我一直在使用几种类似的设备,通常你必须在服务器中创建一个进程,使用 Socket(或类似的)监听端口。您可能还有一个身份验证过程来区分设备(您可以拥有多个设备)。之后,您只需从设备获取数据,解析并存储它。根据设备,您还可以发送请求或配置。

希望这可以帮助

于 2011-04-12T10:26:49.673 回答
0

* 4 月 26 日编辑: * 我稍微改变了问题,因此这似乎不合适。最初的问题更多是关于如何从 TCP 读取数据。

我发现了一些关于用 PHP 编写 TCP/socket 服务器的好文章(/me 用一条大鳟鱼拍了一下 PHP)

http://devzone.zend.com/article/1086 http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

等不及要开始了:)

于 2011-04-12T11:29:34.723 回答