URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9039
[ Назад ]

Исходное сообщение
"Не могу посчитать CRC..."

Отправлено Chris , 16-Фев-11 21:38 
так Smile) Задача Smile приходит пакет по сокету, который мы их 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<1Cool{
$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....


Содержание

Сообщения в этом обсуждении
"Не могу посчитать CRC..."
Отправлено pavlinux , 17-Фев-11 02:58 
> while ($n<1Cool {

Это что?

> Расмотрим на примере, что от маяка пришел вот такой пакет авторизации:
> 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.

Ответ откуда берётся?


> void CRC (byte) {GPRS_CRC+=0x56^byte; GPRS_CRC++; GPRS_CRC^=0xC5+byte; GPRS_CRC--;}

Оно кривое...

Например для byte = 0x41,

(((0x3b + (0x56 ^ 0x41)) + 1) ^ (0xc5 + 0x41)) - 1; будет равно 0x154,

что явно больше 0xFF.



"Не могу посчитать CRC..."
Отправлено Alex_S , 25-Фев-11 03:27 
а в чем проблема иметь crc в 1 байт ?
тип переменной - 1 байт, переполнения игнорируются

"Не могу посчитать CRC..."
Отправлено pavlinux , 25-Фев-11 04:16 
>  а в чем проблема

Ну это я уж не знаю, как там у вас сервер работает.


"Не могу посчитать CRC..."
Отправлено Alex_S , 07-Мрт-11 08:47 
>>  а в чем проблема
> Ну это я уж не знаю, как там у вас сервер работает.

какой нафиг сервер, тем более у нас ?
судя по приведенным кускам документации - она просто кривая ..


"Не могу посчитать CRC..."
Отправлено Alex_S , 07-Мрт-11 08:53 

гениальная догадка
сначала нам приходит пакет

>> Расмотрим на примере, что от маяка пришел вот такой пакет авторизации:
>> 41 03 56 89 50 38 77 67 98 45 68 00 00 00 00 00 00 00 07
>> в документации написано: crc передается ОДНИМ БАЙТОМ!

то есть 18 байт + 1 байт crc. все нормально, можно проверять.
потом наша сторона должна сочинить ответный пакет:

>> ответ должен быть из 10 байт: 9 из них - resp_crc=, а 10-й - сама crc.

72 65 73 70 11 63 72 63 3D 07

по счастливому совпадению сrc у ответа тоже равна 07  ;)

как-то так