
一、HTTPS 不校验证书模式的实现
文档要求 "HTTPS(采用不校验证书的模式)",在代码中是通过 HTTPS 客户端配置 实现的:
c
运行
static void https_send_data(void)
{
if(https_client != NULL)
{
esp_http_client_close(https_client);
esp_http_client_cleanup(https_client);
https_client = NULL;
}
// 1. 配置HTTP客户端参数
esp_http_client_config_t config = {
.host =(char*)https_t.serverIP,
.path = "/api/pushrealData",
.method = HTTP_METHOD_POST,
.transport_type = HTTP_TRANSPORT_OVER_SSL, // 启用 SSL/TLS 加密(HTTPS)
.skip_cert_common_name_check = true, // 跳过证书通用名(CN)验证
// 未配置 .cert_pem,即不加载 CA 证书,不校验服务器证书
};
// 2. 初始化HTTP客户端
https_client = esp_http_client_init(&config);
// ...
}
- 核心配置 :
transport_type = HTTP_TRANSPORT_OVER_SSL:启用 HTTPS 加密传输。skip_cert_common_name_check = true:跳过对服务器证书的通用名字段验证。- 未配置
cert_pem:不加载任何 CA 根证书,完全不校验服务器证书,符合 "不校验证书的模式"。
二、/api/getinfo 接口的实现
文档要求 "支持通过 https GET 接口 URL: /api/getinfo 获取序列号、软件版本、硬件版本、刷新间隔",代码中通过 路由注册 + 处理函数 实现:
1. 路由注册
在 https_uri 数组中,定义了该接口的路由规则:
c
运行
static const httpd_uri_t https_uri[] = {
{.uri = "/api/getinfo", .method = HTTP_GET, .handler = info_handler},
// ... 其他接口
};
uri = "/api/getinfo":接口路径。method = HTTP_GET:仅接受 GET 请求。handler = info_handler:请求到达时,调用info_handler函数处理。
2. 处理函数 info_handler
c
运行
static esp_err_t info_handler(httpd_req_t *req)
{
if(!ValBit(dev_data[0].state,dev_sta_bit_line))
{
UTIL_LOG_E(TAG,"HTTPS get data error,wait.......");
return ESP_ERR_NOT_FOUND;
}
/*获取系统信息*/
char sn[30] = {0};
util_get_meter_sn(sn); // 获取设备序列号
cJSON *root = cJSON_CreateObject();
cJSON_AddItemToObject(root,"sn",cJSON_CreateString(sn)); // 添加序列号字段
char temp[10] = {0};
sprintf(temp,"%dV%d",SOFT_CODE,SOFT_VERSION);
cJSON_AddItemToObject(root,"sw",cJSON_CreateString(temp)); // 添加软件版本
cJSON_AddItemToObject(root,"hw",cJSON_CreateString("1.00.001")); // 添加硬件版本
cJSON_AddItemToObject(root,"interval",cJSON_CreateNumber(conf_clt.port[0].gap_timer)); // 添加刷新间隔
char *buf = cJSON_PrintUnformatted(root);
cJSON_Delete(root);
httpd_resp_sendstr(req, buf); // 发送 JSON 响应
cJSON_free(buf);
return ESP_OK;
}
- 返回字段 :
sn:设备序列号(通过util_get_meter_sn获取)。sw:软件版本(由SOFT_CODE和SOFT_VERSION拼接)。hw:硬件版本(固定为"1.00.001")。interval:刷新间隔(从配置conf_clt.port[0].gap_timer读取)。
三、整体流程总结
- HTTPS 服务端 :通过
httpd_ssl_start启动 HTTPS 服务器,加载证书和私钥,注册/api/getinfo等接口。 - HTTPS 客户端 :通过
https_send_data初始化客户端,配置为 "不校验证书" 模式,可与服务端通信。 - 接口调用 :客户端发起
GET /api/getinfo请求,服务端调用info_handler构造 JSON 响应,返回设备信息。