День добрый!
Имеется 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