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

 
 
 
Reply to this topicStart new topic
> LWIP, PPP, сервер не открывает соединение
Klapatun
сообщение Sep 21 2018, 09:31
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 12-07-18
Из: Новосибирск
Пользователь №: 105 858



Доброго времени суток!

Имеется gsm-модем в связке с STM32F030, на модеме включен режим ppp. Со стороны МК, в свою очередь, крутится lwip.

Функция настройки PPP в lwip:
Код
void  lwip_start(void)
{
  tcpip_init( NULL, NULL );             /*Инициализация стека tcp/ip*/
  
  
  /*Create a new PPPoS interface*/
  ppp = pppapi_pppos_create(&ppp_netif,
       output_cb, status_cb, 0);
  
  ppp_set_default(ppp);
  
  
  err_t err = pppapi_connect(ppp,0);
  if (err == ERR_ALREADY)
  {
    printf("Connected successfully");
  }
  
  sys_thread_new("tcp_thread1", tcp_thread, NULL, 256, osPriorityNormal );  //задача tcp
  printf("Configuration end");
  
}


В задаче tcp_thread я ожидаю соединение

Код
static void tcp_thread(void *arg)
{
  struct netconn *conn, *newconn;
  err_t err, accept_err;
  
  while (1)
  {
    conn = netconn_new(NETCONN_TCP);
    if(conn)
    {
      err = netconn_bind(conn, IP_ADDR_ANY, 4111);
      if (err != NULL)
      {
        netconn_listen(conn);
        
        DEBUG_MSG("netconn_accept....\n");
        osDelay(5);
        
        while(1)
        {
          accept_err = netconn_accept(conn, &newconn);
          if (accept_err == ERR_OK)
          {
            DEBUG_MSG("connection established \n");
            HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0);
          }
        }        
      }
    }    
  }
}


Но когда с пк я пытаюсь установить соединение (использую hercules), в ответ приходят rst. Из netconn_accept, соответственно, не выходит. В чем проблема, не могу понять, буду очень благодарен, если кто-нибудь наставит на путь истинный.

P.S.
Данные пихаю в стек в отдельной задаче, используя функцию pppos_input_tcpip

Код
void uart_rxTask(void const * argument)
{
  uint8_t u8=0, cnt=0, answer=0;
  uint8_t uart_buff[128]={0};
  Sim8xFlag_t SimFlag;
  
  
  for (;;)
  {
    if (pdPASS == xQueueReceive(xQueue_Uart, &u8, 1000/portTICK_RATE_MS))
    {
      if (PPP_Connect)
      {
        pppos_input_tcpip(ppp, &u8, 1);
        
        osDelay(1);
      }else /*Работа с AT-командами*/
      {
          //Разбор AT-команд
      }
    }
  }
}







Go to the top of the page
 
+Quote Post
bzx
сообщение Sep 24 2018, 08:53
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 482
Регистрация: 5-07-05
Из: Санкт-Петербург
Пользователь №: 6 528



Цитата(Klapatun @ Sep 21 2018, 12:31) *
Но когда с пк я пытаюсь установить соединение (использую hercules), в ответ приходят rst. Из netconn_accept, соответственно, не выходит. В чем проблема, не могу понять, буду очень благодарен, если кто-нибудь наставит на путь истинный.


Сокет, скорее всего, не открыт.
Под дебагером посмотрите все tcp syn. Если PPP настроен корректно, то увидите Ваше входяшее соединение с ПК. Если нет, копайтесь в PPP. Если соединение есть и сокет не открыт, то tcp сформирует rst, что Вы и видите. Поэтому, проверьте в tcp_thread, сформирован ли сокет.


--------------------
Для связи email: info собака qbit.su
Go to the top of the page
 
+Quote Post
Klapatun
сообщение Sep 24 2018, 09:44
Сообщение #3





Группа: Участник
Сообщений: 5
Регистрация: 12-07-18
Из: Новосибирск
Пользователь №: 105 858



Цитата(bzx @ Sep 24 2018, 15:53) *
Сокет, скорее всего, не открыт.
Под дебагером посмотрите все tcp syn. Если PPP настроен корректно, то увидите Ваше входяшее соединение с ПК. Если нет, копайтесь в PPP. Если соединение есть и сокет не открыт, то tcp сформирует rst, что Вы и видите. Поэтому, проверьте в tcp_thread, сформирован ли сокет.


Да, спасибо, что подсказали, сокет и правда был закрыт.
После того, как переписал немного код (косяк был в if), соединение открылось, но в Wireshark началась какая-то вакханалия: после подтверждения обменом syn, модем решил не останавливаться на достигнутом и стал друг за другом слать клиенту syn и совершенно игнорировать отправленный в ответ ask, в итоге я заметил, что функция netconn_listen не возвращает положенный ERR_OK. Пока буду разбираться с этим, спасибо за помощь.
Go to the top of the page
 
+Quote Post
Klapatun
сообщение Sep 25 2018, 06:54
Сообщение #4





Группа: Участник
Сообщений: 5
Регистрация: 12-07-18
Из: Новосибирск
Пользователь №: 105 858



Сокет создается, netconn_listen возвращает ERR_OK и программа в задаче tcp_thread заходит в netconn_accept и ожидает сообщение от mbox. Как я понимаю, данное сообщение должно появится при подключении, но когда я пытаюсь с пк установить соединение с модемом, повторяется та же история, о которой я писал выше: сервер клинит и на syn от клиента от начинает бесконечно повторять свой ответный syn+ack, что я вижу в wireshark. Может, кто-нибудь знает из-за чего вообще может быть такая реакция?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th April 2024 - 04:07
Рейтинг@Mail.ru


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