Anton Klapatun

STM32+LWIP+PPP проблемы с аутентификацией

2 сообщения в этой теме

День добрый!

 

Имеется sim-карта со статическим IP и модем SIM800C, который через UART соединен с STM32F0.

Прочитав статью на хабре, которая и являлась отправной точкой, было решено повторить подвиг, но в версии lwip 2.0.3, которой я пользуюсь, ppp изменился до неузнаваемости, что сначала внесло некоторый сумбур. Но в документации к lwip был найден текстовый файл с настройкой ppp-соединения (ppp.txt, прикреплю его ниже), в котором было все, что нужно для счастья, но когда модем начал общаться с контроллером, дальше фазы LCP дело не зашло. Как я понял из документа (ppp_connect.docx), который оказался у меня уже-и-не-помню-откуда, после конфигурирования параметров соединения в фазе LCP контроллер должен посылать в модем пакет с заголовком PAP (C0 23), но он почему-то этого не делает... Он вообще больше ничего не делает. Я пытался проследить в отладчике весь путь запроса, что приходит от модема, но это только больше меня запутало.

Собственно, прием данных у меня организован через прерывание. После ввода AT-команды "ATD*99***1#" и получения ответа "CONNECT", устанавливается флаг "ppp_enable" и при приходе байта он кладется в очередь `xQueue_PPP_Package`.

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
  uint8_t u8;
  if(huart == &huart1)
  {

    if (ppp_enable == true)
    {
      portBASE_TYPE xHigherPriorityTaskWoken_PPP_Rx;

      u8 = Sim800.UsartRxTemp;

      xHigherPriorityTaskWoken_PPP_Rx = pdFALSE;
      xQueueSendFromISR(xQueue_PPP_Package, &u8, &xHigherPriorityTaskWoken_PPP_Rx);
    }
    else
    {
      /*Reception of AT commands*/
    }

    HAL_UART_Receive_IT(&huart1,&Sim800.UsartRxTemp,1);
  }
}

В задаче `StartLwIPTask` в бесконечном цикле проверяется эта очередь и при появлении элементов, записывает их в массив `PPPx.Data` и при фиксации второго HDLC-заголовка (0x7E), отправляет данные в lwip функцией `pppos_input`.

P.S. Переменная `PPPx.Last_Index` это размер пришедшего ppp-пакета.

void StartLwIPTask(void const * argument)
{
  /* USER CODE BEGIN StartLwIPTask */
  /*Создаем очередь*/
  xQueue_Sim800_Package = xQueueCreate(128, sizeof(uint8_t));
  xQueue_PPP_Package = xQueueCreate(128, sizeof(uint8_t));
  uint8_t u8=0;
  volatile int setup = 0;

  tcpip_init( NULL, NULL );             /*Инициализация стека tcp/ip*/

  /*Create a new PPPoS interface*/
    ppp = pppos_create(&ppp_netif,
         output_cb, status_cb, 0);

//    
    /* Auth configuration, this is pretty self-explanatory */
    ppp_set_auth(ppp, PPPAUTHTYPE_PAP, "beeline", "beeline");


    /* Require peer to authenticate */
    ppp_set_auth_required(ppp, 1);

    /*Only for PPPoS, the PPP session should be up and waiting for input.*/
    ppp_set_silent(ppp, 1);

    /*
    * Initiate PPP listener (i.e. wait for an incoming connection), can only
    * be called if PPP session is in the dead state (i.e. disconnected).
    */
    ppp_listen(ppp);

  /* Infinite loop */
  for(;;)
  {    
    if (sim800_init() == S_RESET)          /*Настройка модуля Sim800*/
      continue;


    for (;;)
    {

      if (pdPASS == xQueueReceive(xQueue_PPP_Package, &u8, 100/portTICK_RATE_MS))
      {
        if (u8 == 0x7E)
          t++;

        PPPx.Data[PPPx.Last_Index++] = u8;

        if (t==2)
        {
          PPPx.Last_Index--;
          pppos_input(ppp, PPPx.Data, PPPx.Last_Index);
          t=0;
          memset(&PPPx, 0, sizeof(PPPx));
        }
      }      
    }
  }
  /* USER CODE END StartLwIPTask */
}

Как я писал выше, все идет хорошо, пока идет фаза LCP, но после подтверждения контроллера запроса опций, наступает тишина.

В интернете мне удалось найти довольно мало исчерпывающей информации и примеров по связке stm32+lwip+ppp, если кто-нибудь занимался подобным или сталкивался с похожей проблемой, буду очень признателен за помощь и за пинки в нужном направлении. Заранее спасибо.

 

 

ppp.txt

ppp_connect.docx

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


Ссылка на сообщение
Поделиться на других сайтах
ruhi    35
В 12.07.2018 в 10:58, Anton Klapatun сказал:

... в версии lwip 2.0.3, которой я пользуюсь, ppp ...

Это слишком специфичная задача, вряд ли найдется кто то, кто занимался.

Я например работаю с lwip, но на Атмелах и без использования PPP (возможно в этом была наша ошибка, надо посмотреть может и нам подходит, так что спасибо за пост!).

Может поможет информация: нам пришлось драйвер эзернетовский править в Атмеловской реализации LWIP, чтобы TCP пакеты любой разрешенной длинны (до 1.5кб) проходили.

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


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...

  • Похожие публикации

    • Автор: Trial
      Приветствую всех. По долгу службы раздобыл объектовый прибор Планар ОП-5 с GSM модулем, очень захотелось установить его в гараже чтобы он бдил и соответственно в случае чего отправлял СМС сообщение о каких либо событиях.

      Вот плата прибора:

      На плате имеется разъём для программатора или для подключения к ПК

      Также 9ти пиновый разъём на плате к которому подключен тампер открытия крышки прибора

      Так вот покурив оффициальную документацию по этому прибору, там говорится что для прошивки нужен спец переходник "RS 232 – СГ24" либо нового образца "USB - СГ24" который можно приобрести только на офф сайте прибора и стоит он около 1300р.
      Теперь внимание вопрос, никто ли не сталкивался с прошивками объектовых приборов конкретно планаров и возможно ли раздобыть какой нибудь универсальный переходник? Кароче как бы его прошить не приобретая специальный переходник.
      P. S. Могу конечно обратиться в контору свою, у нас прошивают их, но очень уж интересно самому поковыряться))
      Заранее всем спасибо за ответы.
    • Автор: agbp
      Приветствую! 

      Мы - молодой стартап из Санкт-Петербурга с хорошей финансовой поддержкой. Создаём дроны.
      Нам не хватает серьезного программиста на полный загруженный график (можно удаленно). 

      Из основных задач, которые нужно будет решать: 
      1. Программа отслеживания объекта в видеопотоке (процессор STM32F4xx). 
      2. Программа стабилизации БПЛА по данным с гироскопа и наведение на цель. 
      3. Создание программы управления бесколлекторным двигателем по закрытому контуру с возможностью бесшовной интеграции с программой просчёта траектории ЧПУ станка. 
      4. Программирование бортового комплекса управления БПЛА (автопилот) 
      5. Полный пакет работ по созданию бортового и наземного комплексов управления роем БПЛА. 
      Оформление в штат. 
      ЗП обсуждаема, от 60 000 в месяц.
      P.S. дроны, беспилотники, авиамодели... это только начало!
    • Автор: Djanger
      Приобрёл "NUCLEO-F030R8, Отладочная плата на базе MCU STM32F030R8T6 (ARM Cortex-M0), ST-LINK/V2-1, Arduino-интерфейс"  хочу приобрести два модуля к ней но не знаю о совместимости , кого спрашиваю сомневаются и не отвечают уверенно, 1 модуль это 3,2 TFT ЖК дисплей сенсорный , а второй 8 бит LED 8 бит цифровой Tube 8-разрядный ключ. Кто что может подсказать или посоветовать прошу помочь 


    • Автор: alexmurphy
      Здравствуйте!

      Разовая работа для программистов из Москвы или московской области.

      Необходимо написать прошивку для отладочной платы на базе чипа BMI055
      Даташит: https://www.mouser.com/ds/2/783/BST-BMI055-DS000-08-786482.pdf

      Более подробное ТЗ вышлю кандидату.
      Железо предоставлю.
      Оплата по договоренности.

      При успешном выполнении, будут регулярные заказы, а также трудоустройство при желании, конкурентная зп по Москве.

      Если заинтересованы, просьба в комментах или в ЛС оставить контакты для связи.
    • Автор: Smith2007
      Исследую платку stm32f103c8t6.
      В качестве ide - Keil mVision v5.
      Проект на Си++
      При работе с UART мне требуется вывести некоторую информацию. Делаю это при помощи следующих функций:
      void USARTSend(char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(int val) { int i = 0; sprintf(buffer, "%x", val); while (buffer[i]) { USART_SendData(USART1, buffer[i]); i++; while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {} } } void USARTSend(const unsigned char *ptrOutBuf) { while (*ptrOutBuf) { USART_SendData(USART1, *ptrOutBuf++); while(USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) { } } } В некоторых строках вывожу текст следующим вызовом:
      USARTSend("\r\nUSART1 is ready.\r\n"); Компилируется без ошибок.
      Вывод сообщений в UART тоже без ошибок.
      Но в редакторе кода Keil  на против последней записи появляется значок warning!

      Код выполняется верно

       
      Как можно избавиться от неприятного предупреждения?
  • Сообщения

    • Ну, раз такой смелый,  попробуйте оштрафовать кого-нибудь на досуге, будучи обыкновенным гражданином, потом расскажете, что вышло. А ещё пуще, будучи в составе группы граждан. 
    • У него и так индуктивность первички меньше расчетной из за недомотанных витков, а если сделает зазор, то индуктивность станет еще меньше и ключи будут греться еще сильнее. Чтобы уменьшить выбросы, нужно ставить RC снабберные цепочки.
    • Работают, но мало. А сейчас ещё и лето - грозовых помех много. Подождите до осени. Например, прошедшей зимой случайно наткнулся на 9Y - так они чуть ли не каждый вечер разговаривали, хоть и не по долгу. Кварц заменить на пьезокерамический резонатор можно. Возможно, немного изменится стабильность, но насколько это будет критично - пока не соберёте - не узнаете.
    • Как вы тут все запуганны уже.
      А своей тени не боитесь ещё?
    • Если на ХХ греются ключи и ростет напряжение, значит имеются выбросы - тут и осцилл не нужен, чтобы это определить. Дело в трансе. Сделайте зазор между половинками транса, проложив между ними один слой термоскотча. 
    • Чуть, было, слезу не пустил от умиления. Как в прошлом побывал.  ...старый добрый 767-й - Вещь! И где только его вместе со мной не носило.
    • Всем доброго дня! Собрал PP на 6н9с+Г-807. Корпус - сталь, полностью закрытый. Беспокоит такая ерунда: ловит помехи (детектирует) от сотового телефона. Кабель источника отключал, ничего не меняется. Только экран ламп спасет или есть какой-то метод?