让 Mac 插上大疆 QDC507 4G 模块,变成一台真正的"蜂窝版 Mac":收发短信、拨打电话、实时网速与流量统计,外加 macOS 菜单栏常驻信号/网速显示。
无需内核驱动、无需 .kext,纯 Python + pyusb 直接操作 USB 端点;内置 macOS 原生 App(pywebview)与手机端 PWA,底部四 Tab(状态 / 短信 / 通话 / 更多)交互。
- 📨 短信收发:文本模式收发、会话式聊天视图、已发短信持久化留存
- 📞 语音通话:拨号 / 接听 / 挂断 / DTMF 按键、通话记录(含时长)、来电浮层
- 📊 实时网速:基于基带计数器
AT+QGDCNT的真实上下行速率 + 折线图 - 📈 流量统计:今日 / 本月 / 模块累计消耗,可一键清零
- 🖥 macOS 菜单栏:常驻信号格数 + ↓↑ 实时网速,菜单含今日/本月流量
- 📱 手机端 PWA:局域网内 iPhone/iPad 通过浏览器访问,iOS 原生风 UI,支持 PIN 鉴权
- 🛰 GPS 定位:开关模块 GPS、读取经纬度并在地图展示
- ⌨️ AT 控制台:内置 AT 指令调试台,附常用快捷指令
- 🔄 自动重连:模块拔插后自动恢复
- 大疆(DJI Cellular / 百旺 QDC507)4G 模块
VID=0x2CA3, PID=0x4006,固件实测QDC507GLEFM21- AT 指令端口为 Interface 2,端点
0x03(写)/0x84(读)
- 一张可用的 SIM 卡
- macOS(Intel / Apple Silicon 均可)
⚠️ 其他型号模块的VID/PID/接口号/端点可能不同,需调整sms_server.py顶部的常量。
# macOS 安装 libusb(pyusb 依赖的系统库)
brew install libusb
# 安装 Python 依赖
pip install -r requirements.txt
# 启动(会自动打开浏览器)
bash start_web.shbash build_app.sh # 生成 ~/Applications/DJiPhone Kit.app浏览器打开 http://localhost:8080(手机端 <http://<Mac 的 IP>>:8080/m),即可收发短信、拨打电话。
上面那套是「Mac 本地收发」。如果你想让 iPhone 直接用模块的号码打电话、收短信,
用 cellbridge-mac/ —— 它在 Mac 上跑一个 SIP 网关,YakPhone 作为 SIP 话机接入,
来电走 CallKit 系统来电界面,短信双向同步。
./install.sh # 一键安装:查依赖 → 拉上游 → 打补丁 → 编译网关/音频桥/控制台
./install.sh --force # 全部重新编译装完双击 CellBridge Console.app(原生 AppKit 控制台):
- 顶部一键部署:启动 / 停止 / 重启 / 重编译 / 体检 / 打开日志与目录
- 概览:网关、AT 桥、音频桥、语音路由、SIP 注册新鲜度、推送状态六张状态卡
- 短信:记录列表 + 直接发短信(走 SIP MESSAGE,与 YakPhone 同一通道)
- 通话 / 音频 / 日志:通话记录、音频链路实时帧率、日志尾部
- 参数:粘贴 YakPhone 的 PushKit token、验证推送、一键体检
命令行等价物:
| 命令 | 用途 |
|---|---|
cellbridge-mac/start_cellbridge.sh |
启动全栈(stop 停止) |
cellbridge-mac/doctor.sh |
只读体检,不碰串口 |
cellbridge-mac/set-push-token.sh |
写入 PushKit token |
cellbridge-mac/test-push.sh |
不打电话验证 token 是否有效 |
cellbridge-mac/rebuild-gateway.sh |
重新编译网关(含 go test) |
cellbridge-mac/send-sms.py <号码> <正文> |
命令行发短信 |
完整说明与修复记录见 cellbridge-mac/README-mac.md。
⚠️ CellBridge 与 DJiPhone Kit App 互斥:两者都独占模块的 USB AT 接口(Interface 2),start_cellbridge.sh会自动先退出 App。
DJiPhone Kit/
├── install.sh # 一键安装(依赖检查 → 编译网关/音频桥/控制台)
├── sms_server.py # Flask 后端核心(USB 通信 + 短信 + 通话 + 流量 + GPS + 局域网鉴权)
├── app.py # pywebview 桌面壳(加载本地 UI + 菜单栏状态项)
├── menubar.py # macOS 菜单栏常驻项(pyobjc NSStatusItem:信号格 + 网速)
├── index.html # 桌面端前端(底部四 Tab,macOS 原生设计语言)
├── mobile.html # 手机端 PWA(底部四 Tab,iOS 原生设计语言)
├── voice_audio_bridge.swift # Mac 通话音频桥(CoreAudio 8kHz 双工)
├── voice_runtime.py # 通话音频辅助
├── build_app.sh # 一键打包 macOS App 脚本
├── sms_tool.py # 命令行短信工具(status/send/list/read/delete)
├── probe_eg25g.py # USB 设备探测脚本
├── diagnose_network.py # 4G 网络诊断脚本
├── fix_network.py # 4G 网络修复脚本(重启数据连接)
├── cellbridge-mac/ # ★ iPhone 分机方案(SIP 网关 + 原生控制台)
│ ├── CellBridgeConsole.swift # 原生 AppKit 控制台(一键部署 + 状态 + 发短信)
│ ├── gateway-patched/ # 上游网关的 macOS 修复补丁源码
│ ├── rebuild-gateway.sh # 拉上游 + 打补丁 + go test + 编译
│ ├── start_cellbridge.sh # 启动全栈(AT 桥 + 音频桥 + 网关)
│ ├── at_pty_bridge.py # USB AT ↔ PTY 串口桥
│ ├── doctor.sh # 只读体检
│ ├── send-sms.py # SIP MESSAGE 发短信
│ ├── set-push-token.sh # 写入 YakPhone PushKit token
│ ├── test-push.sh # 验证推送 token
│ ├── build_console.sh # 构建 CellBridge Console.app
│ └── README-mac.md # 移植说明 + 12 处根因修复记录
├── PROCESS.md # 开发过程记录(含固件踩坑)
├── requirements.txt # Python 依赖
└── LICENSE
macOS 缺少 CDC-ACM 串口驱动,无法识别模块的 vendor-specific(class 0xFF)接口。本项目通过 pyusb + libusb 直接读写 USB bulk 端点,在用户态发送 AT 指令,完全绕过内核驱动:
枚举 USB 设备 → 找到 AT 指令接口 → write 端点发 AT → read 端点读响应
后台用 Flask 包一层 REST API,前端通过 HTTP 轮询实现实时交互;流量统计直接读模块基带计数器 AT+QGDCNT(注意:该固件返回的是字节而非文档标注的 KB)。
模块的 USB 音频接口默认关闭,需先开启一次(配置会持久化):
AT+QCFG="usbcfg",0x2CA3,0x4006,1,1,1,1,1,0,1 # 最后一个参数 audio=1
AT&W # 保存
AT+CFUN=1,1 # 重启模组生效重启后 macOS 会识别出 USB 音频设备(8000Hz 电话音质),通话时在「系统设置 → 声音」选择即可。
更多固件怪癖与调试记录见 PROCESS.md。
EG25-G 的 RNDIS/ECM 网卡 DHCP 服务可能卡死。给 Mac 网卡配静态 IP 绕开 DHCP,或运行 fix_network.py 重启模块数据连接。
固件会残留空号码的 active 状态(phantom call),且挂断后 2 秒内仍报 dialing。后端已加入 phantom call 过滤 + 挂断冷却期双重保护。
该固件返回 +CME ERROR: 501,属固件行为;开启(AT+QGPS=1)与读数(AT+QGPSLOC?)均正常。
本项目站在以下优秀项目的肩膀上,感谢这些作者的开源分享:
| 项目 | 作者 | 借鉴内容 |
|---|---|---|
| DJOneHub | ZenGeekLabs | 模块 USB 模式识别与设置面板设计思路 |
| CellDock | celldock | 菜单栏状态项、短信/通话交互设计参考 |
| NasAnySim | @mccding | 移动端 PWA UI 风格与自托管蜂窝网关思路 |
| mac-4g-modem | zxd | pyusb 用户态 AT 通信的最初实现基础 |
同时感谢社区里所有研究 QDC507 / VoHive / MaVo 生态的玩家,你们公开的踩坑记录让后来者少走了很多弯路。
欢迎提交 Issue 和 Pull Request!提交前请确认不要包含任何个人隐私数据(call_history.json、sent_sms.json 等运行时数据已被 .gitignore 排除)。
本项目是独立开发的非官方开源项目,未获得 DJI 的授权、赞助或认可,与 DJI、Quectel、运营商或 eSIM 设备厂商不存在隶属或合作关系。
DJI 及相关产品名称是其各自权利人的商标,仅用于说明兼容,不代表任何商业关联或背书。请遵守当地法律法规使用短信/通话功能,录制通话前请征得对方同意。