Дабы не тратить своё и Ваше время: в этом топике нету
- руководства по настройке 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!
Автор: ne_kotin