【问题标题】:Static IP for Telit GL865 GSM module via LWiP PPPoS by using STM32F7Telit GL865 GSM 模块的静态 IP 通过 LWiP PPPoS 使用 STM32F7
【发布时间】:2018-10-18 10:55:08
【问题描述】:

我正在使用带有开发板 Nucleo-F746ZG 的 STM32F7。 我已经激活了 UART、LWIP 中间件及其对 PPPoS 的支持。

我可以让STM32F7和Telit GL865 GSM调制解调器通过UART使用AT命令进行通信,(即)让调制解调器建立其SIM卡的静态IP并检查ping,一切正常。

但是,我希望 LWiP PPPoS 在发送 ATD*99***1# 之后建立静态 IP 而不是 AT 命令。

我在网上进行了深入搜索,找不到包含 LWiP PPPoS Server for STM32F 与 Telit GL865 GSM 通信的特定示例。我见过像

这样的代码
sio_fd_t ppp_sio = sio_open(sio_idx);

但是,我无法将它们与 STM32 立方体函数联系起来。

我见过使用pppInit(void)pppOverSerialOpen(PPP_SERIAL_PORT, linkStatusCB, &connected) 函数的示例,但我猜当前堆栈不支持这些命令。

是否有人将 STM CUBE 的 uart 句柄与 LWiP 堆栈的 PPPoS 联系起来?您是否有任何初始化大纲或建议可以开始并继续获取静态 IP? (即INITDISCONNECTINGDISCONNECTEDCONNECTINGCONNECTEDLWIP 循环)

亲切的问候

【问题讨论】:

    标签: stm32 gsm uart lwip ppp


    【解决方案1】:

    Sio 是“Serial IO”接口层,由特定端口(特定平台)实现。实施后,TCP/IP 堆栈会处理其余部分,包括 PPP 协商和配置(LCP/IPCP 等),其中包括获取 IP 地址(自己的 IP、网关、网络掩码、dns1、dns2)。因此,您需要做的就是实现通过 UART 读取和写入数据的低级函数。处理 PPP 的责任在 TCP/IP 堆栈的一端。

    虽然我没有 STM32 的确切实现,但自己实现应该很容易。它的实现方式可能(或可能不)取决于您自己的配置,例如无论您是否使用 FreeRTOS 以及它的队列/互斥锁来处理 UART 通信。对于所有组件通常如何在与 PPP 相关的 TCP/IP 堆栈中分层的总体描述 - 我前段时间在这里给出了答案:STM32 LWIP PPPos implementation

    说到 LwIP 的 sio 层,可以在这里找到一个相当不错的文档:http://lwip.wikia.com/wiki/PPP。常见的lwip/src/include/lwip/sio.h 头文件中也很好地描述了函数的行为方式。

    一个示例 UNIX 实现,如果您觉得它有用,可以在这里找到:https://github.com/dreamcat4/lwip/blob/master/contrib/ports/unix/netif/sio.c

    【讨论】:

    • 先生,首先非常感谢您的回复。我已经多次阅读您的其他答案并有了一个概念。我已经实现了 HAL_UART_Transmit_IT(&huart1, buffer, sizeof(buffer)),其中 huart 是我的 uart 句柄和包含命令的缓冲区,而 HAL_UART_Receive_IT(...) 用于基于中断的 uart 通信。我正在通过这些功能发送和接收 AT 命令。我们能否说这些函数是我需要并且已经实现的低级函数,或者,我应该如何与它们建立连接/关系,因为 sio_ 函数与 PPPoS 确实有?
    • 没错,这些确实是底层函数。请记住,当您执行ATD*99***1# 时,您将无法向调制解调器发送 AT 命令,因为它将通过此​​ uart 传输二进制 (PPP) 数据。从这一刻起,只有 IP 堆栈与调制解调器通信。数据表将其描述为您不再处于命令(AT 命令)模式。这在我使用过的所有调制解调器中都是通用的。要退出此模式,请执行以下操作之一:1. 重新启动调制解调器或 2. 使用 PPP 断开连接退出 PPP 模式或 3. 使用转义序列“+++”(这不会关闭连接)。
    • 先生,在调用ATD*99***1#之后,是不是首先要应用下面的函数? ppp = pppos_create(&ppp_netif, ppp_output_cb, pppLinkStatusCallback, NULL); ppp_connect(ppp, 0);或者我是否还应该实现 sio_open() 函数来将我的 UART 句柄与 PPPoS 相关联?我找不到将我的 UART 与 PPP 联系起来的方法,而不是函数 sio_fd_t ppp_sio = sio_open(sio_idx);而且我不知道如何将 sio_open 与我的 uart 句柄联系起来。对我来说第二个未知数是,如何使用 PPP 命令而不是 AT 来告诉调制解调器有它的 IP。没有一个例子是我问太多的原因..
    • 据我所知,sio_open 仅在 UNIX 等系统上才有意义,您实际上需要打开端口。在 STM32 的情况下,如果您已经配置了 UART,则无需进行太多操作。至于sio_idx-这是tcp/ip栈理解的串口的索引。相同的索引总是映射到相同的 uart。如果你的 LwIP 的 SIO 只有一个 uart,那你完全不用担心这个参数。至于 IP 地址 - 您应该调用 ppp_connect 来告诉堆栈开始配置。您可以使用回调来获取信息。
    • 您看到此数据是因为您的调制解调器开始使用 PPP 进行通信(它不再通过 AT 命令进行通信)。然后你会看到NO CARRIER,因为你的终端没有响应,所以调制解调器离开了 PPP 模式。至于将接收到的数据转发到 TCP/IP 堆栈 - 如果您不使用任务(例如 RTOS),那么确实可以使用 pppos_input(pd, receiveBuffer, numReceivedBytes),如下所述:lwip.wikia.com/wiki/PPP
    猜你喜欢
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多