ESP-IDF HTTP POST请求发送音频-启明云端乐鑫代理商

ESP32 HTTP POST请求发送音频

ESP32中 有 HTTP 相关的请求 demo,但是 demo 中只是简单的 HTTP headers 加上 body。如果服务器对 POST 请求有要求,比如数据以 key-value 的形式传输,那么服务器会无法正常处理请求。

POST请求

什么是 POST

POST 是 HTTP 的请求方法 ,主要用于向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。

Post请求一般由请求行请求头请求体组成。下面列举一段简单的 post 请求数据,并加以说明。

http 复制代码
POST /api/v1/resource HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 56

{
    "name": "John Doe",
    "email": "john.doe@example.com"
}
http 复制代码
POST /api/v1/resource HTTP/1.1

#这一部分是请求行,包含了请求的类型(POST)、请求的路径(/api/v1/resource)以及使用的 HTTP 协议版本(HTTP/1.1)。
http 复制代码
Host: example.com
Content-Type: application/json
Content-Length: 56

#这一部分是请求头,提供了关于请求的附加信息。包括目标主机(Host)、内容类型(Content-Type)和请求体的长度(Content-Length)。

注意:请求头和请求体中间有个空行!

http 复制代码
{
    "name": "John Doe",
    "email": "john.doe@example.com"
}

#这一部分是请求的主体部分,包含了要发送的数据(在这个例子中是JSON格式的用户信息)。

POST请求发送音频

通过 postman 工具,在获取请求的数据内容后,把请求行、请求头、请求体拼接。

其中,需要传输的音频通过 [spiffs 文件](SPIFFS 文件系统 - ESP32 - --- ESP-IDF 编程指南 latest 文档)系统读写,

c 复制代码
void http_send_mp3(){
    //读取音频文件
    //...
    long file_size = ftell(file);
    char *file_content = malloc(file_size);
    //file_content 是获取的音频数据, file_size 是音频数据的长度
    fread(file_content, 1, file_size, file);
    //...
    
    esp_http_client_config_t config = {
        .url = POST_URL,
        .event_handler = http_event_handler,
        .method = HTTP_METHOD_POST,
    };
    esp_http_client_handle_t client = esp_http_client_init(&config);
    
     char *post_data = malloc(file_size + 512);
    memset(post_data, 0, file_size + 512);
    memcpy(post_data, "------WebKitFormBoundary7MA4YWxkTrZu0gW\r\nContent-Disposition: form-data; name=\"file\"; filename=\"test.mp3\"\r\nContent-Type: audio/mpeg\r\n\r\n", 135);
    memcpy(post_data + 135, file_content, file_size);
    memcpy(post_data + 135 + file_size, "\r\n------WebKitFormBoundary7MA4YWxkTrZu0gW--\r\n", 45);

    esp_http_client_set_post_field(client, post_data, 180 + file_size);
    esp_err_t err = esp_http_client_perform(client);
    esp_http_client_cleanup(client);
	}
}

//name="file",file即为服务器需要post请求携带的key。

确保拼接的格式与 postman 中的报文一致,如遇服务器无法正常处理的现象,可以用 wireshark 或者其他抓包软件抓包,看看 esp32 发送的 POST 报文 body 中的数据格式跟用 POSTMAN 发送的报文一致。

参考链接

https://github.com/espressif/esp-idf/tree/master/examples/protocols/esp_http_client

https://docs.espressif.com/projects/esp-idf/zh_CN/latest/esp32/api-reference/protocols/esp_http_server.html#http

相关推荐
REDcker3 天前
WebCodecs VideoDecoder 的 hardwareAcceleration 使用
前端·音视频·实时音视频·直播·webcodecs·videodecoder
gihigo19983 天前
基于TCP协议实现视频采集与通信
网络协议·tcp/ip·音视频
无人装备硬件开发爱好者3 天前
硬核技术解析|MCP 协议实现语音 AI 与 ESP32 软 / 硬件的标准化对接:从火山引擎豆包认证到全链路落地——中
人工智能·esp32·火山引擎·mcp
古译汉书3 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
山河君3 天前
四麦克风声源定位实战:基于 GCC-PHAT + 最小二乘法实现 DOA
算法·音视频·语音识别·信号处理·最小二乘法·tdoa
无人装备硬件开发爱好者3 天前
硬核技术解析|MCP 协议实现语音 AI 与 ESP32 软 / 硬件的标准化对接:从火山引擎豆包认证到全链路落地——上
人工智能·esp32·火山引擎·mcp
音视频牛哥3 天前
Android平台RTMP/RTSP超低延迟直播播放器开发详解——基于SmartMediaKit深度实践
android·人工智能·计算机视觉·音视频·rtmp播放器·安卓rtmp播放器·rtmp直播播放器
qq_416276423 天前
通用音频表征的对比学习
学习·音视频
美狐美颜sdk3 天前
Android全局美颜sdk实现方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美狐美颜sdk
EasyDSS3 天前
私有化部署EasyDSS视频点播能力:全链路视频技术赋能,打造企业级视听新体验
音视频·hls·m3u8·点播技术·智能转码