Hotdry.
systems-engineering

将旧手机GPS调制解调器改造为独立Web服务器:AT命令、串口桥接与低功耗优化

利用Quectel等GPS modem内置Linux,通过AT命令root shell、串口桥接部署低功耗IoT Web端点,提供硬件清单、参数阈值与监控脚本。

将旧手机中的 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=1iptables -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 复位。

风险

  1. 过热:连续服务 > 1h,监控 AT+QPWRD。
  2. 稳定性: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 字)

查看归档