【问题标题】:Convert HEX to ASCII, data from GPS tracker将 HEX 转换为 ASCII,来自 GPS 跟踪器的数据
【发布时间】:2011-08-03 18:11:30
【问题描述】:

我刚买了一个GPS追踪器,它可以发送短信到手机就好了。它还支持通过 GPRS 向服务器报告。

我已将设备设置为在端口 8123 上联系我自己的服务器,它是一个 FreeBSD 服务器,我检查了我是否在该端口上收到了数据包。

我已成功设置了一个用 PHP 编写的侦听器服务器,并且我可以从设备接收数据。但是如何将部分 HEX 数据转换为有用的东西(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));

数据关注this protocol

来自文档:

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” }

【问题讨论】:

  • 您需要在 :8123 上有一个监听器,它知道如何解释数据并登录到 MySQL 数据库。为此,您需要我们在 Stack Overflow 的同事。不过我建议您了解更多详细信息,例如消息的格式和协议(原始 TCP、HTTP、SOAP、XML 等)
  • 好的,只是觉得可能有一些服务器软件可以处理这个问题:)
  • 不知道设备的细节,我们无法知道。
  • 我已经更新了 OP,提供了有关传输到服务器的数据格式的更多信息。

标签: php tcp gps packet-capture


【解决方案1】:

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

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

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

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

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

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


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

$bytes = unpack('C*', $length_bin);
$length = ($bytes[0] << 8) | $bytes[1];

【讨论】:

  • 非常感谢!我看过unpack,但不知道如何使用它。现在我明白了 - 再次感谢!
  • 您能帮我做 CRC 检查吗?
  • @Phliplip:CRC 检查需要什么帮助?
  • 一些让我前进的东西,我尝试了来自 PHP.net 的各种 sn-ps。不幸的是,我无法得到与数据包中的 CRC 校验值相同的结果。
  • @Phliplip:this question 中列出的 PHP 代码与您粘贴的文档中示例中的 CRC 匹配。
【解决方案2】:

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

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

希望对你有帮助

【讨论】:

  • 它应该是原始 TCP,该设备是 PST-T100,品牌为“GO Everywhere / GPS 个人追踪器”。设备将在数据中发送 TrackerID(可配置)。你知道有什么现成的软件可以做到这一点吗?还是必须是在该端口上侦听的自定义软件?
  • 我不知道你想做什么,但如果你只是测试,你可以快速编写自己的监听器。对于 Java 中的示例,您可以复制 this 并在您的计算机上运行它。如果您在防火墙后面,请注意打开端口。
  • 我已经更新了 OP,提供了有关传输到服务器的数据格式的更多信息。
【解决方案3】:

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

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

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

等不及要开始了:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2022-07-01
    • 1970-01-01
    • 2015-10-30
    • 2015-08-12
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多