так 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....
> 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 в 1 байт ?
тип переменной - 1 байт, переполнения игнорируются
> а в чем проблемаНу это я уж не знаю, как там у вас сервер работает.
>> а в чем проблема
> Ну это я уж не знаю, как там у вас сервер работает.какой нафиг сервер, тем более у нас ?
судя по приведенным кускам документации - она просто кривая ..
гениальная догадка
сначала нам приходит пакет>> Расмотрим на примере, что от маяка пришел вот такой пакет авторизации:
>> 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 ;)
как-то так