Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ppp на Siemens MC35i
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > Сотовая связь и ее приложения
lolful
Пытаюсь реализовать 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
Вот что еще добавлю.

Я подключаюсь к gprs (atd*98#) и начинаю получть пакеты вида
Цитата
7EFF7D23C0217D217D237D207D397D227D267D207D2A7D207D207D277D227D287D227D257D26BC62
7D323F7D237D25C2237D25EEF17E
убираю оттуда эскейп-последовательности, 7E и CRC и получаю
Цитата
FF03C021010300190206000A0000070208020506BC62123F0305C22305
это я прогоняю через функцию CRC и получаю E3E2
lolful
Так. Кажется разобрался. RefIn и RefOut означают, что данные и результат надо зеркально отобразить. Тоесть если на входе последовательность 1111000 10101010, то расчитывать CRC надо для последовательности 01010101 0001111. Затем эти данные прогоняются через функцию CRC, результат зеркалируется и в конце делается XOR 0xFFFF. По-идее должно получиться то, что надо.
Параметр Check - это CRC для строки "123456789".
vesago
Посмотрите в этой теме документец. Там доходчиво про ппп расписано. Плюс на этом форуме не однократно такого плана тема всплывала.
lolful
Насчет ppp мне было все понятно. Вопрос был задан по расчету контрольной суммы в пакете ppp. И все темы про ppp я прочитал.

Так или иначе вопрос решен. Сейчас я занимаюсь писаниной - пишу согласование параметров по LCP. Вопрос и тему можно считать закрытой.

Цитата(lolful @ Aug 14 2008, 12:00) *
Так. Кажется разобрался. RefIn и RefOut означают, что данные и результат надо зеркально отобразить. Тоесть если на входе последовательность 11110000 10101010, то расчитывать CRC надо для последовательности 01010101 00001111.

Поправлю себя. Зеркально отображать надо не ВСЮ последовательность, а только биты в байтах. Сами байты переставлять не надо. То есть для данного примера зеркалированная последовательность будет иметь вид 00001111 01010101.
lolful
Итак, по PPP удалось подключиться. Удается посылать UDP и ICMP пакеты (остальные пока не реализовал) через интернет.
Все было реализовано на микроконтроллере ATMega168.

Если у кого есть вопросы по GPRS - задавайте.
Beginning
БЛИН!!!! Я УЖЕ СУМА СХОЖУ!!!
Всё делал как описано выше:
Кидаю это 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. Уже второй день парюсь. Что я не так делаю?????
Сергей Борщ
Цитата(Beginning @ Oct 2 2008, 12:05) *
mas[x]^0xFF
Что я не так делаю?????
В сообщениях выше упоминается зеркалирование, т.е. изменение порядка битов (11110101->10101111), а вы делаете инверсию (11110101->00001010).
Beginning
Спасибо, попробую именно зерколирование октетов.
Beginning
Сделал зеркалирование:

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
Сергей Борщ
Используйте теги обрамления кода (кнопочка # в форме ввода сообщения) для оформления исходников. Иначе они совершенно не читаются.
Смотрите вниимательно в эти две строчки:
Код
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
Цитата
mas[ch1]

Да... надо на отдых.
За рабочий исходник ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! ОГРОМНОЕ! СПАСИБО! a14.gif
akoyur
Цитата(lolful @ Aug 26 2008, 11:00) *
Итак, по PPP удалось подключиться. Удается посылать UDP и ICMP пакеты (остальные пока не реализовал) через интернет.
Все было реализовано на микроконтроллере ATMega168.

Если у кого есть вопросы по GPRS - задавайте.


Добрый день, lolful.
У Вас есть полный алгоритм и код для подключения gprs модема (например, siemens mc35) к интернет и передачи/приема данных на/с вебсервер?
У меня ситуация такая: необходимо написать клиента именно на C#, чтобы в нем была реализована вся работа с сетью (подключение, отключение, отправка данных, загрузка обновления). Все бы ничего, но прога впоследствии должна работать на ubuntu под mono (так что ras под винду не подходят). Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp.
follow_me
Цитата(akoyur @ Jan 17 2011, 16:33) *
Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp.


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

По поводу перевода на C# - то тут проще написать с нуля чем переводить , работа с портами производится как чтение/запись из/в файлы устройств , там всё просто
muchacho
Цитата(follow_me @ Jan 17 2011, 19:18) *
... работа с портами производится как чтение/запись из/в файлы устройств , там всё просто...


Подскажите, пожалуйста, у меня схожая задача и тоже на C#.
Возможно глупый вопрос, но я в этом новичок и пока нигде не могу найти ответа.
Например, есть модем GPRS. Я его АТ-командами довел до состояния CONNECT. И ОПСОС (билайн) сразу присылает РРР-пакеты. Допустим, я реализовал РРР-авторизацию, получил IP. А как происходит обмен данными дальше? По какому протоколу?
Задача - получать и отправлять XML с/на статический IP сервера.

Помогите, пожалуйста.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.