https不校验证书实现及https接口实现

一、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_CODESOFT_VERSION 拼接)。
    • hw:硬件版本(固定为 "1.00.001")。
    • interval:刷新间隔(从配置 conf_clt.port[0].gap_timer 读取)。

三、整体流程总结

  1. HTTPS 服务端 :通过 httpd_ssl_start 启动 HTTPS 服务器,加载证书和私钥,注册 /api/getinfo 等接口。
  2. HTTPS 客户端 :通过 https_send_data 初始化客户端,配置为 "不校验证书" 模式,可与服务端通信。
  3. 接口调用 :客户端发起 GET /api/getinfo 请求,服务端调用 info_handler 构造 JSON 响应,返回设备信息。
相关推荐
忙碌5441 天前
OpenTelemetry实战指南:构建云原生全链路可观测性体系
ios·flink·apache·iphone
阿捏利1 天前
详解Mach-O(十五)Mach-O __DATA_CONST
macos·ios·c/c++·mach-o
肖老师xy1 天前
uniapp ios离线打包后xcode修改
ios·uni-app
wangyang62751 天前
Xcode 26 真机运行崩溃 EXC_BAD_ACCESS map_images_nolock 完美解决方案
flutter·ios
编程之路从0到12 天前
ReactNative新架构之iOS端TurboModule源码剖析
react native·ios·源码阅读
SameX2 天前
春节期间独立开发者从 0 到 1:呼吸训练 iOS App 的工程化落地
ios