tpsaradhi/wifi_device_control
GitHub: tpsaradhi/wifi_device_control
一款用于精准控制家庭路由器上单台设备上网权限的工具,包含原生 Android 应用和 Python Web 应用,支持 MAC 级别的封锁与解封。
Stars: 0 | Forks: 0
# wifi-device-control
一个精简的、适合手机使用的 Web 应用程序,用于**停止/启动特定设备的 WiFi 网络访问权限**
在你的家庭网络中——它就像是你路由器 MAC 过滤器的一个轻量级遥控器。
最初是为 **Airtel Nokia G-2425G-A** GPON 路由器构建的,但路由器特定的逻辑是一个
单一的可插拔 driver,因此无需改动其余部分即可添加对其他路由器的支持。
- 📱 移动优先的 Web UI —— 点击设备即可将其封锁,再次点击即可解封
- 🏷️ 为设备提供友好的名称(路由器仅显示 MAC)
- 🔌 纯 Python —— 通过普通的 `pip install` 安装,**无需 C/Rust 编译器**(可通过
Termux 运行在手机、Raspberry Pi、NAS 或你的 PC 上)
- 🧱 封锁机制位于**路由器**上,因此即使此应用未运行,它仍会保持强制执行状态
## 📱 原生 Android 应用 —— “WiFi Warden”
还有一个独立的**原生 Android 应用**(Kotlin/Jetpack Compose),它**直接**与
路由器通信 —— 无需服务器,无需 Termux,安装一个 APK 即可。它能在
**不断开所有人 Wi-Fi 的情况下**封锁设备的互联网(通过路由器的 IP 过滤器,支持 IPv4 + IPv6),跨 IP 更改通过 MAC 跟踪设备,显示每台设备的
**制造商**,并支持友好名称和可选的 PIN。
- **下载:** 从[发布页面](../../releases)获取最新的 APK 并进行侧载
(允许“从未知来源安装”)。
- **要求:** 一台 **Airtel Nokia G-2425G-A** 路由器以及一部连接到同一家庭 Wi-Fi 的手机。(内置的
*mock* 模式可让你在没有路由器的情况下探索 UI。)
- 源码及构建详情:[`android/`](android/)。目前它还是 debug/test 构建 —— 非常欢迎提供反馈。
## 工作原理
```
phone browser ──HTTP──> this app ──encrypted HTTP──> router admin (192.168.1.1)
│ │
SQLite (friendly names) Wi-Fi MAC filter (enforces block)
```
路由器自身会全天候强制执行封锁。此应用只需在你**拨动开关的那一刻**可被访问 —— 因此它可以运行在你的手机等小型设备上。
### Nokia G-2425G-A driver
路由器的 Web 管理界面会加密每一个请求(AES-128-CBC payload + RSA-1024 key),并将
session 绑定到你的客户端 IP。该 driver 复现了该机制,并在
*Deny* 模式下驱动 **Security → MAC Filter → Wi-Fi SSID** 过滤器(经验证确实能将设备取消关联)。它会在所有 Deny 模式的 SSID 上执行封锁,涵盖 2.4GHz + 5GHz。
## 设置
### 1. 获取代码并安装
```
git clone wifi_device_control
cd wifi_device_control
pip install -e .
```
### 2. 配置
```
cp config.example.toml config.toml
```
使用你的路由器地址和登录信息编辑 `config.toml`(此文件已被 gitignore):
```
[router]
driver = "nokia_g2425ga"
host = "192.168.1.1"
username = "admin"
password = "YOUR_ROUTER_PASSWORD"
[app]
host = "0.0.0.0"
port = 8000
database = "data/devices.db"
```
### 3. 运行
```
python -m uvicorn app.main:app --host 0.0.0.0 --port 8000
```
从同一 WiFi 下的任何设备打开 `http://:8000`。
## 在你的手机上运行(Termux) —— 无需 PC
如果你没有一直开着的电脑,这是推荐的设置方案。你的手机将成为 host;
只要你在家里,就可以随时在手机自带的浏览器中打开该应用。
1. 从 [F-Droid](https://f-droid.org/packages/com.termux/) 安装 **Termux**(Play Store 的
构建版本已过时)。
2. 将项目文件夹传输到手机上(例如传输 `*_dist.zip`),然后在 Termux 中:
pkg install -y unzip
termux-setup-storage # 点击“允许”
cd ~ && unzip ~/storage/downloads/wifi_device_control_dist.zip
cd wifi_device_control
bash scripts/setup-termux.sh # 安装依赖 + 询问路由器 IP/用户名/密码 + PIN
3. 选择运行方式:
- **按需运行(省电,推荐个人使用):** 从 F-Droid 安装
**Termux:Widget** 应用,将其 widget 添加到你的主屏幕,然后点击
**“WiFi Control”**。它会在点击时启动服务器,打开应用,并
**在闲置时自动停止**(配置中的 `idle_shutdown`) —— 无需 wake-lock,耗电量几乎为零。
- **常驻运行(方便家人随时访问):** `bash scripts/run-termux.sh`(会持有
wake-lock,以便在手机休眠时仍可访问 —— 耗电量更大)。
4. 打开 **`http://127.0.0.1:8000`** → 输入你的 PIN → 点击进行封锁/解封。WiFi 上的其他手机
使用它打印出的 `http://192.168.x.x:8000` 地址访问(仅在其运行时有效)。
**开机自动启动(可选):** 安装 *Termux:Boot* 应用,然后创建
`~/.termux/boot/start-wdc.sh`:
```
#!/data/data/com.termux/files/usr/bin/sh
termux-wake-lock
cd ~/wifi_device_control && python -m uvicorn app.main:app --host 127.0.0.1 --port 8000
```
赋予其可执行权限:`chmod +x ~/.termux/boot/start-wdc.sh`。
**注意事项:**
- 只有当手机连接到你的**家庭 WiFi** 时才有效(该路由器仅限 LAN 访问)。脱离该
网络时,应用会显示“无法连接到路由器”的横幅 —— 这是正常的。
- 不要封锁**作为 host 的手机自身**的 MAC,否则它会失去与路由器通信所需的 WiFi 连接。
- 切换操作大约需要 ~10–40 秒 —— 路由器会在每次更改时重新应用其 WLAN 配置。
## 为其他路由器添加支持
在一个新模块中实现 `RouterDriver` 的五个方法(`app/drivers/base.py`),然后
在 `app/drivers/__init__.py` 中注册它:
```
class RouterDriver(ABC):
def login(self) -> None: ...
def list_devices(self) -> list[Device]: ...
def list_blocked(self) -> list[str]: ... # source of truth for block state
def block(self, mac: str) -> None: ... # idempotent, all bands
def unblock(self, mac: str) -> None: ... # idempotent
```
其他所有内容(store、service、UI)都仅依赖于这个接口。请参阅 `mock.py` 了解最简单的示例,以及 `nokia_g2425ga.py` 了解一个真实的、逆向工程的实现。
## 开发
```
pip install -e ".[dev]"
pytest # offline tests (crypto, parsers, UI against the mock driver)
python scripts/smoke_driver.py # read-only live test against the configured router
```
## 许可证
MIT —— 详见 [LICENSE](LICENSE)。
标签:Android应用, Jetpack Compose, Kotlin, Python, 无后门, 路由器控制, 逆向工具