Asterisk и FreePBX: SMS через chan_dongle
Предупреждение. Этот рецепт составлен по документации Asterisk и chan_dongle и ещё не проверялся на живой АТС. Считайте его отправной точкой и при проверке следите за консолью Asterisk (asterisk -rvvv).
Как это работает
- Для входящей SMS chan_dongle запускает канал диалплана в контексте, указанном в
context=файлаdongle.conf, с номеромsms. Номер отправителя лежит вCALLERID(num), текст — в${SMS}. - Диалплан превращает её в SIP MESSAGE командой
MessageSendна PJSIP-endpoint (номер внутреннего). - Asterisk отправляет MESSAGE на Contact, который зарегистрировал этот внутренний, тем же путём, что и INVITE. Поэтому сообщение доходит до MacroSIP, пока MacroSIP зарегистрирован под этим внутренним номером.
- Ответ из MacroSIP приходит на АТС как MESSAGE и попадает в
message_contextendpoint'а. Там диалплан либо пересылает его на другой внутренний, либо отправляет через модем командой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
- SMS появляется как сообщение от номера телефона. Сообщения должны быть включены в Настройки › Основные › Сообщения.
- Ответ уходит через тот же аккаунт.
- Отправлено означает, что АТС приняла сообщение; остальное решают модем и оператор.
- Без
message_contextсообщение, отправленное из MacroSIP, попадает в обычный контекст внутреннего номера и, как правило, отклоняется. MacroSIP показывает Не отправлено с кодом SIP.
Известные ограничения
- Если внутренний зарегистрирован с двух устройств, то, какое из них получит MESSAGE, зависит от версии Asterisk и настроек AOR. Проверьте это.
- Только простой текст.
- Длинные SMS не склеиваются.
См. также Сообщения и Решение-проблем.