Zephyr网络使用-IP配置

本文说明如何为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:

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:

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:

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

CONFIG_NET_DHCPV4=y

启用DHCP

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

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

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地址即可

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)));
}