libcurl库在嵌入式平台的使用(HTTPS)
本文介绍了在嵌入式Linux系统中使用libcurl库实现HTTPS通信的方法。主要内容包括:1) 交叉编译精简版OpenSSL库;2) 基于OpenSSL交叉编译仅保留HTTPS功能的libcurl库;3) 编写并编译测试demo代码,实现HTTPS GET请求功能。文章详细说明了编译配置参数和代码实现要点,特别针对嵌入式系统的资源限制进行了优化,如内存管理、超时设置等。通过httpbin.or
·
前言
在日常开发过程中我们免不了需要和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

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