|
ppp на Siemens MC35i, помогите с CRC алгоритмом |
|
|
|
Aug 13 2008, 12:00
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732

|
Пытаюсь реализовать TCP/IP/PPP через GPRS на модеме Siemens MC35i. Сразу же наткнулся на проблему. Не могу сосчитать контрольную сумму кадра PPP. Где-то нашел вот это: Цитата Name : "X-25" Width : 16 Poly : 1021 Init : FFFF RefIn : True RefOut : True XorOut : FFFF Check : 906E (здесь я не догоняю что есть RefIn, RefOut и Check) Прогоняю через функцию... Код unsigned short Crc16(unsigned char *pcBlock, unsigned short len) { unsigned short crc = 0xFFFF; unsigned char i; while (len--) { crc ^= *pcBlock++ << 8; for (i = 0; i < 8; i++) crc = crc & 0x8000 ? (crc << 1) ^ 0x1021 : crc << 1; } return crc ^ 0xFFFF; } ...следующий пакет... Цитата FF03C021010300190206000A0000070208020506BC62123F0305C22305 ...у которого CRC должен быть EEF1, но я получаю E3E2. О, гуру L2P, подскажите где я на грабли наступаю. П.С. Забить на пипипи и взять "нормальный" модем с уже реализованным стеком TCP/IP не предлагать.
Сообщение отредактировал lolful - Aug 13 2008, 12:01
|
|
|
|
|
 |
Ответов
(1 - 14)
|
Aug 14 2008, 04:15
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732

|
Вот что еще добавлю. Я подключаюсь к gprs (atd*98#) и начинаю получть пакеты вида Цитата 7EFF7D23C0217D217D237D207D397D227D267D207D2A7D207D207D277D227D287D227D257D26BC62 7D323F7D237D25C2237D25EEF17E убираю оттуда эскейп-последовательности, 7E и CRC и получаю Цитата FF03C021010300190206000A0000070208020506BC62123F0305C22305 это я прогоняю через функцию CRC и получаю E3E2
Сообщение отредактировал lolful - Aug 14 2008, 04:15
|
|
|
|
|
Aug 19 2008, 08:46
|
Частый гость
 
Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732

|
Насчет ppp мне было все понятно. Вопрос был задан по расчету контрольной суммы в пакете ppp. И все темы про ppp я прочитал. Так или иначе вопрос решен. Сейчас я занимаюсь писаниной - пишу согласование параметров по LCP. Вопрос и тему можно считать закрытой. Цитата(lolful @ Aug 14 2008, 12:00)  Так. Кажется разобрался. RefIn и RefOut означают, что данные и результат надо зеркально отобразить. Тоесть если на входе последовательность 11110000 10101010, то расчитывать CRC надо для последовательности 01010101 00001111. Поправлю себя. Зеркально отображать надо не ВСЮ последовательность, а только биты в байтах. Сами байты переставлять не надо. То есть для данного примера зеркалированная последовательность будет иметь вид 00001111 01010101.
|
|
|
|
|
Oct 2 2008, 11:04
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Сделал зеркалирование: uint8 mas[29]={0xFF,0x03,0xC0,0x21,0x01,0x03,0x00,0x19,0x02,0x06,0x00,0x0A,0x00,0x00,0 x07,0x02,0x08,0x02,0x05,0x06,0xBC,0x62,0x12,0x3F,0x03,0x05,0xC2,0x23,0x05}; uint8 mas_bit[8]={1,2,4,8,16,32,64,128}; uint8 ch0,ch1; CRC=0xFFFF; for(x=0;x<29;x++) { ch0=mas[x]; ch1=0; for(z=0;z<8;z++) if(ch0 & mas_bit[z]) ch1|=mas_bit[7-z]; CRC=crc16_o(mas[ch1],CRC); } CRC1: 5C07 CRC1^: A3F8 Т.е. не равно EEF1. Я не совсем понимаю смысл фразы: Цитата Затем эти данные прогоняются через функцию CRC, результат зеркалируется Конкретно: результат зеркалируется. Т.е. мы берём байт, зеркалируем его, прогоняем через CRC. Полученую CRC зеркалируем (2 байта), потом опять туже процедуру? Я так делал, CRC не совпадает.
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Oct 2 2008, 11:49
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Используйте теги обрамления кода (кнопочка # в форме ввода сообщения) для оформления исходников. Иначе они совершенно не читаются. Смотрите вниимательно в эти две строчки: Код ch0=mas[x]; ..... CRC=crc16_o(mas[ch1],CRC); Возможно, проблема в чтении из массива во второй? Более простым решением будет отзеркалить весь алгоритм. Тогда вам не придется зеркалить каждый входной байт и результат после обсчета: Код uint8_t mas[] ={0xFF,0x03,0xC0,0x21,0x01,0x03,0x00,0x19,0x02,0x06,0x00,0x0A,0x00,0x00,0x07,0x0 2,0x08,0x02,0x05,0x06,0xBC,0x62,0x12,0x3F,0x03,0x05,0xC2,0x23,0x05}; uint16_t CRC(uint16_t crc, uint8_t data) { crc ^= data; for(uint8_t i = 0; i < 8; ++i) { if(crc & (1<<0)) crc = (crc >> 1) ^ 0x8408; else crc = crc >> 1; } return crc; }
int main(int argc, char* argv[]) { uint16_t crc = 0xFFFF; for(size_t i = 0; i < sizeof(mas); ++i) crc = CRC(crc, mas[i]); printf("CRC = %4.4X, ~CRC = %4.4X", crc, crc^0xFFFF); return 0; }
>Test.exe CRC = 0E11, ~CRC = F1EE Кстати: Код uint8_t mas[]="123456789"; .... for(size_t i = 0; i < sizeof(mas) - 1; ++i) // C-строка завршается нулем, его обсчитывать не надо .... >Test.exe CRC = 6F91, ~CRC = 906E Последний результат совпадает с приведенным выше тестовым числом Check
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Oct 2 2008, 12:24
|

Знающий
   
Группа: Свой
Сообщений: 511
Регистрация: 24-08-07
Из: БРЕСТ
Пользователь №: 30 053

|
Цитата mas[ch1] Да... надо на отдых. За рабочий исходник ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! СПАСИБО!
--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
|
|
|
|
|
Jan 17 2011, 14:33
|
Группа: Новичок
Сообщений: 1
Регистрация: 17-01-11
Пользователь №: 62 283

|
Цитата(lolful @ Aug 26 2008, 11:00)  Итак, по PPP удалось подключиться. Удается посылать UDP и ICMP пакеты (остальные пока не реализовал) через интернет. Все было реализовано на микроконтроллере ATMega168.
Если у кого есть вопросы по GPRS - задавайте. Добрый день, lolful. У Вас есть полный алгоритм и код для подключения gprs модема (например, siemens mc35) к интернет и передачи/приема данных на/с вебсервер? У меня ситуация такая: необходимо написать клиента именно на C#, чтобы в нем была реализована вся работа с сетью (подключение, отключение, отправка данных, загрузка обновления). Все бы ничего, но прога впоследствии должна работать на ubuntu под mono (так что ras под винду не подходят). Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp.
|
|
|
|
|
Jan 17 2011, 16:18
|
Частый гость
 
Группа: Участник
Сообщений: 182
Регистрация: 4-11-10
Пользователь №: 60 646

|
Цитата(akoyur @ Jan 17 2011, 16:33)  Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp. Вы видимо не правильно поняли автора , у него не десктопное приложение а прошивка для контроллера , он это указал По поводу перевода на C# - то тут проще написать с нуля чем переводить , работа с портами производится как чтение/запись из/в файлы устройств , там всё просто
Сообщение отредактировал follow_me - Jan 17 2011, 16:19
|
|
|
|
|
Jan 20 2011, 08:11
|
Группа: Новичок
Сообщений: 1
Регистрация: 20-01-11
Пользователь №: 62 350

|
Цитата(follow_me @ Jan 17 2011, 19:18)  ... работа с портами производится как чтение/запись из/в файлы устройств , там всё просто... Подскажите, пожалуйста, у меня схожая задача и тоже на C#. Возможно глупый вопрос, но я в этом новичок и пока нигде не могу найти ответа. Например, есть модем GPRS. Я его АТ-командами довел до состояния CONNECT. И ОПСОС (билайн) сразу присылает РРР-пакеты. Допустим, я реализовал РРР-авторизацию, получил IP. А как происходит обмен данными дальше? По какому протоколу? Задача - получать и отправлять XML с/на статический IP сервера. Помогите, пожалуйста.
Сообщение отредактировал muchacho - Jan 20 2011, 08:12
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|