HTTP 客户端基础示例
源码位置: samples/network/http 查看源码
功能说明
此示例演示如何使用 LISA HTTP 客户端库进行基本的 HTTP 通信,包括:
HTTP GET 请求
HTTP POST 请求(普通表单数据)
HTTP POST 请求(Chunked 传输编码)
示例通过 WiFi 连接到测试服务器,执行多个 HTTP 请求并接收响应,展示了 HTTP 客户端的基本用法。
硬件连接
本示例使用芯片内部 WiFi 外设,无需额外接线。
串口输出:
串口 TX: PA3
波特率:921600
测试环境准备
1. 启动 HTTP 测试服务器
在与设备同一局域网的 Linux/Mac 主机上运行测试服务器:
cd samples/network/http
python3 http-server.py
服务器启动后将显示:
Serving at http://0.0.0.0:8000 (IPv4)
2. 配置 WiFi 和服务器地址
重要: 本示例强制要求在编译前配置 WiFi 和服务器信息,否则会编译失败。
在 src/main.c 中找到配置区域(第 21-27 行),取消注释并填写实际配置:
修改前(默认状态):
// ============================================================
// 重要:使用前请修改以下配置!
// ============================================================
// #define SERVER_URL // 修改为测试服务器的 URL,例如:"http://192.168.1.100:8000"
// #define TARGET_WIFI_SSID // 修改为目标 WiFi 的 SSID
// #define TARGET_WIFI_PWD // 修改为目标 WiFi 的密码
修改后(配置示例):
// ============================================================
// 重要:使用前请修改以下配置!
// ============================================================
#define SERVER_URL "http://192.168.1.100:8000" // 测试服务器的 URL
#define TARGET_WIFI_SSID "MyHomeWiFi" // 你的 WiFi 名称
#define TARGET_WIFI_PWD "mypassword123" // 你的 WiFi 密码
操作步骤:
移除
SERVER_URL前的//注释符将
SERVER_URL后面修改为实际的服务器 URL(例如:“http://192.168.1.100:8000”)移除
TARGET_WIFI_SSID前的//注释符将
TARGET_WIFI_SSID后面修改为实际的 WiFi 名称移除
TARGET_WIFI_PWD前的//注释符将
TARGET_WIFI_PWD后面修改为实际的 WiFi 密码
获取服务器 IP 地址:
在运行 http-server.py 的主机上执行:
# Linux/Mac
ifconfig | grep "inet "
# 或者
ip addr show | grep "inet "
查找类似 192.168.x.x 的局域网地址。
示例内容
连接 WiFi 并获取 IP 地址
发送 HTTP GET 请求
发送 HTTP POST 请求(普通表单数据)
发送 HTTP POST 请求(Chunked 传输编码)
接收并显示服务器响应
编译
重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:
arcs_evb - ARCS EVB 评估板
arcs_mini - ARCS Mini 开发板
根据您的开发板型号,选择对应的编译命令:
在示例目录下执行编译:
# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini
Note
如果在 SDK 根目录执行,需要指定示例路径:
# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb
# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini
Note
确保已安装对应的工具链。
烧录
编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:
./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs
Note
烧录参数说明:
-s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是/dev/ttyUSB0或/dev/ttyACM0- 可通过ls /dev/tty*命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名-b 3000000:烧录波特率(3Mbps)0x0:烧录起始地址build/arcs.bin:编译生成的固件路径-C arcs:芯片类型
注意事项:
确保开发板已正确连接到电脑
如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口
预期输出
系统启动后,终端将输出以下内容:
1. WiFi 连接日志
[INFO] HTTP Test Starting...
[INFO] WiFi auto-connect started
[INFO] custom_get_wifi_mac: 0, XX:XX:XX:XX:XX:XX
[INFO] WiFi connection status: 1
[INFO] WiFi connected to AP
[INFO] WiFi event: module=1, id=4
[INFO] Got IP address
[INFO] WiFi connected and IP obtained, starting HTTP tests...
2. HTTP 测试输出
========================================
HTTP 功能测试
========================================
=== 测试 1: HTTP GET 请求 ===
http response : <html><p>Done</p></html>
=== 测试 2: HTTP POST 请求 ===
http response : <html><p>Done</p></html>
=== 测试 3: HTTP POST 请求 (Chunked 编码) ===
http response : <html><p>Done</p></html>
========================================
所有 HTTP 测试完成
========================================
3. 服务器端日志
服务器端将显示接收到的 POST 请求详情:
===== 收到 POST 请求 =====
路径: /foobar
头部:
Host: 192.168.1.100:8000
Content-Length: 6
Body 数据:
foobar
===== 收到 POST 请求 =====
路径: /chunked-test
头部:
Host: 192.168.1.100:8000
Transfer-Encoding: chunked
Body 数据:
6
foobar
7
chunked
4
last
0
核心 API
API |
说明 |
|---|---|
|
初始化 HTTP 客户端 |
|
执行 HTTP 请求 |
|
清理并释放 HTTP 客户端资源 |
|
初始化 WiFi 管理器 |
|
启动自动连接 |
|
注册 WiFi 事件回调 |
关键代码
1. HTTP GET 请求
使用 LISA HTTP 库发送 GET 请求:
lisa_http_request_t req;
memset(&req, 0, sizeof(lisa_http_request_t));
req.method = LISA_HTTP_GET;
req.url = SERVER_URL;
req.timeout = 10;
req.on_data = http_data_cb;
req.body = NULL;
req.body_len = 0;
req.headers = NULL;
http = lisa_http_init(&req);
if (!http) {
LOGE("[http] init err\n");
goto ERR;
}
if (lisa_http_perform(http) != 0) {
LOGE("http get request info err..\n");
goto ERR;
}
lisa_http_cleanup(http);
2. HTTP POST 请求(普通表单数据)
发送普通 POST 数据:
memset(&req, 0, sizeof(lisa_http_request_t));
req.method = LISA_HTTP_POST;
req.url = SERVER_URL "/foobar";
req.timeout = 10;
req.on_data = http_data_cb;
req.body = "foobar";
req.body_len = strlen(req.body);
req.headers = NULL;
http = lisa_http_init(&req);
lisa_http_perform(http);
lisa_http_cleanup(http);
4. HTTP 响应回调
处理服务器响应数据:
static void http_data_cb(lisa_http_data_t *data)
{
if (!data || !data->buf) {
LOGE("http data is null");
return;
} else if (data->len <= 0) {
LOGE("http data len is 0");
return;
} else {
LOGI("\nhttp response : %s\n", data->buf);
}
}
5. WiFi 连接和 IP 获取
等待 WiFi 连接成功并获取 IP 地址:
// 注册 ls_event 回调监听 GOT_IP 事件
ls_event_init();
ls_event_register_cb(EVENT_WIFI, EVENT_WIFI_GOT_IP, app_wifi_event_cb, NULL);
// WiFi 事件回调
static int app_wifi_event_cb(void *arg, event_module_t event_module,
int event_id, void *event_data)
{
switch (event_id) {
case EVENT_WIFI_GOT_IP:
LOGI("Got IP address");
g_get_ip_success = true;
break;
}
return 0;
}
// 等待 WiFi 连接和 IP 获取
static int wait_for_wifi_connection(void)
{
while (timeout > 0) {
if (g_wifi_connected && g_get_ip_success) {
LOGI("WiFi connected and IP obtained, starting HTTP tests...");
return 0;
}
vTaskDelay(pdMS_TO_TICKS(1000));
timeout--;
}
return -1;
}
配置说明
HTTP 请求参数
lisa_http_request_t 结构体包含以下主要字段:
字段 |
类型 |
说明 |
|---|---|---|
|
|
HTTP 方法(GET/POST/PUT/DELETE 等) |
|
|
完整的 HTTP URL |
|
|
请求超时时间(秒) |
|
|
响应数据回调函数 |
|
|
请求 Body 数据(POST/PUT) |
|
|
Body 数据长度 |
|
|
自定义 HTTP 头部(可选) |
prj.conf 关键配置
# LWIP 网络栈
CONFIG_LWIP=y
CONFIG_LWIP_OPTION_LWIP_DNS=y
CONFIG_LWIP_OPTION_SO_REUSE=y
# WiFi 管理器
CONFIG_WIFI_MANAGER=y
# HTTP 客户端
CONFIG_MODULE_HTTPCLIENT=y
# LISA 组件
CONFIG_LISA_OS=y
CONFIG_LISA_KV=y
CONFIG_LISA_NETWORK=y
CONFIG_LISA_HTTP=y
# 堆内存配置
CONFIG_HEAP_SIZE=0x3C00 # 主堆: 15KB
CONFIG_PSRAM_HEAP_SIZE=0x5b0000 # PSRAM 堆: 5.6MB
HTTP 方法说明
LISA HTTP 库支持以下 HTTP 方法:
方法 |
枚举值 |
用途 |
|---|---|---|
GET |
|
获取资源 |
POST |
|
提交数据 |
PUT |
|
更新资源 |
DELETE |
|
删除资源 |
HEAD |
|
获取响应头 |
注意事项
编译前配置(重要):首次编译前必须取消注释并修改
src/main.c中的 WiFi 和服务器配置,否则会触发编译错误:main.c:31:2: error: #error "请修改 SERVER_URL 为实际的测试服务器 URL(例如:http://192.168.1.100:8000)" main.c:35:2: error: #error "请修改 TARGET_WIFI_SSID 为实际的 WiFi SSID" main.c:39:2: error: #error "请修改 TARGET_WIFI_PWD 为实际的 WiFi 密码"
这是为了防止使用默认配置导致连接失败。配置方法请参考上方的”配置 WiFi 和服务器地址”章节。
网络环境:确保设备与测试服务器在同一局域网内,避免跨网段访问
服务器地址:
SERVER_URL必须包含完整的 URL(协议 + IP + 端口),例如:“http://192.168.1.100:8000”WiFi 配置:将
TARGET_WIFI_SSID和TARGET_WIFI_PWD修改为实际的 WiFi SSID 和密码超时设置:HTTP 超时设置为 10 秒,如果网络较慢可适当增加
req.timeout值响应处理:
on_data回调函数会在接收到响应数据时被调用,可能会被多次调用(分块接收)资源清理:每次 HTTP 请求完成后必须调用
lisa_http_cleanup()释放资源,避免内存泄漏Python 版本:测试服务器需要 Python 3.6 或更高版本
相关文档
LISA WiFi 组件文档 - WiFi 初始化和连接
WiFi Manager 文档 - WiFi 连接管理
LISA HTTP 组件文档 - HTTP 客户端详细说明