реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ppp на Siemens MC35i, помогите с CRC алгоритмом
lolful
сообщение Aug 13 2008, 12:00
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
lolful
сообщение Aug 14 2008, 04:15
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732



Вот что еще добавлю.

Я подключаюсь к gprs (atd*98#) и начинаю получть пакеты вида
Цитата
7EFF7D23C0217D217D237D207D397D227D267D207D2A7D207D207D277D227D287D227D257D26BC62
7D323F7D237D25C2237D25EEF17E
убираю оттуда эскейп-последовательности, 7E и CRC и получаю
Цитата
FF03C021010300190206000A0000070208020506BC62123F0305C22305
это я прогоняю через функцию CRC и получаю E3E2

Сообщение отредактировал lolful - Aug 14 2008, 04:15
Go to the top of the page
 
+Quote Post
lolful
сообщение Aug 14 2008, 06:00
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732



Так. Кажется разобрался. RefIn и RefOut означают, что данные и результат надо зеркально отобразить. Тоесть если на входе последовательность 1111000 10101010, то расчитывать CRC надо для последовательности 01010101 0001111. Затем эти данные прогоняются через функцию CRC, результат зеркалируется и в конце делается XOR 0xFFFF. По-идее должно получиться то, что надо.
Параметр Check - это CRC для строки "123456789".
Go to the top of the page
 
+Quote Post
vesago
сообщение Aug 16 2008, 19:01
Сообщение #4


Тутэйшы
****

Группа: Свой
Сообщений: 708
Регистрация: 30-11-04
Пользователь №: 1 263



Посмотрите в этой теме документец. Там доходчиво про ппп расписано. Плюс на этом форуме не однократно такого плана тема всплывала.
Go to the top of the page
 
+Quote Post
lolful
сообщение Aug 19 2008, 08:46
Сообщение #5


Частый гость
**

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
lolful
сообщение Aug 26 2008, 08:00
Сообщение #6


Частый гость
**

Группа: Свой
Сообщений: 106
Регистрация: 27-11-07
Из: Пермь
Пользователь №: 32 732



Итак, по PPP удалось подключиться. Удается посылать UDP и ICMP пакеты (остальные пока не реализовал) через интернет.
Все было реализовано на микроконтроллере ATMega168.

Если у кого есть вопросы по GPRS - задавайте.
Go to the top of the page
 
+Quote Post
Beginning
сообщение Oct 2 2008, 09:05
Сообщение #7


Знающий
****

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



БЛИН!!!! Я УЖЕ СУМА СХОЖУ!!!
Всё делал как описано выше:
Кидаю это 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. Уже второй день парюсь. Что я не так делаю?????


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 2 2008, 09:17
Сообщение #8


Гуру
******

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



Цитата(Beginning @ Oct 2 2008, 12:05) *
mas[x]^0xFF
Что я не так делаю?????
В сообщениях выше упоминается зеркалирование, т.е. изменение порядка битов (11110101->10101111), а вы делаете инверсию (11110101->00001010).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Beginning
сообщение Oct 2 2008, 09:25
Сообщение #9


Знающий
****

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



Спасибо, попробую именно зерколирование октетов.


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Beginning
сообщение Oct 2 2008, 11:04
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 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 не совпадает. smile3046.gif


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 2 2008, 11:49
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Beginning
сообщение Oct 2 2008, 12:24
Сообщение #12


Знающий
****

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



Цитата
mas[ch1]

Да... надо на отдых.
За рабочий исходник ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! СПАСИБО! a14.gif


--------------------
Если хочешь вбить гвоздь, не ищи обходных путей, просто бери молоток и бей по этому чёртовому гвоздю!
Go to the top of the page
 
+Quote Post
akoyur
сообщение Jan 17 2011, 14:33
Сообщение #13





Группа: Новичок
Сообщений: 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.
Go to the top of the page
 
+Quote Post
follow_me
сообщение Jan 17 2011, 16:18
Сообщение #14


Частый гость
**

Группа: Участник
Сообщений: 182
Регистрация: 4-11-10
Пользователь №: 60 646



Цитата(akoyur @ Jan 17 2011, 16:33) *
Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp.


Вы видимо не правильно поняли автора , у него не десктопное приложение а прошивка для контроллера , он это указал

По поводу перевода на C# - то тут проще написать с нуля чем переводить , работа с портами производится как чтение/запись из/в файлы устройств , там всё просто

Сообщение отредактировал follow_me - Jan 17 2011, 16:19
Go to the top of the page
 
+Quote Post
muchacho
сообщение Jan 20 2011, 08:11
Сообщение #15





Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th July 2025 - 07:29
Рейтинг@Mail.ru


Страница сгенерированна за 0.01514 секунд с 7
ELECTRONIX ©2004-2016