我刚买了一台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á
不幸的是我不知道如何复制粘贴HEX部分
现在我如何获取ID部分?我尝试过 echo hexdec(mb_substr($data, 4, 7));
来自文件:
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)
更新
根据Anomie的回答,我能够把它拼凑起来
$arr = unpack('H4length/H14id/H4cmd/H4crc/H4end', mb_substr($data, 2, 11) . mb_substr($data, -4));
var_dump($arr);
这会出类似
array(5) { ["length"]=> string(4) "0054" ["id"]=> string(14) "004512345678ff" ["cmd"]=> string(4) "9955" ["crc"]=> string(4) "c97e" ["end"]=> string(4) "0d0a" }
答案 0 :(得分:2)
听起来您需要将二进制数据转换为整数或字符串。最直接的方法是使用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];
答案 1 :(得分:0)
您需要知道要从设备接收的消息的格式。您可以从制造商处获取此信息。然后,根据这一点,您必须在服务器端创建一个合适的侦听器。
我一直在使用这样的几个设备,通常你必须在服务器中创建一个用Socket(或类似的)监听端口的进程。您可能还需要一个身份验证过程来区分设备(您可以拥有多个设备)。之后,您只需从设备获取数据,解析它并存储它。根据设备的不同,您还可以发送请求或配置。
希望这有帮助
答案 2 :(得分:0)
* 编辑4月26日: *我已经改变了一些问题,因此这似乎不合适。最初的问题是如何从TCP读取数据。
我发现了一些关于在PHP中编写TCP /套接字服务器的好文章(/我用大鳟鱼打了一下PHP)
http://devzone.zend.com/article/1086 http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
迫不及待想要实现这一目标:)