так ) Задача приходит пакет по сокету, который мы их bin2hex переводим. Получаем 41 03 56 89 60 34 06 01 61 45 69 00 00 00 00 00 00 00 00
Далее на такой пакет нужно устройству ответить это 4103568960340601610000000000 + CRC... Цитирую документацию:
При «авторизации» отправляются поля 1, 2, 5 (1+17+1=19 байт) (должен получить ответ CRC в виде resp_crc=xx, где xx – «посчитанная» сервером CRC)
CRC включает в себя все переданные байты (кроме самого байта CRC).
Перед передачей первого байта CRC устанавливается в 0x3B (GPRS_CRC=0x3B).
Функция расчета CRC (для каждого передаваемого байта):
void CRC (byte) {GPRS_CRC+=0x56^byte; GPRS_CRC++; GPRS_CRC^=0xC5+byte; GPRS_CRC--;}
т.е. пакет ответа получился 14 байт (без учета CRC) получается 56*14 отбрасываем последние цыфры, тоесть 784 -> 78 это CRC 16-ый байт.
Т.е. ответ 41035689603406016100000000003B78, через функцию:
PHP:
define('HEX2BIN_WS', " \t\n\r");
function hex2bin($hex_string) {
$pos = 0;
$result = '';
while ($pos < strlen($hex_string)) {
if (strpos(HEX2BIN_WS, $hex_string{$pos}) !== FALSE) {
$pos++;
} else {
$code = hexdec(substr($hex_string, $pos, 2));
$pos = $pos + 2;
$result .= chr($code);
}
}
return $result;
}
засылаю устройству.. а в ответ нифига.. где я ошибаюсь, помогите подумать
Если по документации то CRC считается так:
$GPRS_CRC=0x3B;
$n=0;
while ($n<18){
$GPRS_CRC+=0x56^$hex[$n];
$GPRS_CRC++;
$GPRS_CRC^=0xC5+$hex[$n];
$GPRS_CRC--;
$n++;
}
GPRS_CRC это один байт... Даже скжу больше, вот что пишет их разработчик:
Расмотрим на примере, что от маяка пришел вот такой пакет авторизации:
41 03 56 89 50 38 77 67 98 45 68 00 00 00 00 00 00 00 07
в документации написано: crc передается ОДНИМ БАЙТОМ!
ответ должен быть из 10 байт: 9 из них - resp_crc=, а 10-й - сама crc.
То есть, для данного случая это будет выглядеть так:
resp_crc= - это 9 байт: 72 65 73 70 11 63 72 63 3D
сама crc - 10-й байт - (в данном случае - 07)
Итого ответ серверу на пакет авторизации должен выглядеть так
72 65 73 70 11 63 72 63 3D 07
нихрена не понимаю откуда взялось 72 65 73 70 11 63 72 63 3D....
OFF: не получается посчитать CRC, мужики HELP!
-
- Сообщения: 120
- Зарегистрирован: Вс ноя 22, 2009 02:41
- Откуда: Чебоксары
Это "resp \x11 crc=" и CRC=772 65 73 70 11 63 72 63 3D 07
Код: Выделить всё
echo "72657370116372633d" | xxd -r -p
resp crc=
Дальше ещё интереснее...
24-26 0x6C 0x29 0x61: 4-й – 27-й биты - шестизначное число, при необходимости «добивается» нулями (0x6C 0x29 0x6 = 44.3030). 0-й бит установлен.
получается, что в битах 11011001010011100001... Но здесь их всего 20... но не 27... Что делаю не так? В результате получаемое число не 44.3030, на моих реальных данных тоже разница ого го. Мужики, что не так делаю?
24-26 0x6C 0x29 0x61: 4-й – 27-й биты - шестизначное число, при необходимости «добивается» нулями (0x6C 0x29 0x6 = 44.3030). 0-й бит установлен.
получается, что в битах 11011001010011100001... Но здесь их всего 20... но не 27... Что делаю не так? В результате получаемое число не 44.3030, на моих реальных данных тоже разница ого го. Мужики, что не так делаю?