免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

RIOT gnrc_border_router 实战指南:基于 ethos / SLIP / DHCPv6 搭建 6LoWPAN 边界路由器

RIOT gnrc_border_router 实战指南:基于 ethos / SLIP / DHCPv6 搭建 6LoWPAN 边界路由器 RIOT gnrc_border_router 实战指南基于 ethos / SLIP / DHCPv6 搭建 6LoWPAN 边界路由器【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT本文以 RIOT 操作系统官方示例 examples/networking/gnrc/border_router 为蓝本系统讲解如何把一块普通 RIOT 开发板或 native 模拟环境变成一台开箱即用的 6LoWPAN 边界路由器Border Router简称 BR它一端通过以太网ethos、SLIP 或 WiFi 接入普通 IPv6 网络上行另一端承载 IEEE 802.15.4 无线 6Lo 网络下行并把两者之间的前缀、路由与地址配置自动化。读完本文你将掌握UPLINK/PREFIX_CONF等构建变量的用法、make term一键组网流程、手动配置 ethos 与 SLIP 的完整命令行步骤以及 native 下模拟 802.15.4 多节点网络的原理。概览一条命令启动的 6LoWPAN 边界路由器在 IoT 场景中传感器节点mote通常只有 802.15.4 射频和极少的资源无法直接接入互联网。边界路由器负责在 6Lo 无线网络PAN与普通IPv6 网络即互联网之间转发数据包。RIOT 的这个示例应用gnrc_border_router将整个过程自动化使用ethosEthernet Over Serial作为默认上行方案把串口数据复用为两类流量以太网帧和 Shell 命令使用UHCPmicro Host Configuration Protocol负责在 BR 上配置无线接口的前缀与路由也可改用 DHCPv6脚本 dist/tools/ethos/start_network.sh 只需一条命令即可把宿主机与板卡配置成即插即用的 BR。从源码看应用本体极其精简——main.c 只做了三件事初始化一个 8 槽位的消息队列以缓冲快速到达的网络包、打印启动信息、启动 RIOT Shell。真正的工作由 Makefile 按目标平台和构建变量拼装出来的网络模块栈完成详见下文从源码看实现。架构与数据通路上行 / 下行双接口模型BR 必须拥有两个网络接口接口方向承载网络典型实现下行接口downstream面向 moteIEEE 802.15.4 / 6LoWPAN板载 802.15.4 射频native 下用socket_zep模拟上行接口uplink面向互联网普通 IPv6ethos、SLIP、WiFi、以太网芯片或 USB CDC-ECM在 native 平台上面向宿主机一侧配置了netdev_tap设备通过 TAP 接口为 RIOT 实例提供网络连通性面向节点一侧使用socket_zep模拟 IEEE 802.15.4 网络。这两条通路的具体模块选择由 Makefile.board.dep 依据BOARD与UPLINK决定。三种预配置上行链路UPLINK 环境变量该示例预配置了三种上行链路类型通过设置UPLINK环境变量选择例如UPLINKslip即切换到 SLIP 上行ethos默认以太网 Over 串口slip串行线 IPRFC 1055 协议wifi连接现有 WiFiIEEE 802.11网络。除上述三种外Makefile 还校验支持cdc-ecm与ethernet两种上行若传入了不支持的值构建会直接报错Supported uplinks are ethos, slip, cdc-ecm, ethernet and wifi。ethos串口上的以太网ethos与slip都复用了原本用于 RIOT Shell 的那条串口线来提供上行接口IP 数据包与 Shell 命令在同一根串行线上多路复用你的 Linux 电脑充当上游路由器。这也解释了为什么在make term进入终端后仍能输入help等 Shell 命令——stdio 与网络流量被 ethos 按帧格式区分开来。slip串行线 IPslip走 RFC 1055 定义的 SLIP 封装需要宿主端配合tun接口详见下文SLIP 边界路由器一节。wifiIEEE 802.11 上行 esp_now 下行wifi上行会连接现有 WiFi 网络。当PREFIX_CONFdhcpv6默认时该网络必须提供支持**前缀委派IA_PD**的 DHCPv6 服务器。凭据通过构建命令传入make WIFI_SSIDSSID WIFI_PASSpassword ...也可以直接编辑 Makefile其中默认占位值为WIFI_SSID ? Your_WiFi_name、WIFI_PASS ? Your_secure_password。Makefile.wifi.conf 会把这两个值以-DWIFI_SSID...、-DWIFI_PASS...编译进固件。平台限制wifi上行目前要求 BR 板卡为 esp8266、esp32、esp32s2、esp32s3、esp32c3 或 esp32c6并默认使用esp_now作为下行接口可通过DOWNLINKble切换为 NimBLE BLE。注意esp_now下行使用的信道必须与wifi上行使用的信道一致需用CFLAGS中的ESP_NOW_CHANNEL显式指定make UPLINKwifi CFLAGS-DESP_NOW_CHANNEL6 ...与宿主机共享 IPv6 连接REUSE_TAP如果 Linux 宿主机自身有可共享的 IPv6 上行可以让 BR 直接借用它。做法是把宿主网络桥接到 TAP 网络sudo dist/tools/tapsetup/tapsetup -u eno1其中eno1是宿主机的上行网卡。随后构建 / 运行 BR 应用时指定REUSE_TAP1即可。该特性对native与ethos上行均适用——从 Makefile.ethos.conf 可以看到REUSE_TAP1时不再调用start_network.sh而是直接以ethos TAP PORT BAUDRATE方式运行 ethos。环境要求仅支持 Linux 机器ethos/SLIP 的 TAP/tun 配置、tapsetup、uhcpd 等工具都依赖 Linux 网络栈若使用 DHCPv6需要在面向 BR 的接口上配置支持前缀委派的 DHCPv6 服务器。以 KEA DHCPv6 服务器为例可参考如下配置在tap0接口上配置2001:db8::/16子网并向 BR 委派 64 位前缀Dhcp6: { interfaces-config: { interfaces: [ tap0 ] }, ... subnet6: [ { interface: tap0, subnet: 2001:db8::/16, pd-pools: [ { prefix: 2001:db8::, prefix-len: 16, delegated-len: 64 } ] } ] ... }实战提示使用 TAP 接口时Linux 可能不认为该接口已连接因此建议在启动 BR 应用见下文之后再重启一次 DHCPv6 服务器。快速开始一条命令搭建自动配置 BR编译与烧录make clean all flash若要用 DHCPv6 替代 UHCP编译时设置环境变量PREFIX_CONFdhcpv6PREFIX_CONFdhcpv6 make clean all flashmake term 一键组网ethos和slip所需的start_network.sh脚本会在你输入以下命令时自动执行make term该命令会依次完成创建tapethos 场景或tunslip 场景接口、启动前缀配置守护进程、再拉起 ethos/slip 前端并进入 RIOT Shell。以 ethos 为例start_network.sh 内部实际执行了create_tap用ip tuntap add创建 TAP 接口、开启 IPv6 转发、在tap0上配置fe80::1/64链路本地地址按PREFIX_CONF选择启动uhcpddist/tools/uhcpd、dhcpv6-pd_ia.pydist/tools/dhcpv6-pd_ia或radvd.shdist/tools/radvd并写入ip route add PREFIX via fe80::2 dev TAP最后运行 ethos 前端ethos TAP PORT BAUDRATE。注意脚本会配置2001:db8::/64作为前缀当使用 DHCPv6/auto_subnets 时 Makefile 默认改用2001:db8::/32作为委派源前缀。该前缀应通过无线接口向其他 mote 通告。验证连通性ping 与 ifconfig组网完成后就可以从宿主机 ping 那些拥有全局地址的 mote 了。例如 mote 上运行 gnrc_networking 示例 时 ping 2001:db8:0:1234:0:567:8:1把地址替换成你 mote 的实际地址即可。在 mote 的 Shell 里用ifconfig查看自身地址例如Iface 7 HWaddr: 59:72 Channel: 26 Page: 0 NID: 0x23 Long HWaddr: 5a:46:10:6e:f2:f5:d9:72 TX-Power: 0dBm State: IDLE max. Retrans.: 3 CSMA Retries: 4 AUTOACK CSMA MTU:1280 HL:64 6LO RTR RTR_ADV IPHC Source address length: 8 Link type: wireless inet6 addr: ff02::1/128 scope: local [multicast] inet6 addr: fe80::5846:106e:f2f5:d972/64 scope: local inet6 addr: ff02::1:fff5:d972/128 scope: local [multicast] inet6 addr: 2001:db8::5846:106e:f2f5:d972/64 scope: global inet6 addr: ff02::2/128 scope: local [multicast]可以看到 mote 已通过无状态地址自动配置SLAAC获得了2001:db8::/64范围内的全局地址。此外脚本还会在 Linux 的tap0接口上配置一个 ULAUnique Local Address地址可在 PC 上通过ifconfig查看。在本示例中该地址为fd00:dead:beef::1可从 6Lo mote 反向 ping 通 ping fd00:dead:beef::1对应到脚本里即ip a a fd00:dead:beef::1/128 dev lo这一行。至此PC 与 mote 之间的 IPv6 双向通信即已打通。native 下的 802.15.4 模拟网络在 native 平台上IEEE 802.15.4 网络是通过把 802.15.4 帧封装进 UDP 包来模拟的BR 与虚拟 mote 两侧都使用socket_zep模块。这些 UDP 包被发送给一个ZEP dispatcher见 dist/tools/zep_dispatch由其转发给所有其他节点。默认提供的简单 dispatcher 会把每个包广播给每个节点即完美广播用户也可以传入自定义 dispatcher 模拟更复杂的拓扑设备数量与端口由 Makefile.native.conf 控制ZEP_DEVICES ? 1、ZEP_PORT_BASE ? 17754每个设备占用一个递增端口通过ZEP_TOPO_FILE可指定自定义拓扑文件通过ZEP_MONITOR1可开启监控模式。native 下的构建变量还有PORT ? $(TAP)native 用$PORT指定 TAP 接口名默认tap0。手动配置模式把 ethos 当作独立驱动使用如果你不想用自动脚本也可以把ethos当作独立串口驱动手动搭建 BR。此时应确保 Makefile 中有如下内容非 native 平台ifeq (,$(filter native native32 native64,$(BOARD))) USEMODULE stdio_ethos CFLAGS -DETHOS_UARTUART_DEV(0) -DETHOS_BAUDRATE115200 FEATURES_REQUIRED periph_uart endif # include UHCP client USEMODULE gnrc_uhcpc要让 Linux PC 能访问 BR 下挂的节点需要手动添加tap接口sudo ip tuntap add tap0 mode tap user ${USER}然后配置它路由来自 6Lo 网络的包2001:db8::仅为示例前缀sudo ip link set tap0 up sudo ip a a 2001:db8::1/48 dev tap0 sudo ip r d 2001:db8::/48 dev tap0 sudo ip r a 2001:db8::2 dev tap0 sudo ip r a 2001:db8::/48 via 2001:db8::2 dev tap0接着烧录固件make clean all flash此时这块 RIOT BR 上有两个接口一个有线接口代表 Linux 与板卡之间的串行链路一个无线接口代表 802.15.4 射频链路。在 BR 的 Shell 中手动配地址、加路由 ifconfig 6 add 2001:db8::2/48 ifconfig 5 add 2001:db8::3/64 fibroute add :: via link-local of tap dev 6给无线接口添加地址后该前缀会被广播出去射程范围内的 mote 会自动加上这个前缀接口编号 5/6 依平台而定以实际ifconfig输出为准。运行 ethos 时按板卡选择串口如/dev/ttyUSB*或/dev/ttyACM*sudo ./ethos tap0 /dev/ttyACM0之后即可 ping 节点使用以前缀本例为2001:db8::开头的全局地址 ping 2001:db8:0:1234:0:567:8:1SLIP 边界路由器tunslip6 方案需求与适配要把 RIOT 板卡搭成 6LoWPAN BR要么板载一块 IPv6 能力网卡如encx24j600以太网芯片要么通过串口连到 Linux 主机并用 SLIP 标准RFC 1055通信。本示例默认按 Atmel SAM R21 Xplained Pro 评估板 外置 UART 适配器设计但只要平台有多余 UART 或 IPv6 网卡即可运行。适配其他平台时只需修改 Makefile.board.dep例如把USEMODULE ethos替换为USEMODULE encx24j600并指定BOARD myplatform。同时确保 Makefile 中使用 SLIPUPLINK ? slip配置步骤编译宿主端工具 tunslip6由 Contiki 移植而来位于 dist/tools/tunslip直接make即可cd dist/tools/tunslip make启动 tunslip6其中/dev/ttyUSB0是 RIOT 板卡额外UART 的设备描述符sudo ./tunslip6 2001:db8::1/64 -t tun0 -s /dev/ttyUSB0配置 RIOT 侧 SLIP 接口添加对应 IPv6 地址ifconfig 6 add 2001:db8::2把 SLIP 接口加入邻居缓存——因为 Linux 不会在无链路层地址的接口上响应邻居请求Neighbor Solicitationncache add 6 2001:db8::1传播前缀给无线接口添加地址ifconfig 5 add 2001:db8::3完成后假设 Linux 主机正确转发流量BR 与外部世界之间即可互相 ping 通。此外还可以在 6LoWPAN 接口上配置更多 IPv6 地址与其他 6LoWPAN 节点通信详见gnrc_networking示例。Makefile 构建变量速查变量默认值说明UPLINKethos上行类型ethos/slip/cdc-ecm/ethernet/wifiPREFIX_CONFuhcpethos/slip或dhcpv6wifi/cdc-ecm/ethernet/REUSE_TAP前缀配置方式uhcp/dhcpv6/auto_subnets/staticTAPtap0TAP 接口名IPV6_PREFIX2001:db8::/64UHCP或2001:db8::/32DHCPv6/auto_subnets通告 / 委派前缀ETHOS_BAUDRATE115200ethos 串口波特率SLIP_BAUDRATE115200SLIP 串口波特率WIFI_SSID/WIFI_PASSYour_WiFi_name/Your_secure_passwordWiFi 凭据ESP_NOW_CHANNEL—esp_now 下行信道须与 WiFi 上行一致经CFLAGS传入REUSE_TAP空设为1时复用宿主机桥接的 TAP跳过自动建网ZEP_DEVICES1native 下模拟的 802.15.4 节点数ZEP_PORT_BASE17754native 下 ZEP dispatcher 起始 UDP 端口ZEP_TOPO_FILE—native 下自定义 ZEP 拓扑文件ZEP_MONITOR—设为1开启 ZEP 监控ENABLE_DNS1启用 DNS 客户端与 RDNSS 选项处理sock_dns、gnrc_ipv6_nib_dns、auto_init_sock_dnsENABLE_DNS_CACHING1启用 DNS 缓存dns_cache以更多内存换取更少 DNS 请求DOWNLINK—下行方式设为ble时启用nimble_rpble前缀配置方式对应模块关系见 MakefilePREFIX_CONFuhcp→gnrc_uhcpcUHCP 客户端PREFIX_CONFdhcpv6→gnrc_dhcpv6_client_6lbr可选追加dhcpv6_client_ia_na除前缀外再申请 IA_NA 地址PREFIX_CONFauto_subnets→gnrc_ipv6_auto_subnets_simplePREFIX_CONFstatic→gnrc_ipv6_static_addr并用IPV6_ADDR ? 2001:db8:1::1、IPV6_PREFIX、可选IPV6_DEFAULT_ROUTER静态指定地址。从源码看实现应用入口main.c仅初始化 8 槽位消息队列并启动 Shell网络功能全部由auto_init机制根据模块自动初始化印证了配置即代码的设计思路。模块栈Makefilenetdev_defaultauto_init_gnrc_netif拉起链路层gnrc_sixlowpan_border_router_default提供 6LoWPAN BR 必需的转发与路由能力gnrc_icmpv6_echo提供 ping 支持shellshell_cmds_defaultps提供 Shell 与ifconfig、ncache、fibroute等调试命令。默认开启DEVELHELP1便于开发调试量产可关闭。串口复用ethos 与 SLIP 均通过stdio over UART机制使 Shell 与网络流量共用一条串口线stdio_ethos/stdio_slipdev这是单串口即搞定 BR的关键。一键脚本start_network.sh支持-d/--use-dhcpv6、-r/--use-radvd、-e/--ethos-only三个开关分别对应 DHCPv6、radvd 自动子网与仅运行 ethos 三种模式脚本内置trap cleanup退出时自动删除 TAP、清理 ULA 地址并终止守护进程。native 网络Makefile.native.conf以-z参数为每个 ZEP 设备生成[::1]:PORT端点并通过start_network.sh拉起 dispatcher实现一台 PC 上完整的多节点 6LoWPAN 网络仿真。平台依赖Makefile.board.dep非 native 平台按UPLINK装配slipdev_net/stdio_ethos/esp_wifiesp_now或nimble_rpblenative 平台则装配netdev_tapsocket_zepsocket_zep_hello。Makefile.ci 中列出的BOARD_INSUFFICIENT_MEMORY名单如多款 AVR 与低内存 STM32 板卡提示BR 需要足够的 RAM 才能容纳 6LoWPAN 转发与地址表。至此你已经掌握了 RIOT 6LoWPAN 边界路由器的三种典型部署形态——自动配置ethos/UHCP、手动配置ethos 独立驱动与 SLIPtunslip6以及它们在 native 模拟环境下的完整验证方法。下一步可以结合实际板卡从make term开始搭建你的第一条 6LoWPAN 互联网通路。【免费下载链接】RIOTRIOT - The friendly OS for IoT项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表