1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
| #include "esp_err.h"
#include "esp_log.h"
#include "esp_http_server.h"
static const char *TAG = "httpd";
static esp_err_t priv_uri_index_handle(httpd_req_t *req);
/* http server 服务器句柄 */
static httpd_handle_t s_httpd_handle = NULL;
static const httpd_uri_t s_index_uri = {
.uri = "/index", /* uri 是 "/index" */
.method = HTTP_GET, /* uri 仅支持 GET 方法 */
.handler = priv_uri_index_handle, /* uri 的回调函数 */
.user_ctx = NULL, /* 用户上下文 */
};
static esp_err_t priv_uri_index_handle(httpd_req_t *req)
{
esp_err_t err = ESP_OK;
/* 传入的 uri,这里打印的是 /uri */
ESP_LOGI(TAG, "uri: %s", req->uri);
/* 触发该 uri 回调的方法, 这里打印的是 HTTP_GET */
ESP_LOGI(TAG, "method: %d", req->method);
/* 此时 HTTP 服务器已经收到了 HTTP Header, 这里尝试接收 HTTP Body */
int ret = 0;
char recv_buf[4096] = {0};
ret = httpd_req_recv(req, recv_buf, 4096);
if (ret <= 0) {
return ESP_FAIL;
}
/* 处理 recv_buf */
...
/* 配置响应的状态码 */
httpd_resp_set_status(req, HTTPD_200);
/* 配置响应的数据类型 */
httpd_resp_set_type(req, "application/json");
/* 发送 HTTP 响应 */
char *send_buf = "{\"code\": 0}"
err = httpd_resp_send(req, send_buf, strlen(send_buf));
if (err != ESP_OK) {
return ESP_FAIL;
}
/* 当返回值不是 ESP_OK 时, httpd 会自动断开当前的连接 */
return ESP_OK;
}
int httpd_init(void)
{
esp_err_t err = ESP_OK;
/* http 服务器配置初始化 */
httpd_config_t config = HTTPD_DEFAULT_CONFIG();
/* http 服务器配置 */
config.lru_purge_enable = true; /* 开启 LRU 功能 */
config.max_uri_handlers = 15; /* 支持 uri 的数量上限是 15 */
config.server_port = 80 /* 端口号是 80 */
config.stack_size = 20 * 1024; /* http 服务区任务的栈空间是 20 KB */
/* 启动 HTTP 服务器 */
err = httpd_start(&s_httpd_handle, &config);
if (err != ESP_OK) {
ESP_LOGE(TAG, "start http server failed: %s", esp_err_to_name(err));
return -1;
}
/* 注册 URI: http://<local_host>/index */
err = httpd_register_uri_handler(s_httpd_handle, &s_index_uri);
if (err != ESP_OK) {
ESP_LOGE(TAG, "register http uri failed: %s", esp_err_to_name(err));
}
return 0;
}
|