Jump to content

    

Klapatun

Участник
  • Content Count

    5
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Klapatun

  • Birthday 06/17/1997

Информация

  • Город
    Array

Recent Profile Visitors

253 profile views
  1. Сокет создается, netconn_listen возвращает ERR_OK и программа в задаче tcp_thread заходит в netconn_accept и ожидает сообщение от mbox. Как я понимаю, данное сообщение должно появится при подключении, но когда я пытаюсь с пк установить соединение с модемом, повторяется та же история, о которой я писал выше: сервер клинит и на syn от клиента от начинает бесконечно повторять свой ответный syn+ack, что я вижу в wireshark. Может, кто-нибудь знает из-за чего вообще может быть такая реакция?
  2. Да, спасибо, что подсказали, сокет и правда был закрыт. После того, как переписал немного код (косяк был в if), соединение открылось, но в Wireshark началась какая-то вакханалия: после подтверждения обменом syn, модем решил не останавливаться на достигнутом и стал друг за другом слать клиенту syn и совершенно игнорировать отправленный в ответ ask, в итоге я заметил, что функция netconn_listen не возвращает положенный ERR_OK. Пока буду разбираться с этим, спасибо за помощь.
  3. Доброго времени суток! Имеется 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-команд } } } }
  4. Попробовал ваш вариант, но у меня на функции "pppapi_set_default(ppp);" в "tcpip_api_call" застревает программа при разблокировки ядра TCPIP в "UNLOCK_TCPIP_CORE();". Согласно документации достаточно только включить #include "pppapi.h" и поставить LWIP_PPP_API 1, что я и сделал, но появившаяся проблема вводит меня в ступор и понять ее причину я не могу. Может, я как-то совсем не так настраиваю lwip и причину надо искать где-нибудь в заголовочных файлах? Так же заметил, что status_cb в принципе не вызывается. Нашел подобную проблему на stack overflow, но там не было ответов на этот вопрос ответа не было.
  5. Доброго времени суток! Имеется sim-карта со статическим IP и модем SIM800C, который через UART соединен с STM32F0. Пытаюсь обойтись без встроенного в модем стека, чтобы обеспечить себе беззаботную жизнь, когда придет нужда менять модем, для этого в качестве внешнего стека юзаю lwip. Видел на хабре статью про это дело, которая, собственно, и являлась отправной точкой, было решено повторить подвиг, но в версии lwip 2.0.3, которой я пользуюсь, ppp немного изменился и это все хорошо описано в документации (ppp.txt, прикреплю его ниже). Следуя инструкциям из упомянутого файла, реализовал все функции, которые надо реализовать и все заработало.... почти. Когда модем начал общаться с контроллером, дальше фазы LCP дело не зашло. Как я понял из документа (ppp_connect.pdf), который оказался у меня уже-и-не-помню-откуда, после конфигурирования параметров соединения в фазе 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, но после подтверждения контроллером запроса опций, наступает тишина. Интуиция мне говорит, что у меня какой-то косяк в настройках ppp в lwip, но неопытность в этом вопросе мешает понять, где именно и что именно я делаю не так В интернете мне удалось найти довольно мало исчерпывающей информации и примеров по связке stm32+lwip+ppp (не исключаю, что это просто я искать не умею, если поделитесь ссылками на полезные ресурсы, буду очень признателен), если кто-нибудь занимался подобным или сталкивался с похожей проблемой, буду ноги целовать очень благодарен за помощь и за пинки в нужном направлении. ppp.txt ppp_connect.pdf