EEG_MI / docs /network_setup.md
Twu31's picture
Mirror of github.com/twu3202/EEG_MI at 66726e1
d37c079 verified
|
Raw
History Blame Contribute Delete
6.82 kB
# 一边采集脑电、一边联网 —— 双网络接口配置
## 问题
帽子是个 **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` 会抢)。
脚本**只读**,不会改你的网络设置。