2014-10-04 192 views
6

如果问题不相关,请移动/关闭此功能。如何使用lwIP协议栈发送简单的HTTP请求?

核心:的Cortex-M4

微处理器:TI TM4C1294NCPDT。

IP协议栈:lwIP的1.4.1

我使用这个微处理器做一些数据记录,我想通过在形式的HTTP请求发送一些信息到一个单独的Web服务器:

http://123.456.789.012:8800/process.php?data1=foo&data2=bar&time=1234568789

我希望处理器能够看到响应头(即,如果它是200 OK或出错了) - 它不必显示/接收实际内容。

lwIP有一个微处理器的http服务器,但我是在相反的(微处理器是客户端)。

我不确定数据包如何与请求/响应头相关,所以我不确定我是如何实际发送/接收信息的。

回答

12

这最终实现起来很简单,忘记了更新这个问题。

我几乎遵循this网站上的说明,这是Raw/TCP'文档'。

基本上,HTTP请求使用TCP数据包进行编码,所以要发送数据到我的PHP服务器,我使用TCP数据包发送了一个HTTP请求(lwIP完成所有工作)。

的HTTP数据包我想发送看起来像这样:

HEAD /process.php?data1=12 & DATA2 = 5 HTTP/1.0

主机:mywebsite.com

要将其“翻译”为HTTP服务器可理解的文本,您必须在代码中添加“\ r \ n”回车/换行符。所以它看起来像这样:

char *string = "HEAD /process.php?data1=12&data2=5 HTTP/1.0\r\nHost: mywebsite.com\r\n\r\n "; 

注意,最终有两个批次的“\ r \ n”个

您可以使用GET或HEAD,而是因为我没有在意HTML网站我的PHP服务器返回,我使用HEAD(成功时返回200 OK,或失败时返回不同的代码)。

lwIP raw/tcp适用于回调。您基本上设置了所有的回调函数,然后将想要的数据推送到TCP缓冲区(在本例中为上面指定的TCP字符串),然后告诉lwIP发送数据包。

功能来建立一个TCP连接(此功能直接由我的应用程序要发送一个TCP数据包每次叫):

void tcp_setup(void) 
{ 
    uint32_t data = 0xdeadbeef; 

    /* create an ip */ 
    struct ip_addr ip; 
    IP4_ADDR(&ip, 110,777,888,999); //IP of my PHP server 

    /* create the control block */ 
    testpcb = tcp_new(); //testpcb is a global struct tcp_pcb 
          // as defined by lwIP 


    /* dummy data to pass to callbacks*/ 

    tcp_arg(testpcb, &data); 

    /* register callbacks with the pcb */ 

    tcp_err(testpcb, tcpErrorHandler); 
    tcp_recv(testpcb, tcpRecvCallback); 
    tcp_sent(testpcb, tcpSendCallback); 

    /* now connect */ 
    tcp_connect(testpcb, &ip, 80, connectCallback); 

} 

一旦我的PHP服务器建立连接,在“ connectCallback”功能由lwIP的称为:

/* connection established callback, err is unused and only return 0 */ 
err_t connectCallback(void *arg, struct tcp_pcb *tpcb, err_t err) 
{ 
    UARTprintf("Connection Established.\n"); 
    UARTprintf("Now sending a packet\n"); 
    tcp_send_packet(); 
    return 0; 
} 

该函数调用的实际功能tcp_send_packet()发送该HTTP请求,如下所示:

uint32_t tcp_send_packet(void) 
{ 
    char *string = "HEAD /process.php?data1=12&data2=5 HTTP/1.0\r\nHost: mywebsite.com\r\n\r\n "; 
    uint32_t len = strlen(string); 

    /* push to buffer */ 
     error = tcp_write(testpcb, string, strlen(string), TCP_WRITE_FLAG_COPY); 

    if (error) { 
     UARTprintf("ERROR: Code: %d (tcp_send_packet :: tcp_write)\n", error); 
     return 1; 
    } 

    /* now send */ 
    error = tcp_output(testpcb); 
    if (error) { 
     UARTprintf("ERROR: Code: %d (tcp_send_packet :: tcp_output)\n", error); 
     return 1; 
    } 
    return 0; 
} 

一旦发送了TCP数据包(如果你希望“希望最好”并且不关心数据是否真的发送),PHP服务器返回一个TCP数据包(200 OK等)和HTML代码(如果您使用GET而不是HEAD)。该代码可以在以下代码中读取和验证:

err_t tcpRecvCallback(void *arg, struct tcp_pcb *tpcb, struct pbuf *p, err_t err) 
{ 
    UARTprintf("Data recieved.\n"); 
    if (p == NULL) { 
     UARTprintf("The remote host closed the connection.\n"); 
     UARTprintf("Now I'm closing the connection.\n"); 
     tcp_close_con(); 
     return ERR_ABRT; 
    } else { 
     UARTprintf("Number of pbufs %d\n", pbuf_clen(p)); 
     UARTprintf("Contents of pbuf %s\n", (char *)p->payload); 
    } 

    return 0; 
} 

p-> payload包含实际的“200 OK”等信息。希望这有助于某人。

我在上面的代码中省略了一些错误检查以简化答案。

0

查看维基百科的HTTP example。客户端将发送GET和HOST行。服务器将响应许多行来做出响应。第一行将有响应代码。

+0

是的,我看了很多次。我在通过lwIP库进行更具体的回答之后。我想我已经通过raw/tcp api几乎找出了它 - 将很快对它进行测试。 – tgun926 2014-10-06 21:47:31