折腾时间:约 4 小时
环境:Raspberry Pi 5 + RasPBX (Asterisk 22.3.0) + Quectel EC20 模块
关键词:chan_quectel
、ttyUSB2
、ModemManager
、ALSA、AT command failed、音频设备缺失
起因:RasPBX + Quectel 直连方案
近期在树莓派上部署 RasPBX,并尝试通过 chan_quectel
让 Asterisk 直接通过 Quectel 模块接打电话、发短信、跑 USSD。
一切看上去都很简单,直到我运行 asterisk -rvvv
后,开始了一段令人头秃的调试之旅。
问题逐一炸出
1. 设备无法打开:Device or resource busy
提示:
unable to open /dev/ttyUSB2: Device or resource busy
原因分析:
系统启动后 /dev/ttyUSB2
被系统服务占用,最常见的是 ModemManager
。
解决方法:
sudo systemctl stop ModemManager
sudo systemctl disable ModemManager
检查是否仍被占用:
fuser /dev/ttyUSB2
lsof /dev/ttyUSB2
2. 音频设备无法打开:ALSA 报错
提示:
snd_pcm_open failed: No such device
Problem opening ALSA capture device hw:CARD=Android,DEV=0
原因分析:
默认 chan_quectel
启用了音频功能,但系统中并没有 CARD=Android
的声卡,或该卡未插入耳麦、配置无效。
解决方法: 修改配置文件 /etc/asterisk/chan_quectel.conf
,关闭音频功能:
[general]
use_sound=no
[quectel0]
use_voice=no
可选方案(如确实需要音频):启用 dummy 声卡
sudo modprobe snd-dummy
3. AT 命令失败:expected response 'OK'
提示:
Error write command 'AT' expected response 'OK' length 3, cancel
Error adding initialization commands to queue
排查思路:
- 用
minicom -D /dev/ttyUSB2
手动测试是否能返回OK
- 确认
/dev/ttyUSB2
是否为 AT 通道(dmesg | grep ttyUSB
) - 有些模块实际 AT 通道为
/dev/ttyUSB3
最终方案: 配置文件指定正确端口:
device=/dev/ttyUSB2
如果串口不确定,可创建别名:
ls -l /dev/serial/by-id/
最终可用配置文件
[general]
debug=yes
use_sound=no
codec=alaw
samplerate=8000
timeout=5000
sms_charset=UCS2
sms_load=no
[quectel0]
device=/dev/ttyUSB2
number=Unknown
enabled=yes
use_voice=no
use_sms=yes
use_ussd=yes
initdelay=1000
answerdelay=2
ringduration=60
ringdet=clip
实用指令备忘
# 检查串口分配情况
dmesg | grep ttyUSB
# 查看是否被占用
lsof /dev/ttyUSB2
fuser /dev/ttyUSB2
# 手动测试 AT 通信
minicom -D /dev/ttyUSB2
# 重启 Asterisk
sudo systemctl restart asterisk
# Asterisk 控制台调试
asterisk -rvvv
quectel show devices
总结
理论上这是一个“插上就能跑”的方案,实际上你需要和 Linux 的串口、alsa、模块分配、udev、ModemManager 各种奇怪的机制周旋一整天。
但一旦调通,它的稳定性和功能性在嵌入式项目中几乎无可替代。
下一步计划:
- 增加短信自动上报脚本
- 使用
extensions_custom.conf
实现语音呼叫转接 - 对接外部 Web 短信通知系统
如果你也在 RasPBX 上调 Quectel,希望这份记录能让你少踩几个坑。如果你还卡住,欢迎留言,我陪你继续 debug。