Перейти к содержанию
    

ppp на Siemens MC35i

Пытаюсь реализовать 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".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посмотрите в этой теме документец. Там доходчиво про ппп расписано. Плюс на этом форуме не однократно такого плана тема всплывала.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Насчет ppp мне было все понятно. Вопрос был задан по расчету контрольной суммы в пакете ppp. И все темы про ppp я прочитал.

 

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

 

Так. Кажется разобрался. RefIn и RefOut означают, что данные и результат надо зеркально отобразить. Тоесть если на входе последовательность 11110000 10101010, то расчитывать CRC надо для последовательности 01010101 00001111.

Поправлю себя. Зеркально отображать надо не ВСЮ последовательность, а только биты в байтах. Сами байты переставлять не надо. То есть для данного примера зеркалированная последовательность будет иметь вид 00001111 01010101.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Все было реализовано на микроконтроллере ATMega168.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

БЛИН!!!! Я УЖЕ СУМА СХОЖУ!!!

Всё делал как описано выше:

Кидаю это 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. Уже второй день парюсь. Что я не так делаю?????

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

mas[x]^0xFF

Что я не так делаю?????

В сообщениях выше упоминается зеркалирование, т.е. изменение порядка битов (11110101->10101111), а вы делаете инверсию (11110101->00001010).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал зеркалирование:

 

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:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используйте теги обрамления кода (кнопочка # в форме ввода сообщения) для оформления исходников. Иначе они совершенно не читаются.

Смотрите вниимательно в эти две строчки:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

mas[ch1]

Да... надо на отдых.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Все было реализовано на микроконтроллере ATMega168.

 

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

 

Добрый день, lolful.

У Вас есть полный алгоритм и код для подключения gprs модема (например, siemens mc35) к интернет и передачи/приема данных на/с вебсервер?

У меня ситуация такая: необходимо написать клиента именно на C#, чтобы в нем была реализована вся работа с сетью (подключение, отключение, отправка данных, загрузка обновления). Все бы ничего, но прога впоследствии должна работать на ubuntu под mono (так что ras под винду не подходят). Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что если у вас есть рабочий код на с++, я готов даже купить, и потом перевести его на sharp.

 

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

 

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

Изменено пользователем follow_me

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Подскажите, пожалуйста, у меня схожая задача и тоже на C#.

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

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

Задача - получать и отправлять XML с/на статический IP сервера.

 

Помогите, пожалуйста.

Изменено пользователем muchacho

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...