Asterisk 与 FreePBX:通过 chan_dongle 收发短信
**警告。**本方案依据 Asterisk 和 chan_dongle 的文档编写,尚未在真实的 PBX 上试过。请把它当作起点,测试时留意 Asterisk 控制台(asterisk -rvvv)。
工作原理
- 收到短信时,chan_dongle 会在
dongle.conf中context=指定的上下文里、以分机sms启动一个拨号计划通道。发送方号码在CALLERID(num)中,正文在${SMS}中。 - 拨号计划用
MessageSend把它变成 SIP MESSAGE,发往 PJSIP endpoint(即分机号)。 - Asterisk 把 MESSAGE 发到该分机注册的 Contact,路径与 INVITE 相同。因此只要 MacroSIP 以该分机号注册,消息就会到达 MacroSIP。
- MacroSIP 的回复以 MESSAGE 的形式到达 PBX,进入该 endpoint 的
message_context。拨号计划在那里把它转给另一个分机,或用DongleSendSMS通过调制解调器发出。
FreePBX
FreePBX 没有这方面的图形界面。把拨号计划写入 /etc/asterisk/extensions_custom.conf,把 endpoint 选项写入 /etc/asterisk/pjsip.endpoint_custom_post.conf,然后执行 fwconsole reload。
配置
; extensions_custom.conf
; incoming SMS from the modem -> extension 1001
[from-dongle-sms] ; the same name as context= in dongle.conf
exten => sms,1,NoOp(SMS from ${CALLERID(num)}: ${SMS})
same => n,Set(MESSAGE(body)=${SMS})
same => n,MessageSend(pjsip:1001,${CALLERID(num)})
same => n,Hangup()
; messages from MacroSIP: to other extensions, or out through the modem
[messages]
exten => _XXXX,1,MessageSend(pjsip:${EXTEN},${MESSAGE(from)})
same => n,Hangup()
exten => _+X.,1,DongleSendSMS(dongle0,${EXTEN},${MESSAGE(body)})
same => n,Hangup()
; pjsip.endpoint_custom_post.conf
[1001](+)
message_context=messages
请把 1001、dongle0 和号码匹配模式换成您自己的。
在 MacroSIP 中的表现
- 短信显示为来自该电话号码的消息。须在设置 › 通用 › 消息中开启消息功能。
- 回复通过同一账户发出。
- 已发送表示 PBX 已接受该消息,其余由调制解调器和运营商决定。
- 没有
message_context时,从 MacroSIP 发出的消息会进入该分机的普通上下文,通常会被拒绝。MacroSIP 随后显示未发送及 SIP 状态码。
已知限制
- 如果同一分机在两台设备上注册,哪一台收到 MESSAGE 取决于 Asterisk 版本和 AOR 设置,请自行测试。
- 仅支持纯文本。
- 长短信不会合并。