The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Не могу посчитать CRC..."
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (PHP)
Изначальное сообщение [ Отслеживать ]

"Не могу посчитать CRC..."  +/
Сообщение от Chris email(??) on 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....

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Не могу посчитать CRC..."  +/
Сообщение от pavlinux (ok) on 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.


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Не могу посчитать CRC..."  +/
Сообщение от Alex_S (??) on 25-Фев-11, 03:27 
а в чем проблема иметь crc в 1 байт ?
тип переменной - 1 байт, переполнения игнорируются
Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Не могу посчитать CRC..."  +/
Сообщение от pavlinux (ok) on 25-Фев-11, 04:16 
>  а в чем проблема

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

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Не могу посчитать CRC..."  +/
Сообщение от Alex_S (??) on 07-Мрт-11, 08:47 
>>  а в чем проблема
> Ну это я уж не знаю, как там у вас сервер работает.

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

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

5. "Не могу посчитать CRC..."  +/
Сообщение от Alex_S (??) on 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  ;)

как-то так

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру