joaovorocha/tmobile-g4ar-local-api

GitHub: joaovorocha/tmobile-g4ar-local-api

一个无依赖的 Python 库和 CLI 工具,通过逆向工程的本地 REST API 读取和控制 T-Mobile TMO-G4AR 5G 网关的信号、设备及 WiFi 配置。

Stars: 0 | Forks: 0

# T-Mobile TMO-G4AR 本地 API (Python) 一个轻量级、无依赖的 Python 客户端,用于 **T-Mobile TMO-G4AR** (Arcadyan) 5G 家庭/网关路由器的**本地 REST API**。直接从局域网内的网关 获取信号统计数据、已连接客户端列表、服务小区 ID、SIM 信息和固件版本—— 以及读写 WiFi SSID 配置, 无需云账号。 针对 **固件 1.00.18** 进行了逆向工程。仅使用标准库 (Python 3.9+)。 ## 相关项目 如果你需要**图形界面**,请使用 Zachary Wander 开发的 [**HINTControl**](https://github.com/zacharee/HINTControl) —— 一款精美的跨平台应用 (Android/iOS/桌面端),可通过 相同的 `/TMI/v1/` API 控制 TMO-G4AR 以及其他几款 T-Mobile 家庭互联网网关。本项目则采取了相反的取舍:**没有图形界面**,仅提供一个小巧的、可脚本化的 Python 客户端 + CLI,适用于自动化、仪表盘、Home Assistant、 cron 任务和无头服务器。此处的 reboot endpoint 已根据 HINTControl 的 endpoint 映射进行了确认。 ## 快速开始 ``` cp .env.example .env # 编辑 .env 并设置 TMOBILE_ROUTER_PASSWORD(它在设备贴纸上) python3 cli.py signal python3 cli.py clients python3 cli.py cell ``` 或者将其作为库使用: ``` from tmobile_api import TMobileAPI api = TMobileAPI() print(api.fetch_gateway(get="signal")) # 4G/5G signal + bars print(api.fetch_clients_detail()) # connected devices, per band print(api.fetch_telemetry(get="cell")) # serving cell IDs ``` ## API Base:`http://192.168.12.1`(你网关的管理 IP)。所有内容均位于 `/TMI/v1/` 下。 **认证:** 发送 `POST /TMI/v1/auth/login` 并附带 `{"username": "admin", "password": ""}`, 将返回一个有效期约为 15 分钟的 JWT bearer token。客户端会自动缓存并刷新它, 并在遇到 `401` 时重试一次。 | Endpoint | 获取内容 | |---|---| | `gateway?get=all` / `?get=signal` | 设备信息、4G/5G 信号、运行时间 | | `network/telemetry?get=clients` | **真实的客户端列表**(见下方的坑点) | | `network/telemetry?get=cell` | 正在服务的 4G + 5G 小区 ID | | `network/telemetry?get=sim` | ICCID / SIM 状态 | | `network/configuration/v2?get=ap` / `?set=ap` | WiFi SSID 配置 | | `version` | 固件 / 软件版本 | | `gateway/reset?set=reboot` (POST) | 重启网关 (`reboot_gateway()`) | ## 响应示例 以下数值为**说明性**示例(编造/已脱敏);字段*名称*和 结构均与固件 1.00.18 一致。 `python3 cli.py signal` → `gateway?get=signal`: ``` { "signal": { "4g": {"bars": 4, "bands": ["b2"], "cid": 12, "eNBID": 100000, "pci": 350, "rsrp": -92, "rsrq": -10, "rssi": -64, "sinr": 9}, "5g": {"bars": 3, "bands": ["n41"], "cid": 7, "gNBID": 1234567, "pci": 588, "rsrp": -97, "rsrq": -11, "rssi": -68, "sinr": 6}, "generic": {"apn": "FBB.HOME", "hasIPv6": true, "registration": "registered", "roaming": false} } } ``` `python3 cli.py clients` → `network/telemetry?get=clients`(注意双重嵌套的 `clients.clients`,并且有线设备的 `signal: null`): ``` { "clients": { "clients": { "2.4ghz": [ {"connected": true, "name": "thermostat", "ipv4": "192.168.12.150", "ipv6": [], "mac": "AA:BB:CC:11:22:33", "signal": -58} ], "5.0ghz": [ {"connected": true, "name": "laptop", "ipv4": "192.168.12.142", "ipv6": [], "mac": "AA:BB:CC:44:55:66", "signal": -47} ], "ethernet": [ {"connected": true, "name": "nas", "ipv4": "192.168.12.101", "ipv6": [], "mac": "AA:BB:CC:77:88:99", "signal": null} ] } } } ``` ## 来之不易的坑点(固件 1.00.18) 弄清楚这些问题花费了大量时间——这也是创建此仓库的原因。 - **直接请求 endpoint 会报 400 错误。** 你必须传递一个查询参数,例如 `gateway?get=all`。单独的 `/TMI/v1/gateway` 会返回 `400 "No query specified"`。 - **`/network/clients` 总是返回 `{"clients": []}`**,无论连接了多少 设备。**真实的**列表位于 **`/network/telemetry?get=clients`** → `clients.{2.4ghz,5.0ghz,ethernet}` 数组,包含 `{name, ipv4, ipv6, mac, signal(dBm), connected}`。 - **WiFi 信道不可设置——仅支持自动信道。** 管理 Web UI 完全没有 信道控制功能,`get=ap` 报告 `channel: "Auto"`(这是一种模式,永远不是 数字),并且在手动指定信道时 `set=ap` 会返回 **400** 错误。你无法通过此网关解决 信道拥堵问题。 - **`set=ap` 仅能编辑 SSID 字段:** `ssidName`、`wpaKey`(在 `get=ap` 中为明文)、`isBroadcastEnabled`、`encryptionMode`、`guest`。为了安全写入: 请先读取完整的 `get=ap` 对象,修改其中一个字段,将其 POST 回去,然后再读取 以进行验证,如果不匹配则回滚。(`update_wifi_config()` 是 原始的 POST 操作——读取/验证/回滚的循环需要你自己实现。) - **没有邻区信息。** `telemetry?get=cell` 仅返回*正在服务的* 4G + 5G 小区(gNBID/PCI/TAC/ARFCN/ECGI/CID/RSRP/SINR/bars),从不返回邻区列表—— 因此仅凭此网关无法进行基站三角定位。SIM 的 `imsi` 包含 MCC/MNC(例如 T-Mobile US 的 `310/260`)。 - 此固件中**不存在 DHCP / 防火墙 / 端口转发**控制功能。 - 发生错误时,`request_json` 会抛出 `http_:`,以便你可以读取 网关自身的提示信息,而无需盲目猜测。 ## 安全提示 - 凭据从环境变量 / 本地 `.env` 文件中读取——没有任何内容被 硬编码。**切勿提交你的 `.env` 文件。** - 此代码仅与你局域网内的网关通信。它不会向任何地方发送遥测数据。 - 敏感标识符(IMEI/IMSI/MSISDN/ICCID)会由网关在 `sim` endpoint 上返回——在记录日志或发布之前请务必小心。 ## 许可证 [MIT](LICENSE)。与 T-Mobile 或 Arcadyan 无关,也未获得其认可。 "TMO-G4AR" 和 "T-Mobile" 是其各自所有者的商标;此处使用它们仅是为了 标识本代码所通信的硬件。
标签:5G网关, Python, REST API, T-Mobile, 无后门, 智能家居, 物联网, 网络调试, 自动化, 逆向工具