lolful 0 13 августа, 2008 Опубликовано 13 августа, 2008 (изменено) · Жалоба Пытаюсь реализовать 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 не предлагать. Изменено 13 августа, 2008 пользователем lolful Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lolful 0 14 августа, 2008 Опубликовано 14 августа, 2008 (изменено) · Жалоба Вот что еще добавлю. Я подключаюсь к gprs (atd*98#) и начинаю получть пакеты вида 7EFF7D23C0217D217D237D207D397D227D267D207D2A7D207D207D277D227D287D227D257D26BC62 7D323F7D237D25C2237D25EEF17E убираю оттуда эскейп-последовательности, 7E и CRC и получаюFF03C021010300190206000A0000070208020506BC62123F0305C22305 это я прогоняю через функцию CRC и получаю E3E2 Изменено 14 августа, 2008 пользователем lolful Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lolful 0 14 августа, 2008 Опубликовано 14 августа, 2008 · Жалоба Так. Кажется разобрался. RefIn и RefOut означают, что данные и результат надо зеркально отобразить. Тоесть если на входе последовательность 1111000 10101010, то расчитывать CRC надо для последовательности 01010101 0001111. Затем эти данные прогоняются через функцию CRC, результат зеркалируется и в конце делается XOR 0xFFFF. По-идее должно получиться то, что надо. Параметр Check - это CRC для строки "123456789". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vesago 0 16 августа, 2008 Опубликовано 16 августа, 2008 · Жалоба Посмотрите в этой теме документец. Там доходчиво про ппп расписано. Плюс на этом форуме не однократно такого плана тема всплывала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lolful 0 19 августа, 2008 Опубликовано 19 августа, 2008 · Жалоба Насчет ppp мне было все понятно. Вопрос был задан по расчету контрольной суммы в пакете ppp. И все темы про ppp я прочитал. Так или иначе вопрос решен. Сейчас я занимаюсь писаниной - пишу согласование параметров по LCP. Вопрос и тему можно считать закрытой. Так. Кажется разобрался. RefIn и RefOut означают, что данные и результат надо зеркально отобразить. Тоесть если на входе последовательность 11110000 10101010, то расчитывать CRC надо для последовательности 01010101 00001111. Поправлю себя. Зеркально отображать надо не ВСЮ последовательность, а только биты в байтах. Сами байты переставлять не надо. То есть для данного примера зеркалированная последовательность будет иметь вид 00001111 01010101. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lolful 0 26 августа, 2008 Опубликовано 26 августа, 2008 · Жалоба Итак, по PPP удалось подключиться. Удается посылать UDP и ICMP пакеты (остальные пока не реализовал) через интернет. Все было реализовано на микроконтроллере ATMega168. Если у кого есть вопросы по GPRS - задавайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beginning 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба БЛИН!!!! Я УЖЕ СУМА СХОЖУ!!! Всё делал как описано выше: Кидаю это FF03C021010300190206000A0000070208020506BC62123F0305C22305: CRC=0xFFFF; for(x=0;x<29;x++) CRC=crc16(mas[x],CRC); После этого CRC=1C1D, CRC^0xFFFF=E3E2; Это же получилось и у автора. CRC=0xFFFF; for(x=0;x<29;x++) CRC=crc16(mas[x]^0xFF,CRC); После этого CRC=14f7, CRC^0xFFFF=EB08; ПОЧЕМУ? Должно ведь быть EEF1. Уже второй день парюсь. Что я не так делаю????? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба mas[x]^0xFF Что я не так делаю????? В сообщениях выше упоминается зеркалирование, т.е. изменение порядка битов (11110101->10101111), а вы делаете инверсию (11110101->00001010). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beginning 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Спасибо, попробую именно зерколирование октетов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beginning 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Сделал зеркалирование: 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 не совпадает. :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба Используйте теги обрамления кода (кнопочка # в форме ввода сообщения) для оформления исходников. Иначе они совершенно не читаются. Смотрите вниимательно в эти две строчки: 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Beginning 0 2 октября, 2008 Опубликовано 2 октября, 2008 · Жалоба mas[ch1] Да... надо на отдых. За рабочий исходник ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! СПАСИБО! :a14: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
akoyur 0 17 января, 2011 Опубликовано 17 января, 2011 · Жалоба Итак, по PPP удалось подключиться. Удается посылать UDP и ICMP пакеты (остальные пока не реализовал) через интернет. Все было реализовано на микроконтроллере ATMega168. Если у кого есть вопросы по GPRS - задавайте. Добрый день, lolful. У Вас есть полный алгоритм и код для подключения gprs модема (например, siemens mc35) к интернет и передачи/приема данных на/с вебсервер? У меня ситуация такая: необходимо написать клиента именно на C#, чтобы в нем была реализована вся работа с сетью (подключение, отключение, отправка данных, загрузка обновления). Все бы ничего, но прога впоследствии должна работать на ubuntu под mono (так что ras под винду не подходят). Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
follow_me 0 17 января, 2011 Опубликовано 17 января, 2011 (изменено) · Жалоба Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp. Вы видимо не правильно поняли автора , у него не десктопное приложение а прошивка для контроллера , он это указал По поводу перевода на C# - то тут проще написать с нуля чем переводить , работа с портами производится как чтение/запись из/в файлы устройств , там всё просто Изменено 17 января, 2011 пользователем follow_me Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muchacho 0 20 января, 2011 Опубликовано 20 января, 2011 (изменено) · Жалоба ... работа с портами производится как чтение/запись из/в файлы устройств , там всё просто... Подскажите, пожалуйста, у меня схожая задача и тоже на C#. Возможно глупый вопрос, но я в этом новичок и пока нигде не могу найти ответа. Например, есть модем GPRS. Я его АТ-командами довел до состояния CONNECT. И ОПСОС (билайн) сразу присылает РРР-пакеты. Допустим, я реализовал РРР-авторизацию, получил IP. А как происходит обмен данными дальше? По какому протоколу? Задача - получать и отправлять XML с/на статический IP сервера. Помогите, пожалуйста. Изменено 20 января, 2011 пользователем muchacho Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться