# 一边采集脑电、一边联网 —— 双网络接口配置 ## 问题 帽子是个 **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` 可见)。 1. 用数据线把 iPhone 连到 Mac;iPhone → **设置 · 个人热点 · 允许其他人加入** 打开。 (走 USB 线,不占用 Wi-Fi,也比无线热点稳) 2. **系统设置 · 网络 · 右下角「⋯」· 设定服务顺序(Set Service Order)**, 把 **`iPhone USB` 拖到 `Wi-Fi` 上面** → 完成 → 应用。 3. Wi-Fi 连上 **ESPBCI**。 4. 验证:`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 覆写: ```yaml interface-name: en8 # 你的 USB-C 有线网卡;强制所有出站走它 ``` > 别直接改 `~/Library/Application Support/mihomo-party/work/config.yaml` —— 那是**每次加载订阅 > 都会重新生成**的运行时文件,改了会被覆盖。必须用「覆写」才持久。 > > 注意副作用:钉死 en8 后,**拔掉有线网卡代理就会断**(此时把这条覆写关掉即可)。 ### 验证 ```bash 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`**:能临时救急,但重连就没了,不如调服务顺序一劳永逸。 --- ## 采集前一键自检 ```bash python src/acquisition/net_check.py # 单次 python src/acquisition/net_check.py --watch # 每 3 秒刷新(边调边看) ``` 它会列出各接口 IP、默认路由归属,并检查:在不在帽子子网、本机是否为 `192.168.4.2`、 能否 ping 通帽子、能否上网、UDP 2244 是否被占用(厂商 `main_ui` 会抢)。 脚本**只读**,不会改你的网络设置。