前言

        在日常开发过程中我们免不了需要和https服务器做数据交互,而自己实现https的协议还有加密这些太过于复杂耗时,并且容易出错,因为不建议自己造轮子,使用现成的库是一个好的选择,这篇文件介绍了,如何在嵌入式linux中使用libcurl库来辅助开发。

一、交叉编译OpenSSL(精简版)

        OpenSSL是HTTPS加密的核心,必须先编译OpenSSL,在编译libcurl(libcurl依赖它)

1.1 下载源码包

wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz

1.2 交叉编译

./Configure linux-armv4 \
--prefix=/home/hiaf/work/Lib/goke7205v200/openssl/openssl-1.1.1w/install \
--cross-compile-prefix=arm-gcc6.3-linux-uclibceabi- \
no-asm no-hw no-engine no-ocsp no-srtp no-ssl2 no-ssl3 no-tls1 no-tls1_1 enable-tls1_2 enable-tls1_3 no-async no-threads no-shared \
--openssldir=/home/hiaf/work/Lib/goke7205v200/openssl/openssl-1.1.1w/install -Os

make -j4 && make insatll

编译完成以后会在设置的prefix路径下生成对应的库

二、交叉编译 libcurl(带 SSL + 精简)

2.1 下载源码包

wget https://curl.se/download/curl-7.88.1.tar.gz

2.2 交叉编译

        基于已编译的精简版 OpenSSL,编译仅保留 HTTPS 功能的 libcurl

./Configure --host=arm-gcc6.3-linux-uclibceabi \
--prefix=/home/hiaf/work/Lib/goke7205v200/curl/curl-7.88.1/install \
--with-ssl=/home/hiaf/work/Lib/goke7205v200/openssl/openssl-1.1.1w/install \
--enable-small --disable-largefile --disable-ftp --disable-tftp --disable-ldap --disable-imap --disable-cookies --disable-sessionid --disable-verbose --disable-progress-meter --disable-shared --enable-static CFLAGS="-Os -fPIC" \
LDFLAGS="-L/home/hiaf/work/Lib/goke7205v200/openssl/openssl-1.1.1w/install/lib" \
CPPFLAGS="-I/home/hiaf/work/Lib/goke7205v200/openssl/openssl-1.1.1w/install/include"
make -j4 && make install

编译完成以后会在设置的prefix路径下生成对应的库

三、demo代码书写编译

3.1 代码书写

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <curl/curl.h>

// 响应数据回调函数(精简版,仅打印+缓存关键数据)
size_t response_cb(void *ptr, size_t size, size_t nmemb, void *userdata) {
    size_t total = size * nmemb;
    // 嵌入式低内存:仅打印前512字节(避免缓冲区溢出)
    char buf[512] = {0};
    strncpy(buf, (char*)ptr, total < 511 ? total : 511);
    printf("Received response (partial): %s\n", buf);
    // 必须返回实际接收字节数,否则curl判定失败
    return total;
}

int main(int argc, char *argv[]) {
    // 初始化curl(仅一次,低内存核心)
    curl_global_init(CURL_GLOBAL_DEFAULT);
    CURL *curl = curl_easy_init();
    if (!curl) {
        fprintf(stderr, "curl init failed!\n");
        return -1;
    }

    // 测试HTTPS地址(选轻量的公开测试接口,适配嵌入式网络)
    const char *test_url = "https://httpbin.org/get";
    
    // 设置curl参数(适配uClibc+静态库)
    curl_easy_setopt(curl, CURLOPT_URL, test_url);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, response_cb);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 5L);  // 短超时,避免卡死
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  // 测试用:忽略证书验证
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
    curl_easy_setopt(curl, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);  // 仅IPv4,适配嵌入式
    curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);  // uClibc无信号支持,必须加

    // 执行HTTPS GET请求
    printf("Sending HTTPS GET to: %s\n", test_url);
    CURLcode res = curl_easy_perform(curl);
    
    // 结果判断
    if (res == CURLE_OK) {
        long resp_code;
        curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &resp_code);
        printf("✅ HTTPS request success! Response code: %ld\n", resp_code);
    } else {
        fprintf(stderr, "❌ HTTPS request failed: %s\n", curl_easy_strerror(res));
    }

    // 释放资源(嵌入式必须清理)
    curl_easy_cleanup(curl);
    curl_global_cleanup();
    return 0;
}

3.2 编译与运行结果

arm-gcc6.3-linux-uclibceabi-gcc https.c -I../../include -L../../lib -lcurl -lssl -lcrypto

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐