Конвертировать HEX в ASCII, данные с GPS трекера - PullRequest
1 голос
/ 12 апреля 2011

Я только что купил GPS-трекер, он может отправлять SMS на мобильный телефон просто отлично.Он также поддерживает отправку отчетов на сервер через 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

Теперь, как мне получить часть идентификатора?Я пытался 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)

Обновление

С ответом от Аноми я смог собрать это воедино

$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"
}

Ответы [ 3 ]

2 голосов
/ 26 апреля 2011

Похоже, вам нужно преобразовать двоичные данные в целые числа или строки. Самый простой способ - использовать unpack.

Например, чтобы извлечь длину, которую вы уже знаете, вы можете использовать

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

Чтобы преобразовать его в целое число, вы можете использовать что-то вроде

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

Код 'v' будет работать для длины и контрольной суммы; если у вас есть число, хранящееся как 4 байта, используйте 'V', а для идентификатора вы можете использовать 'H*', чтобы получить его как строку шестнадцатеричных цифр. Другие коды перечислены в документации .


Несколько менее простой способ - выполнить битовую манипуляцию вручную, после использования unpack с C*, чтобы получить массив всех значений байтов. Например,

$bytes = unpack('C*', $length_bin);
$length = ($bytes[0] << 8) | $bytes[1];
0 голосов
/ 12 апреля 2011

* Редактировать 26 апреля: * Я немного изменил вопрос, поэтому это кажется неуместным.Первоначальный вопрос был больше о том, как читать данные из TCP.

Я нашел несколько замечательных статей о написании TCP / сокет-сервера на PHP (/ me слегка обходит PHP с большой форелью)

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

Не могу дождаться, чтобы начать:)

0 голосов
/ 12 апреля 2011

Вам необходимо знать формат сообщений, которые вы собираетесь получать с устройства.Вы можете получить эту информацию от производителя.Затем, в зависимости от этого, вам нужно создать правильного слушателя на стороне сервера.

Я работал с несколькими подобными устройствами, и обычно вам нужно создать процесс на сервере, слушающий порт сРозетка (или аналогичная).У вас также может быть процесс аутентификации, чтобы различать устройства (у вас может быть более одного).После этого вы просто получаете данные с устройства, анализируете их и сохраняете.В зависимости от устройства вы также можете отправлять запросы или конфигурации.

Надеюсь, это поможет

...