File size: 6,824 Bytes
d37c079 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 | # 一边采集脑电、一边联网 —— 双网络接口配置
## 问题
帽子是个 **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` 会抢)。
脚本**只读**,不会改你的网络设置。
|