Pull to refresh

Настройка Asterisk для оптимизации расходов на сотовую связь

Reading time 3 min
Views 20K
Дабы не тратить своё и Ваше время: в этом топике нету
  • руководства по настройке chan_datacard
  • руководства по настройке SIP в Asterisk
  • руководства по настройке VoIP-шлюзов и SIP-клиентов.

Всё это прекрасно гуглится, а при наличии опыта — помнится и не забывается.

Недавно встала задача поднять в небольшом офисе АТС.
Одним из требований было оптимально расходовать средства, выделяемые на мобильную связь: с МТСа звонить только на МТС, с БиЛайна — на БиЛайн, и так далее. Было решено использовать связку из Asterisk-а и нескольких незалоченных 3G-модемов: SIM-карты с оптимальными тарифами уже имелись. В качестве абонентских устройств использовались как софтфоны на рабочих местах сотрудников, так и обычные проводные телефоны, подключенные к VoIP-шлюзу.

Первое, что было сделано — найдены и переписаны DEF-коды отечественных сотовых операторов. Конечно же, не всех, а только большой тройки: для всех остальных вызовов планировалось использовать TELE2.
Затем был создан план внутренней нумерации: было решено, что внутренние номера будут четырехзначными, и будут начинаться с 5.

Звонкам с SIP во внешний мир был присвоен контекст sip-incoming, внешним звонкам, поступающим с модемов — соответственно datacard-incoming. Определение нужного модема производилось при помощи MCC/MNC (Mobile Country Code/Mobile Network Code) префикса из IMSI SIM-карты. Код России — 250. Соответственно, у МТС MNC 25001, у МегаФона — 25002, у БиЛайна — 25099, у Теле2 — 25020.

В качестве программной платформы использовалась Ubuntu Linux 11.10 x86-64, и там, если мне не изменяет память — Asterisk 1.8. Для управления модемами был использован chan_datacard 310-й сборки.

Собственно, пример extensions.conf.
[datacard-incoming]
exten => sms,1,Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD} - ${CALLERID(num)}: ${SMS}' >> /var/log/asterisk/sms.txt)
exten => sms,n,Hangup()

exten => ussd,1,Verbose(Incoming USSD: ${USSD})
exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} - ${DATACARD}: ${USSD}' >> /var/log/asterisk/ussd.txt)
exten => ussd,n,Hangup()

exten => s,1,Dial(SIP/5001,,)
exten => s,n,Hangup()

[sip-incoming]
; сотовые операторы
exten => _8913XXXXXXX,1,Dial(Datacard/s:25001/${EXTEN})
exten => _8913XXXXXXX,n,Hangup
exten => _8983XXXXXXX,1,Dial(Datacard/s:25001/${EXTEN})
exten => _8983XXXXXXX,n,Hangup

exten => _8923XXXXXXX,1,Dial(Datacard/s:25002/${EXTEN})
exten => _8923XXXXXXX,n,Hangup

exten => _8903XXXXXXX,1,Dial(Datacard/s:25099/${EXTEN})
exten => _8903XXXXXXX,n,Hangup
exten => _8905XXXXXXX,1,Dial(Datacard/s:25099/${EXTEN})
exten => _8905XXXXXXX,n,Hangup

exten => _89XXXXXXXXX,1,Dial(Datacard/s:25020/${EXTEN})
exten => _89XXXXXXXXX,n,Hangup

; локальные номера
exten => _5XXX,1,Dial(SIP/${EXTEN})
exten => _5XXX,n,Hangup


Немного о настройке chan_datacard. 310-я сборка умеет отвязываться от конкретных портов указанием какой именно IMEI/IMSI ожидается для конкретного логического устройства. Я по привычке настроился на USB-псевдотерминалы.

пример из datacard.conf
[datacard0]
audio=/dev/ttyUSB1              ; tty port for audio connection;        no default value
data=/dev/ttyUSB2               ; tty port for AT commands;             no default value
context=datacard-incoming
autodeletesms=yes               ; auto delete incoming sms
resetdatacard=yes               ; reset datacard during initialization
u2diag=0                        ; set U2DIAG parameter (0 = disable everything except modem function)
usecallingpres=yes              ; use the caller ID presentation or not
callingpres=allowed_passed_screen ; set caller ID presentation


That's all, folks!

Нюансы настройки и эксплуатации


Что достигается такой настройкой? Абонентам не нужно задумываться о том, какой префикс для выхода куда. Фактически, Астериск сам определяет через какой интерфейс перенаправить звонок, руководствуясь номером, и его длиной. При достаточном количестве модемов и других линий — всегда обеспечивается свободный канал на направлении.

Что касается конкретно 3G-модемов — Астериск на современных AMD и Core процессорах хорошо держит даже 50-60 модемов. Правда, это требует выполнения нескольких условий:
  • Модемы вынимаются из корпусов и помещаются в USB-хабы, также освобожденные от корпусов
  • К хабам подводится дополнительное питание от независимых блоков питания
  • «Гребенки» из хабов и модемов помещаются в корпус с хорошим проточно-воздушным охлаждением — корпусной вентилятор для системного блока вполне подойдет
  • Хабы рекомендуется подключать к отдельным хост-контроллерам, устанавливаемым на шину PCI-E


Всё это связано с тем, что когда через модем идет голосовой трафик, его чипы интенсивно греются, и потребляют электроэнергию. Случалось, не очень хорошо собранные E1550 перегревались и «отваливались» — Астериск их переставал видеть на какое-то время.
А вот Е173 вообще плохо приспособлены для работы «голышом»: в отличие от Е1550, у них слот SIM-карты не щелевой, а накладной. Приходилось прижимать карту к контактам считывателя прищепкой.

На этом точно всё.
Tags:
Hubs:
+18
Comments 78
Comments Comments 78

Articles