Http GET请求非阻塞Arduino

时间:2017-03-19 13:11:35

标签: arduino embedded esp8266

我正在创建一个人员计数器,只需简单计算房间内的输入/输出然后将其上传到我的数据库中,我使用Arduino MEGA2560和ESP8266作为我服务器的通信器。

但是当我在服务器上发送HTTP GET请求时遇到了麻烦。一旦我发送HTTP GET请求,我的计数器功能就不会工作,直到HTTP GET请求完成,只是想知道在Arduino中是否存在易于使用和支持的async函数,或者使用HTTP GET请求有正确的方法

这是我的代码:

void loop{
    counter(); // let's assume that this function is just counting in and out person in the room 
    // changing the value of variable count
    uint8_t buffer[1024] = {0};

    if (wifi.createTCP(HOST_NAME, HOST_PORT)) {
        Serial.print("create tcp ok\r\n");
    } else {
        Serial.print("create tcp err\r\n");
    }

    char hello[];
    strcpy(hello, "GET /vbus/insert.php?coount=");
    strcat(hello, count);
    strcat(hello," HTTP/1.1\r\nHost: www.test.com\r\nConnection:close\r\n\r\n");
    wifi.send((const uint8_t*)hello, strlen(hello));
    wifi.send((const uint8_t*)hello, strlen(hello));

    uint32_t len = wifi.recv(buffer, sizeof(buffer), 10000);
    if (len > 0) {
        Serial.print("Received:[");
        for(uint32_t i = 0; i < len; i++) {
            Serial.print((char)buffer[i]);
        }
        Serial.print("]\r\n");
    }
}

PS:我发送HTTP GET请求时没有任何问题,只是上面提到的那个。

2 个答案:

答案 0 :(得分:1)

这种串行库与您的自定义请求的灵活性相差甚远。当您使用ESP8266设备而非串行时,它上面有一个嵌入式软件来处理您的请求。那是固件。

如果你使用AT命令,它将无助于你的情况,因此它上面没有非阻塞的TCP实现来处理异步HTTP请求。

基于Arduino的ESP8266用户可以使用async TCP library解决方案,您可以在其中调整代码库,这是灵活性的好处。

答案 1 :(得分:0)

对于那些在2017年之后访问此帖子的人:

您可以在以下情况下使用此库:ESP8266AsyncHttpClient

它是使用ESPAsyncTCP库的ESP8266的异步HTTP客户端。

它是我写的,您只能发送请求,但仍无法取回响应以进行进一步处理。但是我将来会实施。