一边采集脑电、一边联网 —— 双网络接口配置
问题
帽子是个 Wi-Fi 热点(ESPBCI),电脑必须连上它才能收数据。但 Mac 只有一块 Wi-Fi 网卡, 连了 ESPBCI 就等于把默认路由交给了这个没有外网的热点 → 采集时断网,没法查资料 / 跑 Claude Code / 同步代码。
根因不是"只能连一个网络" —— macOS 支持多个接口同时工作。真正的问题是 默认路由(default route)只有一个,而 macOS 按「服务顺序 Service Order」决定给谁。 ESPBCI 的 DHCP 会下发网关 192.168.4.1,如果 Wi-Fi 排在最前面,默认路由就被它抢走了。
解法:让另一个接口拿默认路由(负责上网),Wi-Fi 只保留 192.168.4.0/24 这条子网路由(负责帽子)。 两者互不干扰,可以同时用。
方案 A(推荐,零成本):iPhone USB 网络共享
你的 Mac 上已经有 iPhone USB 这个网络服务(networksetup -listnetworkserviceorder 可见)。
- 用数据线把 iPhone 连到 Mac;iPhone → 设置 · 个人热点 · 允许其他人加入 打开。 (走 USB 线,不占用 Wi-Fi,也比无线热点稳)
- 系统设置 · 网络 · 右下角「⋯」· 设定服务顺序(Set Service Order),
把
iPhone USB拖到Wi-Fi上面 → 完成 → 应用。 - Wi-Fi 连上 ESPBCI。
- 验证:
python src/acquisition/net_check.py应显示 ✅ 帽子 + 互联网 同时在线。
这个顺序调一次就长期有效:没插线时 Wi-Fi 依然正常上网;插上线采集时,上网自动走 iPhone。
方案 B(最稳):USB-C 有线网卡
同方案 A,只是把 iPhone USB 换成 Ethernet / USB 10/100/1000 LAN,拖到 Wi-Fi 之上。
有线最稳定、延迟最低,长时间采集推荐。
方案 C(可选加固):给 Wi-Fi 设静态 IP、清空路由器字段
系统设置 · 网络 · Wi-Fi · 详细信息 · TCP/IP:
- 配置 IPv4:手动
- IP 地址
192.168.4.2,子网掩码255.255.255.0 - 路由器一栏留空 ← 关键:Wi-Fi 就永远不会抢默认路由
两个额外好处:
- 板子只往
192.168.4.2发数据,静态 IP 保证你一定拿到 .2(不会因为别的客户端占用而变成 .3/.4) - 不依赖服务顺序也能保证外网走别的口
⚠ 注意:TCP/IP 设置是按网络服务(整个 Wi-Fi)生效,不是按 SSID。设了静态 IP 后连家里
Wi-Fi 会不通。解决办法:用 网络位置(Location) —— 系统设置 · 网络 · ⋯ · 位置 · 编辑位置,
新建一个叫 EEG 的位置照上面配置;日常用「自动」,采集时从 苹果菜单 · 位置 一键切到 EEG。
⚠ 连上 ESPBCI 后 Clash 代理失效 —— 原因与修复
症状:有线网卡已接、排序也对,连上 ESPBCI 后帽子能连、也能上网,但 Clash 代理不起作用了。
实测诊断(net_check.py + networksetup):
| 检查项 | 结果 |
|---|---|
有线 SZNX LAN 100M (en8) 持有默认路由 |
✔ 192.168.31.238 → 192.168.31.1 |
| Clash Party(mihomo 内核)监听 7890 | ✔ |
mihomo tun.enable |
false(纯系统代理模式) |
mihomo interface-name |
未设置 → 由 mihomo 自动探测出站网卡 |
| Wi-Fi 服务的 IPv4 配置 | DHCP |
根因:ESPBCI 会下发一个"竞争性默认网关" 192.168.4.1。
Wi-Fi 走 DHCP,一连上 ESPBCI 就把 192.168.4.1 装成了网关。mihomo 在网络变化时会
重新自动探测出站网卡,很容易改绑到这条死路(ESPBCI 根本没有外网)。于是:
- 走代理的流量(以及 mihomo 自己的 DoH DNS
https://doh.pub/dns-query)全部发往 ESPBCI → 失败 - 命中
DIRECT规则的流量仍走 en8 → "能上网,但代理不起效"
修复(推荐:根除竞争网关)
系统设置 · 网络 · Wi-Fi · 详细信息… · TCP/IP
- 配置 IPv4:手动
- IP 地址:
192.168.4.2子网掩码:255.255.255.0 - 路由器:留空 ← 关键
- 再到 DNS 标签页:把 DNS 服务器全部删除(留空)
保存后:Wi-Fi 只提供 192.168.4.0/24 这条子网路由(够连帽子),永远不会成为默认路由候选,
mihomo 就只能继续用 en8 出站,代理正常。顺带保证你一定拿到 192.168.4.2(板子只往 .2 发数据)。
Wi-Fi 的 TCP/IP 设置是按整个服务生效、不是按 SSID。设完之后连家里 Wi-Fi 会不通。 用网络位置解决:系统设置 · 网络 · ⋯ · 位置 · 编辑位置 · 新建
EEG用上面的配置; 日常留在「自动」,采集时从 菜单 · 位置 一键切到EEG。
加固(可选):把 mihomo 出站网卡钉死
Clash Party · 设置 · 覆写(Override) · 新建一个 YAML 覆写:
interface-name: en8 # 你的 USB-C 有线网卡;强制所有出站走它
别直接改
~/Library/Application Support/mihomo-party/work/config.yaml—— 那是每次加载订阅 都会重新生成的运行时文件,改了会被覆盖。必须用「覆写」才持久。注意副作用:钉死 en8 后,拔掉有线网卡代理就会断(此时把这条覆写关掉即可)。
验证
python src/acquisition/net_check.py
连上 ESPBCI 后应当看到:✅ 帽子 + 互联网 同时在线 + 代理区 ✔ 通过代理能出网 (CONNECT),
且 ✔ Wi-Fi 不会抢默认网关。
方案 D(长期最优):请厂商加 STA(客户端)模式固件
让板子主动加入你家的 Wi-Fi,而不是自己开热点。这样:
- Mac 一直待在家里 Wi-Fi,网络完全正常,不用任何切换
- 板子从路由器拿一个 IP(如 192.168.31.x),代码里把
--host改成那个 IP 即可,其余逻辑不用动 - 顺带还能解决"多台设备同时看数据"的问题
参考实现:third_party/Cerelog/(同为 ESP32 + ADS1299)的 esp_hostfw.ino 就带 STA 模式 + TCP。
建议一并请厂商加 TCP 流模式(见 research/Cerelog_adaptation_notes.md),UDP 丢包问题一起解决。
方案 E:采集机 / 主力机分离
一台旧笔记本或树莓派连 ESPBCI 专职采集,通过有线网 / LSL 把数据转发给主力 Mac。 最灵活但最麻烦,只有前面都不可行时再考虑。
不推荐
- USB Wi-Fi 网卡:macOS(尤其 Apple Silicon)第三方 Wi-Fi 网卡驱动支持很差,容易翻车。
- 手工
route add:能临时救急,但重连就没了,不如调服务顺序一劳永逸。
采集前一键自检
python src/acquisition/net_check.py # 单次
python src/acquisition/net_check.py --watch # 每 3 秒刷新(边调边看)
它会列出各接口 IP、默认路由归属,并检查:在不在帽子子网、本机是否为 192.168.4.2、
能否 ping 通帽子、能否上网、UDP 2244 是否被占用(厂商 main_ui 会抢)。
脚本只读,不会改你的网络设置。