在Zephyr网络使用-Wifi控制一文中可以通过扫描和连接将wifi和AP连接起来,但这只实现了L2以下的连接,Zephyr需要基于socket进行网络应用开发,而使用socket的第一步就是要将TCP/IP跑起来,让Zephyr可以拿到IP. 由于这里已经是网络协议栈的使用,因此和硬件关系不大,除esp32c3_devkitm外,本文也适合其它带网络的板子。
配置IP通常有手动和DHCP两种方式
手动配置
只要启用了’CONFIG_NET_IPV4=y’就可以进行手动设置
设置IP地址 net_if_ipv4_addr_add
:1
2
3
4char *ip = "192.168.37.5";
net_addr_pton(AF_INET, ip, &addr);
net_if_ipv4_addr_add(iface, &addr, NET_ADDR_MANUAL, 0);
手动添加IP地址有两种方式
NET_ADDR_MANUAL
手动设置地址NET_ADDR_OVERRIDABLE
手动设置地址,该地址可以被DHCP覆盖
设置net mask net_if_ipv4_set_netmask
:1
2
3char *mask = "255.255.255.0";
net_addr_pton(AF_INET, mask, &addr);
net_if_ipv4_set_netmask(iface, &addr);
设置网关 net_if_ipv4_set_gw
:1
2
3char *gw = "192.168.37.1";
net_addr_pton(AF_INET, gw, &addr);
net_if_ipv4_set_gw(iface, &addr);
DHCP
Zephyr支持DHCP Client,因此当zephyr作为client时可以去dhcp server拿IP地址
先配置支持DHCP1
CONFIG_NET_DHCPV4=y
启用DHCP1
2struct net_if *iface = net_if_get_default();
net_dhcpv4_start(iface);
如果想知道DHCP的状态可以通过注册事件回调来接受DHCP绑定事件1
2
3
4
5
6static struct net_mgmt_event_callback dhcp_cb;
net_mgmt_init_event_callback(&dhcp_cb, handler_cb,
NET_EVENT_IPV4_DHCP_BOUND);
net_mgmt_add_event_callback(&dhcp_cb);
当DHCP拿到IP后handler_cb
会被调用,在该回调内去获取ip地址即可1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28static void handler_cb(struct net_mgmt_event_callback *cb,
uint32_t mgmt_event, struct net_if *iface)
{
if (mgmt_event != NET_EVENT_IPV4_DHCP_BOUND) {
return;
}
char buf[NET_IPV4_ADDR_LEN];
// 分配到的IP地址
LOG_INF("Your address: %s",
net_addr_ntop(AF_INET,
&iface->config.dhcpv4.requested_ip,
buf, sizeof(buf)));
// IP租期
LOG_INF("Lease time: %u seconds",
iface->config.dhcpv4.lease_time);
// net mask
LOG_INF("Subnet: %s",
net_addr_ntop(AF_INET,
&iface->config.ip.ipv4->netmask,
buf, sizeof(buf)));
// 网关
LOG_INF("Router: %s",
net_addr_ntop(AF_INET,
&iface->config.ip.ipv4->gw,
buf, sizeof(buf)));
}