DHCP/DNS
lwIP DHCP Client、DNS Client
前置阅读:STA 连接
学习目标
- 理解 DHCP Client 自动获取 IP 地址的流程
- 掌握 DNS 域名解析——将域名转换为 IP 地址
- 理解 DHCP 续约机制和 IP 地址变更的处理
基本概念
DHCP 工作原理
WiFi STA 连接成功后自动启动 DHCP——WS63 内置 DHCP Client,无需手动配置。
sequenceDiagram
participant W as WS63
participant R as 路由器 DHCP
W->>R: DHCP Discover 广播
R->>W: DHCP Offer 提供 IP
W->>R: DHCP Request 确认
R->>W: DHCP ACK — IP/网关/DNS
Note over W: WiFi 连接成功即可通信
DHCP 续约
IP 租约到期前自动续约:租约 50% 时尝试续约 → 87.5% 时广播续约 → 续约失败则重新 DHCP。
DNS 解析
getaddrinfo() 将域名解析为 IP 地址。DNS Server 地址由 DHCP 自动获取,无需手动配置。
涉及 API
| API | 用途 |
|---|---|
| WiFi DHCP | 协议栈自动管理,wifi_event_connection_changed(CONNECTED) 后即可通信 |
wifi_sta_get_ap_info(&info) |
获取当前 IP 地址 |
getaddrinfo(hostname, NULL, &hints, &res) |
DNS 域名解析 |
gethostbyname(hostname) |
DNS 解析(简化版) |
案例说明
做什么
- DHCP 无代码——WiFi STA 连接成功后自动完成,
wifi_sta_get_ap_info()可获取当前 IP - DNS:输入域名 →
getaddrinfo()解析 → 打印 IP → 用解析出的 IP 连接服务器
关键配置
| 参数 | 默认值 | 说明 |
|---|---|---|
| DHCP 超时 | 30s | 连接后 30s 未获 IP 视为失败 |
| DNS 超时 | 5s × 3 | 单次 5s,重试 3 次 |
代码详解
获取连接后的 IP 地址
wifi_ap_info_t info;
wifi_sta_get_ap_info(&info);
printf("IP: %s\n", inet_ntoa(info.ip_addr));
printf("GW: %s\n", inet_ntoa(info.gateway));
DNS 域名解析
struct addrinfo hints = {
.ai_family = AF_INET,
.ai_socktype = SOCK_STREAM
};
struct addrinfo *res = NULL;
int ret = getaddrinfo("mqtt.example.com", NULL, &hints, &res);
if (ret == 0) {
struct sockaddr_in *addr = (struct sockaddr_in *)res->ai_addr;
printf("Resolved: %s\n", inet_ntoa(addr->sin_addr));
freeaddrinfo(res);
}