1

这个问题将相当笼统,因为我什至还没有开始编码,只是想知道是否可以使用 lwIP 实现我想要的。

我想要的是让我的嵌入式 STM32F769I-Disco 板调用网站 URL API,例如http://test.com/items/1,它返回 JSON,然后我想对其进行解析。

由于 lwIP 实现了 TCP/IP 堆栈,理论上这应该是可能的,还是我弄错了?

我还没有真正找到任何可以做到这一点的例子,或者我什至不知道如何搜索它。有什么有用的指示吗?

问题也是,我是否应该使用套接字连接而不是尝试调用 API url?如果我决定使用 nanopb 之类的东西,我还需要 lwIP,还是可以不用它?

4

2 回答 2

6

无论涉及从服务器检索数据都涉及使用 TCP 或 UDP,因此它不仅“理论上可行”,而且是浏览器从 Web 服务器接收数据的实际方式:通过打开与服务器端口 80 的 TCP/IP 连接。

UDP 不适合从服务器接收数据,因为它是无连接的,并且不能保证数据包会按顺序接收,或者根本不会接收。使用 TCP,它是“全有或全无” - 要么您将按顺序接收所有数据包,要么当发送方的缓冲区充满未确认的数据包时,套接字将在某个时刻关闭。

所以 HTTP 将使用 TCP/IP,这是肯定的,您需要执行几个步骤:

  1. 使用 lwip 为您的www.test.com网站创建 DNS 查找。
  2. 使用 lwip 打开到 IP 地址的 TCP/IP 连接,可能是端口 80。
  3. recv回调函数(以及其他)附加到 lwip,每当收到数据包时,Lwip 都会调用该回调函数。您还想知道在对话期间套接字是否关闭,因此请确保注册所有回调。
  4. 向端口 80发送HTTP 请求字符串。您基本上是在向打开的 TCP 套接字发送字符串。这可能很简单:

    GET /items/1 HTTP/1.1
    Host: www.test.com
    <crlf>
    

    最后<crlf>是一个空行,它标志着HTTP请求的结束。

  5. 您的recv函数将接受来自服务器的传入数据包,并将它们写入 FIFO 缓冲区以进行进一步处理。无法保证您会在一个数据包中获得整个 HTTP 响应,因此不要期望一次性处理它们,除非有效负载非常短,中间没有代理,而且您总体上感觉很幸运。

  6. 因此,您将需要在传入数据到达时对其进行解析。HTTP 标头之一将为您提供整个响应的长度,或者您将需要处理分块编码。这是您可能从服务器获得的响应示例(在一个或多个 TCP 数据包中):

    HTTP/1.1 200 OK
    Date: Mon, 23 Aug 2017 22:38:34 GMT
    Content-Type: text/html; charset=UTF-8
    Content-Encoding: UTF-8
    Content-Length: 18
    
    { 
        "value":5, 
        "something_else": [0, 1, 2] 
    }
    

    请注意标头和有效负载开始之间的空换行符。

  7. 一旦您解析了所有标头并获得 JSON,那么您可能会使用现有的 C 库来解析 JSON,这也可能需要一些工作才能理解。从开发的角度来看,用 Protocol Buffers 替换最后一步可能是一个明智的想法(C 端的工作可能更少),但该协议的可移植性不如 JSON(尽管肯定更小)。

于 2017-08-25T21:35:56.850 回答
1

从浏览 ST 网站看来,如果您愿意花一些时间来了解该平台,那么您的要求绝对是可能的。ST 似乎发布了一个支持您的平台的软件开发堆栈,称为STM32CubeF7。如果您向下滚动该链接到“用户手册”部分,您将看到“ UM1713:使用 lwIP TCP/IP 堆栈在 STM32Cube 上开发应用程序”,这听起来与您所要求的完全一样。

退后一步,正如您在问题中提到的那样,REST-ful 网站 API 通常实现为支持各种操作(GET、POST 等)的 HTTP URL。然而,HTTP 位于协议栈中的 TCP/IP 之上,并使用 TCP/IP 连接将数据传输到远程端点或从远程端点传输数据。lwIP 似乎没有提供 HTTP 客户端,因此您需要使用另一个库,但是有很多 GitHub 项目可以做到这一点。我最近写了一篇关于在 C++ 中实现一个简单的 HTTP 客户端的博客文章和代码广播,它可能会提供一些见解并帮助劝阻你不要自己动手。

在您的最后一段中,当谈到“套接字”时,人们通常指的是 TCP/IP(或 UDP/IP)套接字,所以是的,您仍然需要 lwIP。在这种情况下,Nanopb 只会替换 HTTP。

于 2017-08-25T16:19:08.687 回答