在Asterisk 中,通常打电话都是建立在通道与通道之间,pbx 只是中转作用,那pbx 有没有办法直接与分机通话呢?有的,那就是使用chan_alsa 。
要求pbx 板子有麦克风和耳机接口,并且安装了alsa声卡驱动,alsa 是 linux 系统下的声卡驱动框架,也叫asoc。
如何使用?
- 加载chan_alsa.so
- 按需修改 /etc/asterisk/alsa.conf (一般使用默认即可)
- 修改拨号规则 /etc/asterisk/extensions.conf
- 自动接听
- 发起呼叫
1. 加载chan_alsa.so
1.1 asterisk -rvvvvvddddd 进入 cli 命令行,(输入quit 可退出 cli)
1.2 在cli 命令行输入 module load chan_alsa.so
1.3 如果加载失败,可能是因为已经加载了 chan_oos.so,与 chan_alsa.so 不能共存,
解决办法:先 module unload chan_alsa.so
1.4 如果报 snd_pcm_open 失败,检查声卡是否被其它进程占用
2. 按需修改 /etc/asterisk/alsa.conf (一般使用默认即可)
3. 修改拨号规则 /etc/asterisk/extensions.conf
[from-internal]
;当 sip 拨号 9000 时,接通到 Console,Console 就对应于ALSA, x 无任何意义,其实任意字母都可以
exten => 9000.,1,Dial(Console/x,30)
same => n,Hangup()
;...省略....
;这里之所以是local ,是因为alsa.conf 定义了 context=local
[local]
exten => s,1,Dial(SIP/6001,60) ; 使用Console 发起呼叫时,转接到SIP/6001
same => n,Hangup()
;当console dial 6001123456时,SIP/6001来电显示号码123456
exten => _6001X.,1,Set(CALLERID(number)=${EXTEN:4})
same => n,Dial(SIP/6001,60)
same => n,Hangup()
4. 自动接听
alsa.conf 中默认 autoanswer=yes
当sip/6001 拨号 9000 时,alsa 会立即接通,无等待。这是通过耳机(带麦克风)接到pbx 上可以与sip/6001 进行通话。
5. 发起呼叫
有三种方法:
5.1 进入cli ,输入命令 console dial 6001123456
5.2 不用进入cli, asterisk -rx “console dial 6001123456” 其实跟方法本质一是一样的,只不过是在cli外面
5.3 使用 call file
在 /var/spool/asterisk/ 目录下新建 tmp/test.call 文件
cd /var/spool/asterisk/
mkdir tmp
vi tmp/test.call
Channel: SIP/6001
CallerID: 123456
Context: from-internal
Extension: 9000
Priority: 1
cp tmp/test.call outgoing
asterisk 内部有线程会一直检查 outgoing 目录是否有call 文件,有就解析call 文件,并发起呼叫。
参考资料:
Asterisk config alsa.conf - VoIP-Info
https://www.voip-info.org/asterisk-config-alsaconf/
Asterisk auto-dial out - VoIP-Info
https://www.voip-info.org/asterisk-auto-dial-out