Go2 Jetson WiFi 网络配置完整指南
记录:给 Unitree Go2 机器狗的Jetson拓展坞加装 USB WiFi 网卡,实现"WiFi 无线连接 NoMachine + 桥接电脑有线上网"的完整过程,包括踩过的坑和最终方案。
1. 背景与目标
- 给 Jetson(Go2 机器人本体的板载电脑)加装一块 USB WiFi 网卡(RTL8812BU),让它对外广播一个热点
go2 - 目标一:外部电脑通过 WiFi 连接
go2热点后,可以用 NoMachine 远程访问 Jetson 桌面(不需要插网线) - 目标二:Jetson 自己的上网,改为通过 WiFi 反向"蹭"外部电脑的网络(电脑有线上网,Jetson WiFi 连电脑,电脑把网络共享给 Jetson)
eth0(Jetson 唯一的物理有线口)专职连接机器人本体网络(192.168.123.0/24,机器人主控在192.168.123.161)
2. 硬件与驱动:RTL8812BU 网卡安装
2.1 硬件识别
lsusb
# Bus 001 Device 002: ID 0bda:b812 Realtek Semiconductor Corp. USB3.0 802.11ac 1200M Adapter
芯片型号 0bda:b812,即 RTL8812BU / RTL88x2BU,支持 2.4G/5G 双频 AC1200。
2.2 驱动情况说明
- 这颗芯片(
0bda:b812)的驱动是在 Linux 6.4 左右才随rtw88(CONFIG_RTW88_8822BU)合并进内核主线的,6.12 之后趋于稳定;Ubuntu 22.04 的 HWE 内核、24.04 默认内核(6.8+)都晚于这个合并时间点,所以在这些系统上插上就能直接用,不需要手动编译 - 但这台 Jetson 用的是 Unitree 官方基于 Ubuntu 20.04 定制的老版本厂商内核(
5.10.104-tegra),远早于上述合并时间点,内核里没有这颗芯片的驱动,所以仍需要用rtl88x2bu(社区维护、基于 Realtek 官方放出的厂商源码,来自 cilynx/rtl88x2bu)手动编译安装。内核头文件也已匹配(/usr/src/linux-headers-5.10.104-tegra-ubuntu20.04_aarch64)
获取源码:
git clone https://github.com/cilynx/rtl88x2bu.git /usr/src/rtl88x2bu-5.8.7.1
sudo dkms add -m rtl88x2bu -v 5.8.7.1
2.3 踩坑:Makefile 平台判断 bug
驱动默认 Makefile 里同时把 CONFIG_PLATFORM_I386_PC 和 CONFIG_PLATFORM_ARM_RPI 设成了 y,导致平台判断逻辑的 ifeq 匹配失败,编译时算出的内核路径(KSRC)是空的,报错:
make[1]: *** M=/var/lib/dkms/.../build: No such file or directory
修复:编辑 /usr/src/rtl88x2bu-5.8.7.1/Makefile,把 CONFIG_PLATFORM_I386_PC 改成 n(保留 CONFIG_PLATFORM_ARM_RPI = y,这个分支同时覆盖树莓派和通用 aarch64 平台)。
sudo sed -i 's/^CONFIG_PLATFORM_I386_PC = y/CONFIG_PLATFORM_I386_PC = n/' \
/usr/src/rtl88x2bu-5.8.7.1/Makefile
# 确认改对了:
grep -E '^CONFIG_PLATFORM_(I386_PC|ARM_RPI)' /usr/src/rtl88x2bu-5.8.7.1/Makefile
2.4 编译安装
sudo dkms build rtl88x2bu/5.8.7.1
sudo dkms install rtl88x2bu/5.8.7.1
sudo modprobe 88x2bu
驱动加载成功后 wlan0 出现,iw list 确认支持 AP 模式。
3. 网络架构设计:为什么不能"一个网段搞定"
这是整个折腾过程里最核心的技术点,必须理解清楚。
3.1 最初的错误设计
一开始把 wlan0(WiFi热点)也配置成 192.168.123.0/24(跟 eth0、机器人 .161 一样的网段),以为这样 WiFi 客户端就能"直接"访问机器人。
这是错的,原因:
eth0和机器人.161是物理上插在同一个交换机上,是真正的同一个广播域,配同网段没问题wlan0的 WiFi 客户端是通过无线电波连接的,跟eth0那根网线是完全不同的物理介质。即使配了相同的 IP 网段,客户端的操作系统仍然会认为"同网段=同一根线",尝试用 ARP 广播直接找.161的 MAC 地址——但这个广播只在 WiFi 信号范围内传播,永远传不到有线那边,所以连 ARP 都解析不出来,数据包根本发不出去
用抓包(tcpdump -i wlan0 icmp)验证:60 秒窗口内,客户端 ping 机器人的请求,Jetson 的 WiFi 网卡上一个包都没收到。证实问题出在客户端根本没把包发出来,而不是转发规则的问题。
3.2 正确设计:不同网段 + 路由
结论:IP 网段只是逻辑编号,能不能"同网段直连"取决于物理拓扑是否真的在同一个广播域。跨物理介质(有线 ↔ WiFi)必须用路由(不同网段 + 网关转发),不能靠"配成同一网段"蒙混过关。
最终方案:
| 接口 | 网段 | 用途 |
|---|---|---|
eth0 | 192.168.123.0/24(静态 .18) | 专职连接机器人本体网络 |
wlan0(go2 热点) | 192.168.124.0/24(.1) | WiFi 客户端接入,与机器人网段隔开 |
WiFi 客户端(外部电脑)配置静态 IP 192.168.124.223/24,网关指向 192.168.124.1(Jetson)。这样电脑发往 192.168.123.161 的包,会正确地发给网关(Jetson),由 Jetson 路由转发过去,而不是徒劳地在 WiFi 网段里找一个根本不存在的设备。
(备注:本来用二层网桥br0把 eth0 和 wlan0 桥接成真正的同一个广播域是"更正规"的解法,试过,但这个 rtl88x2bu 驱动一旦被桥接,AP 模式下客户端 WPA 握手会失败,日志里完全没有握手记录,只能放弃网桥方案,改用路由方案。)
4. Jetson 端配置
4.1 eth0:静态 IP,专连机器人
sudo nmcli connection modify "Wired connection 1" \
ipv4.method manual ipv4.addresses 192.168.123.18/24 ipv4.gateway 192.168.123.1
sudo nmcli connection up "Wired connection 1"
自动连接优先级也调高,避免被另一个残留的 DHCP 连接 profile(Wired connection 2,优先级 -999)抢走:
nmcli connection modify "Wired connection 1" connection.autoconnect-priority 10
4.2 wlan0:go2 热点,独立新网段
用 nmcli 建热点(注意 ipv4.method 用 manual 而不是默认的 shared,这样才能不做 NAT/不跑内置 DHCP,落在指定网段上):
nmcli device wifi hotspot ifname wlan0 ssid go2 password 12345678
nmcli connection modify Hotspot ipv4.addresses 192.168.124.1/24
nmcli connection up Hotspot
开机自动生效 + 5GHz 频段(2.4GHz 默认速度较慢,改成 5GHz 信道 36,非 DFS 信道更稳定):
nmcli connection modify Hotspot \
connection.autoconnect yes connection.autoconnect-priority 100 \
802-11-wireless.band a 802-11-wireless.channel 36
nmcli connection up Hotspot
踩坑提示:GNOME 图形界面的"开启 WiFi 热点"开关,只认
ipv4.method=shared的连接,我们这种manual模式的自定义热点,图形界面会显示成灰色/无法正确识别状态,只能用命令行nmcli/sg netdev管理。
4.3 转发 + NAT 规则
Unitree 定制系统上 iptables 的 FORWARD 链策略是 DROP(标准 Linux 默认是 ACCEPT),需要显式放行两个网卡之间的转发:
sudo iptables -I FORWARD -i eth0 -o wlan0 -j ACCEPT
sudo iptables -I FORWARD -i wlan0 -o eth0 -j ACCEPT
NAT:让机器人 .161 收到的请求看起来像是从 Jetson 自己(192.168.123.18)发出的,这样它才知道怎么回包(因为它压根不认识 192.168.124.0/24 这个陌生网段):
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
4.4 上网:走 WiFi 反向桥接电脑
Jetson 添加一条"备用默认路由",指向电脑在 go2 网络里的 IP(网关),metric 设高一点(比如 500),保证不抢现有路由,只在需要时兜底:
sudo ip route replace default via 192.168.124.223 dev wlan0 metric 500
(这条命令里的 192.168.124.223 就是外部电脑连 go2 之后的静态 IP,见第 5 节。)
4.5 全部写进开机自动执行
把上述除了"建热点"以外的关键项汇总进 /home/unitree/network_fix.sh:
#!/bin/bash
# eth0: 静态,专连机器人网络
sudo nmcli connection modify "Wired connection 1" ipv4.method manual ipv4.addresses 192.168.123.18/24 ipv4.gateway 192.168.123.1
sudo nmcli connection up "Wired connection 1"
# wlan0: go2热点,独立网段
sudo nmcli connection modify Hotspot ipv4.addresses 192.168.124.1/24
nmcli connection up Hotspot
# 上网备用路由:走WiFi桥接电脑
sudo ip route replace default via 192.168.124.223 dev wlan0 metric 500
# 转发规则
sudo iptables -C FORWARD -i eth0 -o wlan0 -j ACCEPT 2>/dev/null || sudo iptables -I FORWARD -i eth0 -o wlan0 -j ACCEPT
sudo iptables -C FORWARD -i wlan0 -o eth0 -j ACCEPT 2>/dev/null || sudo iptables -I FORWARD -i wlan0 -o eth0 -j ACCEPT
# NAT
sudo iptables -t nat -C POSTROUTING -o eth0 -j MASQUERADE 2>/dev/null || sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# DNS修复:手动(manual)网络没有自动DNS,需要显式指定
sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8 1.1.1.1" ipv4.ignore-auto-dns yes
sudo nmcli connection modify Hotspot ipv4.dns "8.8.8.8 1.1.1.1" ipv4.ignore-auto-dns yes
sudo resolvectl dns eth0 8.8.8.8 1.1.1.1
踩坑提示:
eth0/Hotspot都是ipv4.method=manual(静态),静态模式下 NetworkManager 不会自动写入 DNS 服务器,/etc/resolv.conf可能是空的或者指向一个不可用的地址,导致域名解析全部失败(能ping 8.8.8.8但ping www.baidu.com不通)。需要显式指定 DNS 服务器并关闭自动 DNS 覆盖(ipv4.ignore-auto-dns yes)。
再建一个 systemd 服务开机自动跑这个脚本:
sudo tee /etc/systemd/system/network-fix.service << 'EOF'
[Unit]
Description=Go2 Jetson network fix (static eth0 + go2 AP + wifi internet bridge)
After=NetworkManager.service network-online.target
Wants=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/home/unitree/network_fix.sh
User=root
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable network-fix.service
开机网络自愈能力总结:
go2热点:autoconnect=yes+ 最高优先级 → 开机必定自动广播,随时可以 WiFi 连192.168.124.1(SSH / NoMachine)eth0静态 + 转发 + NAT + 上网路由:靠network-fix.service开机自动跑,不需要手动执行任何东西
5. 外部电脑端配置(以 Ubuntu 为例)
电脑本身有线(enp4s0)上真实的网,WiFi(wlo1)连 go2。