Zephyr网络使用-IP配置

Creative Commons
本作品采用知识共享署名

本文说明如何为Zephyr配置ip.

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
4
char *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
3
char *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
3
char *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地址
先配置支持DHCP

1
CONFIG_NET_DHCPV4=y

启用DHCP

1
2
struct net_if *iface = net_if_get_default();
net_dhcpv4_start(iface);

如果想知道DHCP的状态可以通过注册事件回调来接受DHCP绑定事件

1
2
3
4
5
6
static 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
28
static 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)));
}