Автор: Klapatun Sep 21 2018, 09:31
Доброго времени суток!
Имеется 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-команд
}
}
}
}
Автор: bzx Sep 24 2018, 08:53
Цитата(Klapatun @ Sep 21 2018, 12:31)
Но когда с пк я пытаюсь установить соединение (использую hercules), в ответ приходят rst. Из netconn_accept, соответственно, не выходит. В чем проблема, не могу понять, буду очень благодарен, если кто-нибудь наставит на путь истинный.
Сокет, скорее всего, не открыт.
Под дебагером посмотрите все tcp syn. Если PPP настроен корректно, то увидите Ваше входяшее соединение с ПК. Если нет, копайтесь в PPP. Если соединение есть и сокет не открыт, то tcp сформирует rst, что Вы и видите. Поэтому, проверьте в tcp_thread, сформирован ли сокет.
Автор: Klapatun Sep 24 2018, 09:44
Цитата(bzx @ Sep 24 2018, 15:53)
Сокет, скорее всего, не открыт.
Под дебагером посмотрите все tcp syn. Если PPP настроен корректно, то увидите Ваше входяшее соединение с ПК. Если нет, копайтесь в PPP. Если соединение есть и сокет не открыт, то tcp сформирует rst, что Вы и видите. Поэтому, проверьте в tcp_thread, сформирован ли сокет.
Да, спасибо, что подсказали, сокет и правда был закрыт.
После того, как переписал немного код (косяк был в if), соединение открылось, но в Wireshark началась какая-то вакханалия: после подтверждения обменом syn, модем решил не останавливаться на достигнутом и стал друг за другом слать клиенту syn и совершенно игнорировать отправленный в ответ ask, в итоге я заметил, что функция
netconn_listen не возвращает положенный
ERR_OK. Пока буду разбираться с этим, спасибо за помощь.
Автор: Klapatun Sep 25 2018, 06:54
Сокет создается, netconn_listen возвращает ERR_OK и программа в задаче tcp_thread заходит в netconn_accept и ожидает сообщение от mbox. Как я понимаю, данное сообщение должно появится при подключении, но когда я пытаюсь с пк установить соединение с модемом, повторяется та же история, о которой я писал выше: сервер клинит и на syn от клиента от начинает бесконечно повторять свой ответный syn+ack, что я вижу в wireshark. Может, кто-нибудь знает из-за чего вообще может быть такая реакция?