使用多个 Zephyr 实例进行网络连接

本页面介绍如何在多个 Zephyr 实例之间搭建虚拟网络。这些 Zephyr 实例可以运行在 QEMU 中,也可以是 native_sim 开发板进程。Linux 主机可用于在这些系统之间路由网络流量。

前置条件

在 Linux 主机上,找到 Zephyr 的 net-tools 项目,它可以在 Zephyr 标准安装的 tools/net-tools 目录中找到,也可以从其独立的 git 仓库单独安装:

git clone https://github.com/zephyrproject-rtos/net-tools

基本搭建

对于以下步骤,您需要五个终端窗口:

  • 终端 #1 和 #2 是以 net-tools 为当前目录的终端窗口(cd net-tools)

  • 终端 #3,用于在 Linux 主机中设置桥接

  • 终端 #4 和 #5 是您常用的 Zephyr 开发终端,已初始化 Zephyr 环境。

由于搭建 Zephyr 网络有多种方式,下面的示例使用带 e1000 以太网控制器的 qemu_x86 开发板和 native_sim 开发板,以简化搭建说明。如有需要,您可以使用其他 QEMU 开发板和驱动程序,详情见 使用 QEMU 以太网进行网络连接。您也可以使用两个或更多 native_sim 开发板 Zephyr 实例,并将它们连接在一起。

步骤 1 - 创建配置文件

在以网络连接方式启动 QEMU 之前,应在主机系统中为每个 Zephyr 实例创建网络接口。此处不能使用创建网络接口的默认设置,因为它用于将一个 Zephyr 实例连接到 Linux 主机。

对于 Zephyr 实例 #1,在 net-tools 项目或其他合适的目录中创建名为 zephyr1.conf 的文件。

# Configuration file for setting IP addresses for a network interface.
INTERFACE="$1"
HWADDR="00:00:5e:00:53:11"
IPV6_ADDR_1="2001:db8:100::2"
IPV6_ROUTE_1="2001:db8:100::/64"
IPV4_ADDR_1="198.51.100.2/24"
IPV4_ROUTE_1="198.51.100.0/24"
ip link set dev $INTERFACE up
ip link set dev $INTERFACE address $HWADDR
ip -6 address add $IPV6_ADDR_1 dev $INTERFACE nodad
ip -6 route add $IPV6_ROUTE_1 dev $INTERFACE
ip address add $IPV4_ADDR_1 dev $INTERFACE
ip route add $IPV4_ROUTE_1 dev $INTERFACE > /dev/null 2>&1

对于 Zephyr 实例 #2,在 net-tools 项目或其他合适的目录中创建名为 zephyr2.conf 的文件。

# Configuration file for setting IP addresses for a network interface.
INTERFACE="$1"
HWADDR="00:00:5e:00:53:22"
IPV6_ADDR_1="2001:db8:200::2"
IPV6_ROUTE_1="2001:db8:200::/64"
IPV4_ADDR_1="203.0.113.2/24"
IPV4_ROUTE_1="203.0.113.0/24"
ip link set dev $INTERFACE up
ip link set dev $INTERFACE address $HWADDR
ip -6 address add $IPV6_ADDR_1 dev $INTERFACE nodad
ip -6 route add $IPV6_ROUTE_1 dev $INTERFACE
ip address add $IPV4_ADDR_1 dev $INTERFACE
ip route add $IPV4_ROUTE_1 dev $INTERFACE > /dev/null 2>&1

步骤 2 - 创建以太网接口

应在 net-tools 目录中(cd net-tools)输入以下 net-setup.sh 命令。

在终端 #1 中输入:

./net-setup.sh -c zephyr1.conf -i zeth.1

在终端 #2 中输入:

./net-setup.sh -c zephyr2.conf -i zeth.2

步骤 3 - 设置网络桥接

在终端 #3 中输入:

sudo brctl addbr zeth-br
sudo brctl addif zeth-br zeth.1
sudo brctl addif zeth-br zeth.2
sudo ifconfig zeth-br up

步骤 4 - 启动 Zephyr 实例

在本示例中,我们启动 Echo server (advanced) 和 Echo client (advanced) 示例应用。您也可以根据需要改用其他应用。

在终端 #4 中,如果使用 QEMU,请输入:

west build -d build/server -b qemu_x86 -t run \
   samples/net/sockets/echo_server -- \
   -DEXTRA_CONF_FILE=overlay-e1000.conf \
   -DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"198.51.100.1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"203.0.113.1\" \
   -DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:100::1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:200::1\" \
   -DCONFIG_NET_CONFIG_MY_IPV4_GW=\"203.0.113.1\" \
   -DCONFIG_ETH_QEMU_IFACE_NAME=\"zeth.1\" \
   -DCONFIG_NET_QEMU_DEVICE_EXTRA_ARGS=\"mac=00:00:5e:00:53:01\"

或者,如果要使用 native_sim 开发板,请输入:

west build -d build/server -b native_sim \
   samples/net/sockets/echo_server -- \
   -DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"198.51.100.1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"203.0.113.1\" \
   -DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:100::1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:200::1\" \
   -DCONFIG_NET_CONFIG_MY_IPV4_GW=\"203.0.113.1\"
build/server/zephyr/zephyr.exe --eth-if=zeth.1 --mac-addr=00:00:5e:00:53:01

在终端 #5 中,如果使用 QEMU,请输入:

west build -d build/client -b qemu_x86 -t run \
   samples/net/sockets/echo_client -- \
   -DEXTRA_CONF_FILE=overlay-e1000.conf \
   -DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"203.0.113.1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"198.51.100.1\" \
   -DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:200::1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:100::1\" \
   -DCONFIG_NET_CONFIG_MY_IPV4_GW=\"198.51.100.1\" \
   -DCONFIG_ETH_QEMU_IFACE_NAME=\"zeth.2\" \
   -DCONFIG_NET_QEMU_DEVICE_EXTRA_ARGS=\"mac=00:00:5e:00:53:02\"

或者,如果要使用 native_sim 开发板,请输入:

west build -d build/client -b native_sim \
   samples/net/sockets/echo_client -- \
   -DCONFIG_NET_CONFIG_MY_IPV4_ADDR=\"203.0.113.1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV4_ADDR=\"198.51.100.1\" \
   -DCONFIG_NET_CONFIG_MY_IPV6_ADDR=\"2001:db8:200::1\" \
   -DCONFIG_NET_CONFIG_PEER_IPV6_ADDR=\"2001:db8:100::1\" \
   -DCONFIG_NET_CONFIG_MY_IPV4_GW=\"198.51.100.1\"
build/client/zephyr/zephyr.exe --eth-if=zeth.2 --mac-addr=00:00:5e:00:53:02

此外,如果主机上启用了防火墙,您需要允许 zeth.1、zeth.2 和 zeth-br 接口之间的流量。