ESP32 HTTP 使用入门

1. 环境准备

可以先了解如下知识:

  • HTTP 请求方式 GET 和 post 区别

    URL 描述一个网络上的资源,而 GET,POST,PUT,DELETE 就对应着对这个资源的 查,改,增,删 4 个操作。

    • GET 用于从服务器上获取数据信息
    • POST 用于向服务器传送数据信息
      • POST 请求方式 ---- 主要特点是把请求数据放在 body
        • x-www-form-urlencoded:就是 application/x-www-from-urlencoded,会将表单内的数据转换为键值对
        • raw: 可以通过 raw 进行传输 txt,json xml,html 的数据
        • form-data:对应于 Content-Type 的 multipart/form-data 类型,既可以发送键值对也可以进行文件参数传递。
        • binary:用来发送文件内容请求。
  • 响应状态码类别

    • 1xx 指示信息 – 表示请求已接收,继续处理
    • 2xx 成功 – 表示请求已被成功接收、理解、接受
    • 3xx 重定向 – 信息不完整需要进一步补充
    • 4xx 客户端错误 – 请求有语法错误或请求无法实现
    • 5xx 服务器端错误 – 服务器未能实现合法的请求

常用看到的状态码:

  • 200 - 请求成功,已经正常处理完毕
  • 404 - 客户端请求的 URL 在服务端不存在
  • 502 - 服务器内部错误,无法完成请求

对于详细的文档说明:

2. ESP32 demo 验证

使用 esp-idf/examples/protocols/esp_http_client 下的例程来进行测试。

void app_main(void)
{
    esp_err_t ret = nvs_flash_init();
    if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) {
      ESP_ERROR_CHECK(nvs_flash_erase());
      ret = nvs_flash_init();
    }
    ESP_ERROR_CHECK(ret);
    ESP_ERROR_CHECK(esp_netif_init());
    ESP_ERROR_CHECK(esp_event_loop_create_default());

    /* This helper function configures Wi-Fi or Ethernet, as selected in menuconfig.
     * Read "Establishing Wi-Fi or Ethernet Connection" section in
     * examples/protocols/README.md for more information about this function.
     */
    ESP_ERROR_CHECK(example_connect());
    ESP_LOGI(TAG, "Connected to AP, begin http example");

    xTaskCreate(&http_test_task, "http_test_task", 8192, NULL, 5, NULL);
}
static void http_test_task(void *pvParameters)
{
    http_rest_with_url();
    ESP_LOGI(TAG, "Finish http example");
    vTaskDelete(NULL);
}
static void http_rest_with_url(void)
{
    char local_response_buffer[MAX_HTTP_OUTPUT_BUFFER] = {0};
    /**
     * NOTE: All the configuration parameters for http_client must be spefied either in URL or as host and path parameters.
     * If host and path parameters are not set, query parameter will be ignored. In such cases,
     * query parameter should be specified in URL.
     *
     * If URL as well as host and path parameters are specified, values of host and path will be considered.
     */
    esp_http_client_config_t config = {
        .host = "httpbin.org",
        .path = "/get",
        // .query = "esp",
        .event_handler = _http_event_handler,
        .user_data = local_response_buffer,        // Pass address of local buffer to get response
        .disable_auto_redirect = true,
    };
    esp_http_client_handle_t client = esp_http_client_init(&config);

    // GET
    esp_err_t err = esp_http_client_perform(client);
    if (err == ESP_OK) {
        ESP_LOGI(TAG, "HTTP GET Status = %d, content_length = %d",
                esp_http_client_get_status_code(client),
                esp_http_client_get_content_length(client));
    } else {
        ESP_LOGE(TAG, "HTTP GET request failed: %s", esp_err_to_name(err));
    }
    ESP_LOG_BUFFER_HEX(TAG, local_response_buffer, strlen(local_response_buffer));

    char *buffer = malloc(MAX_HTTP_RECV_BUFFER + 1);
    if (buffer == NULL) {
        ESP_LOGE(TAG, "Cannot malloc http receive buffer");
        return;
    }

    if ((err = esp_http_client_open(client, 0)) != ESP_OK) {
        ESP_LOGE(TAG, "Failed to open HTTP connection: %s", esp_err_to_name(err));
        free(buffer);
        return;
    }
    int content_length =  esp_http_client_fetch_headers(client);
    int total_read_len = 0, read_len;
    if (total_read_len < content_length && content_length <= MAX_HTTP_RECV_BUFFER) {
        read_len = esp_http_client_read(client, buffer, content_length);
        if (read_len <= 0) {
            ESP_LOGE(TAG, "Error read data");
        }
        buffer[read_len] = 0;
        ESP_LOGI(TAG, "read_len = %d,data: %.*s", read_len,read_len,buffer);
    }

    // POST
    const char *post_data = "{\"field1\":\"value1\"}";
    esp_http_client_set_url(client, "http://httpbin.org/post");
    esp_http_client_set_method(client, HTTP_METHOD_POST);
    esp_http_client_set_header(client, "Content-Type", "application/json");
    esp_http_client_set_post_field(client, post_data, strlen(post_data));
    err = esp_http_client_perform(client);
    if (err == ESP_OK) {
        char *buffer1 = malloc(MAX_HTTP_RECV_BUFFER + 1);
        esp_http_client_get_post_field(client, &buffer1);
        ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d, buffer1: %s", 
                esp_http_client_get_status_code(client),
                esp_http_client_get_content_length(client), buffer1);
    } else {
        ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
    }

可以通过获取到 GET 请求数据格式,打印出来。如下截图所示:
请添加图片描述

3. 注意事项:

  1. 网址 URL 重定向

    请添加图片描述

    这是因为 esp 无法像 Web 浏览器一样自动重定向 URL。
    最可能的解释是 Web 服务器没有发送 .bin 文件,而是发送了其他内容。应用程序映像 .bin 文件的第一个字节应为 0xE9。该错误表明该文件的第一个字符 0x3CASCII “<”,并暗示服务器正在发送 HTML 页面而不是 .bin 文件。

    您可以尝试将相同的 URL 放入命令行上的 curl 等工具中并以这种方式下载,看看 .bin 文件是否已下载或是否为其他内容(如错误页面、登录页面或重定向页面))。
    请添加图片描述

    请添加图片描述

  2. 如果一直没有办法成功获取到 http server 的正确响应。此时就需要具体通过 postman 或者 postJson 工具具体查看一下 set_header 设置头组装的是否正确,是否是按照服务器端的标准头格式发送的数据。
    如果还是查不出问题所在,就需要通过抓包卡(wireshark 等)来具体查看 http 包,查看具体是设备端没有发送正确的格式还是服务端没有响应。

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嗨!对于入门学习Arduino ESP32,我可以给你一些基本的指导。ESP32是一款功能强大的开发板,支持无线通信和互联网连接,适合物联网项目。 首先,你需要准备以下材料: 1. Arduino ESP32开发板 2. USB数据线 3. 电脑(Windows、Mac或Linux) 接下来,按照以下步骤进行入门学习: 1. 安装Arduino IDE:访问Arduino官方网站,下载并安装Arduino IDE(集成开发环境)软件。根据你的操作系统选择正确的版本。 2. 连接ESP32开发板:使用USB数据线将ESP32开发板连接到电脑上。确保选择了正确的端口和开发板类型。 3. 安装ESP32开发工具:打开Arduino IDE,点击“文件”> “首选项”,在“附加开发板管理器URL”中输入以下网址:https://dl.espressif.com/dl/package_esp32_index.json。然后点击“确认”。 4. 安装ESP32开发板支持:点击“工具”> “开发板”> “开发板管理器”,在搜索栏中搜索“ESP32”。选择“ESP32 by Espressif Systems”并点击“安装”。 5. 选择开发板和端口:点击“工具”> “开发板”,从列表中选择“ESP32 Dev Module”。然后点击“工具”> “端口”,选择正确的USB端口。 6. 上传示例代码:点击“文件”> “示例”> “ESP32”来浏览ESP32的示例代码。选择一个感兴趣的示例并打开。然后点击“上传”按钮将代码上传到开发板。 7. 查看串口输出:点击“工具”> “串口监视器”,选择适当的波特率和换行选项,以查看开发板的串口输出。你可以在代码中添加Serial.print语句来输出调试信息。 这些是入门学习Arduino ESP32的基本步骤。通过尝试不同的示例和项目,你可以更深入地了解和利用ESP32的功能。祝你学习愉快!如有任何问题,随时问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值