将旧手机中的 GPS 调制解调器(modem,如 Quectel EG25-G)改造为独立 Web 服务器,是低功耗 IoT 端点的绝佳方案。这些 modem 内置独立 Linux 内核(典型 3.18 版本),资源有限(48MB 存储 / 内存),但支持 root 访问与网络栈,适合静态 HTTP 服务。通过 AT 命令解锁、串口桥接与固件微调,可实现 < 1W 功耗的 standalone 端点,避免高层次 Android app 开销。
1. 硬件拆解与串口暴露
从旧 Android 手机(如 PinePhone)拆下 modem 模块,确保 USB 接口完整。常见 modem 暴露多个串口:/dev/ttyUSB0~3,其中 ttyUSB2 常用于 AT 命令(波特 115200)。使用 USB-to-serial 适配器或直接 USB 连接主机(RPi 或 PC)。
清单:
- Modem 模块(Quectel EG25-G 或类似,支持 ADB unlock)。
- Nano-SIM 卡(开通 GPRS/LTE)。
- GPS/LTE 天线。
- 3.7V 锂电池(支持 AT 低功耗模式)。
- 主机:Raspberry Pi Zero(桥接用)。
连接后,dmesg 观察:modem-power serial1-0: ADB KEY is 'xxxx'。识别 key 值,用于后续 unlock。
2. AT 命令配置与 Root 访问
modem 响应 AT 命令测试:echo -e "AT" > /dev/ttyUSB2,返回 OK。使用 picocom 交互:picocom /dev/ttyUSB2。
解锁 ADB root:
AT+QADBKEY="WUkkFzFSXLsuRM8t" # 替换为dmesg中key生成
AT+QCFG="usbcfg",0x2C7C,0x125,1,1,1,1,1,1,0
返回 OK 后,主机安装 adb:adb devices见设备,adb shell进入 root shell(/ #提示)。
证据:在 Quectel modem 中,此序列启用 adbd root 模式,直接暴露 Linux shell。
配置网络 / GPS:
- 信号:AT+CSQ(阈值 > 15,99,避免 < 10 重启)。
- GPS:AT+CGPS=1;AT+CGPSINFO(室外冷启动 < 60s)。
- 低功耗:AT+CFUN=4(飞行模式,仅 GPS);AT+CFUN=1(全功能)。
3. 部署轻量 Web 服务器
modem 资源紧缺,交叉编译 darkhttpd(单二进制,静态 musl 链接):
- 工具链:armv7l-linux-musleabihf。
- 编译:
make CC=armv7l-linux-musleabihf-gcc。 - adb push:
adb push darkhttpd /usrdata/;adb push site/ /usrdata/www/。
modem shell 启动:darkhttpd /usrdata/www --port 80。后台:nohup darkhttpd ... &。
桥接暴露:
- adb forward:
adb forward tcp:8080 tcp:80(仅 loopback)。 - iptables:
sysctl -w net.ipv4.conf.all.route_localnet=1;iptables -t nat -I PREROUTING -p tcp --dport 8080 -j DNAT --to 127.0.0.1:80。
串口桥接(无 adb):主机 socat socat TCP-LISTEN:8080,fork /dev/ttyUSB2,raw,echo=0;modem 运行 netcat 监听。
测试:curl localhost:8080,返回静态页。吞吐~10Mbps(iperf 基准)。
4. 低功耗固件优化与监控
目标 < 500mW 待机。参数:
- AT+CPSMS=1(PSM 模式,休眠 3.2uA)。
- AT+CFUN=0(最小功能,仅定时唤醒)。
- 固件阈值:固件版本 AT+CGMR>EG25GGBRxx(支持低功耗)。
监控脚本(主机 Python):
import serial, time
ser = serial.Serial('/dev/ttyUSB2', 115200)
while True:
ser.write(b'AT+CSQ\r\n')
resp = ser.read(100)
if b'+CSQ: ' in resp and int(resp.split(b',')[0].split(b':')[1]) < 10:
# 重启modem: AT+CFUN=1,1
print("信号弱,重启")
time.sleep(60)
风险阈值:温度 > 60°C(AT+QMTS)关机;功耗 > 1W 日志告警。回滚:AT+CRESET 复位。
风险:
- 过热:连续服务 > 1h,监控 AT+QPWRD。
- 稳定性:ADB 断连,重插 USB。
此方案落地周期 < 2h,成本 < 50 元。相比 Termux+Caddy,低层访问更省电,适合野外 IoT。
资料来源:
- nns.ee modem-blog:PinePhone Quectel root 与 web 部署实操。
- HN 讨论:news.ycombinator.com/item?id=...(GPS modem web server)。
- Quectel AT 手册:AT+CGPS/AT+CFUN 参数。
(正文约 1050 字)