MyTetra Share
Делитесь знаниями!
Сам себе сотовый роуминг. Создание GSM гейта на asterisk + донгл от сотового оператора
Время создания: 26.11.2012 22:40
Текстовые метки: Asterisk, модем, сотовый, мобильный
Раздел: Компьютер - Linux - Сеть в Linux - Телефония, SIP, Asterisk
Запись: xintrea/mytetra_syncro/master/base/13539552369dnykf5jpz/text.html на raw.github.com

Случилось так, что езжу я в командировки и отпуски не настолько часто чтобы пользоваться какой-то международной телефонией или виртуальным провайдером, но и не настолько редко чтобы вообще не забивать себе этим голову и пользоваться роумингом не заморачиваясь на расходах. Езжу я не в те страны и не так надолго чтобы покупать симку местного оператора, зато в те страны где вай-фай есть почти везде.


Так уж вышло что в последнее время я плотно познакомился с программной АТС asterisk и перед очередной поездкой подумал о том как было бы классно воткнуть свою сим-карту в качестве входящего транка в asterisk, стоящий в остающейся позади снежной Москве, а самому цепляться к нему sip-клиентом по интернету. Это же и сам звони не хочу, был бы интернет, и звонки принимай на свой же номер, что важно для тех у кого много контактов (всех не оповестишь, да и половина забудет) — сотовый-то с сим-картой фактически стоит в домашнем регионе.



Как это реализуется


Первым делом что необходимо обязательно:


Из неосязаемого:


  • Хоть какое-то базовое знание линукса. да, придется немножко пособирать из исходников.
  • Реальный айпи-адрес прямо на линукс, ну или проброс портов до него. Все-таки присоединяться из интернета к астериску надо куда-то. Чего, если поставить его за домашним роутером, который сам стоит за маскарадом провайдера, а то и не одним, не получится.


Порты которые использует астериск и на которые нужно делать проброс: udp 5000-31000. Вот такой целый пул.


Из вполне материального:


  • Модем от сотового провайдера. Практически все они — huawey 3G E-серии перекрашенные в “корпоративные цвета”. Мегафон даже не стесняется называть их ровно в соответствии с кодировкой производителя. У меня оказался вот такой: moscow.megafon.ru/devices/usbModem/e173/. Это Huawey 3G E173.
  • Сервер на линуксе


необходимый софт:


  • asterisk: www.asterisk.org/downloads. Я расскажу по версии 11 из исходников, если в вашем дистрибутиве есть пакет астериска любой версии — ставьте пакет, особой разницы нет.
  • usb-modeswitch: www.draisberghof.de/usb_modeswitch/#download. Оба архива www.draisberghof.de/usb_modeswitch/usb-modeswitch-1.2.5.tar.bz2 и www.draisberghof.de/usb_modeswitch/usb-modeswitch-data-20121109.tar.bz2
  • Если в вашем дистрибутиве есть такой пакет — ставьте пакет chan_dongle: github.com/jstasiak/asterisk-chan-dongle/archive/asterisk11.zip для 11-го астериска о котором пойдет речь, либо code.google.com/p/asterisk-chan-dongle/downloads/list если вы поставили астериск из пакетов и у вас более ранняя версия. Это одна и та же версия драйвера, просто в тот который для 11-й версии интегрирован патч который подгоняет его под 11-й астериск с его измененными зависимостями.


Итак.


У вас есть линукс, у вас есть донгл. Для тех у кого самосборное ядро — в нем нужен пункт


Device Drivers -> USB Support -> USB Serial Converter Support -> USB Generic Serial Driver



Втыкате одно в другое, делаете lsusb. Находите там строку похожую на


Bus 001 Device 004: ID 12d1:1446 Huawei Technologies Co., Ltd.


Где:


  • 12d1 это вендор (huawey)
  • 1446 это устройство (E173 в моем случае)


Но не все так просто.


Эти чрезвычайно юзер-френдли модемы устроены так, что после того как их втыкаешь в usb это флешка. Которая автозапускает установку драйверов которые в свою очередь или ставяться или пропускаются, если уже стоят, после чего переключают устройство в режим модема. Очень удобно и пользователе-ориентировано. Под Windows. У нас же случай не тот и это устройство так и торчит в режиме флешки. С чем нам поможет справится usb_modeswitch.


Запускаем (после стандартной установки ./configure && make && make install если из исходников)


usb_modeswitch -v 0x12d1 -p 0x1446 -H -s 5 -M 55534243000000000000000000000011060000000000000000000000000000


не забудьте поменять 12d1 и 1446 на свои цифры из lsusb!


Запускаете lsusb снова и вы увидите там примерно тоже самое что и раньше, но вторая 4-ка цифр вашего донгла будет другой. Это значит что все прошло успешно и теперь ваш модем это модем.


Вот тут-то и должна отработать та самая опция про USB Serial Driver ядра и в /dev должны появится несколько устройств /dev/ttyUSB0, /dev/ttyUSB1 и т.д.


Это интерфейсы к модему, какие-то звуковые, какие-то управления, насколько я понял какой из них какой зависит от модема.


Треть дела сделана, цифровой интерфейс к сотовой сети у нас есть, переходим к астериску.



Астериск


Не буду описывать его установку, будем считать что он поставлен (не настроен, просто установлен). Если из исходников, то хорошо. Если пакет — понадобится еще и -dev, потому что мы будем собирать chan_ модуль к нему. А именно тот самый chan_dongle.


Все стандартно, распаковываем,


./configure && make && make install


копируем файл /etc/dongle.conf в /etc/asterisk/


Запускаем asterisk прямо без настройки.


Запускаем asterisk -rv и попадаем в консоль. Пишем:


module load chan_dongle.so


Модуль загрузится и скорее всего о чем-нибудь начнет ругаться.

Но по выполнении команды


dongle show devices


покажет что-то вроде:


ID Group State RSSI Mode Submode Provider Name Model Firmware IMEI IMSI Number

dc_4823_7851 0 Free 11 0 0 MegaFon RUS E173 11.126.15.00.209 xxxxxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxx


выходим.


Открываем на редактирование файл /etc/asterisk/dongle.conf и в самом низу, где описывается устройство [dongle0]комментируем все кроме строки imei, куда вписываем imei вашего модема из строки которую показал dongle show devices и дописываем:


[dongle0]

imei=xxxxxxxxxxxxxxxx

context=dongle-incoming; контекст

group=0

rxgain=3; увеличение громкости

txgain=3; увеличение громкости

resetdongle=yes; сбрасывать карту при инициализации

u2diag=-1

usecallingpres=yes

callingpres=allowed_passed_screen


Теперь модуль chan_dongle можно вписать в /etc/asterisk/modules.conf в виде строки


load => chan_dongle.so


чтобы он подргужался сам при запуске asterisk. Перезапускаем asterisk.


Вот теперь, по правильному imei, chan_dongle должен сам все правильно найти — и какие из устройств являются командными, и какие аудио, и так далее.


Запускаем asterisk -rv, выполняем dongle show devices и видим свой модем. Все в порядке.


Теперь к настройке астериска.


Все что нам нужно находится в файлах:


  • sip.conf
  • extensions.conf


Начнем с sip.conf. Находим секцию [general] и дописываем:


[general]


externip=х.х.х.х; внешний айпишник астериска, не важно его или гейта который прокидывает к нему порты, это внешний айпишник, адрес которого будут содержать пакеты идущие к астериску и он будет считать их своими


externaddr=х.х.х.х; тоже самое


localnet=192.168.0.0/255.255.0.0; сеть, которую астериск будет считать внутренней и не устраивать сложные танцы с маскарадом для нее


nat=force_rport,comedia; необходимый режим работы если астериск за натом и к нему прокидываются порты


context=public; контекст, в который приходят звонки по умолчанию. важно чтобы тут был какой-то контекст в котором будет совершенно не определен план звонков, чтобы все звонки по умолчанию никуда не попадали! в интернете полно ботов которые сканят день и ночь на предмет плохо настроеных астерисков чтобы звонить через них на халяву


allowguest=no; не принимать звонки неизвестно от кого.


С настройкой по умолчанию закончено, теперь в этом же файле описываем одного клиента (наш софтовый телефон)


[me]

type=friend

host=dynamic

secret=пароль

context=default

canreinvite=yes

dtmfmode=rfc2833

permit=0.0.0.0/0.0.0.0

qualify=yes


me — это будет логин, пароль где задать понятно.


Записываем sip.conf. Тут все.


Открываем extensions.conf — это план звонков, описание того куда и как передаются звонки.


То что нам нужно, так это описать два контекста: [dongle-incoming] — то, что делать со звонками поступающими в модем и [default] — то, что делать со звонками поступающими с софт. телефона.


Начинаем с простого:


[default]

exten => _7X.,1,Dial(Dongle/dongle0/holdother:+${FILTER(0-9,${EXTEN})})

exten => _+7X.,1,Dial(Dongle/dongle0/holdother:+${FILTER(0-9,${EXTEN})})

exten => _8X.,1,Dial(Dongle/dongle0/holdother:+7${FILTER(0-9,${EXTEN:1})})

exten => _007X.,1,Dial(Dongle/dongle0/holdother:+7${FILTER(0-9,${EXTEN:3})})

exten => h,1,Hangup()


Это фактически 4-ре строки которые делают одно и то же, только первая когда телефон назначения подходит под шаблон 7цифры, вторая когда +7цифры, третья 8цифры и 4-я 007цифры (во многих софтовых телефонах стоит опция передавать “+” как “00”). И делает каждая строка одно и то же — передает звонок в канал dongle0 (наш модем) в виде +7цифры.


Ну и последняя строка вызовется при событии “трубка положена” и просто кладет трубку. Впрочем ее можно даже не писать, это формальность.


Чтобы было доходчиво как это работает — любой поступивший звонок с телефона зарегистрировавшегося на астериске под аккаунтом me будет обрабатываться в контексте [default], как указано в опции context для [me]. В контексте [default] номер назначения будет сверен с шаблоном и, если попадет под один из шаблонов, то будет исполнено действие “Dial(Dongle...)”. Кстати если номер назначения в шаблон не попадет, звонок будет сброшен как неизвестно куда направляемый, можете попробовать позвонить куда-нибудь типа +4..., если интересно. Тоже какой-никакой способ защититься от телефонных мошенников, хоть не в Уганду звонить будут, если как-то проберутся.


Теперь контекст [dongle-incoming], для звонков поступающих на сотовый номер:


[dongle-incoming-sms]

exten => sms,1,Noop(Incoming SMS from ${CALLERID(num)} ${BASE64_DECODE(${SMS_BASE64})})

exten => sms,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DONGLENAME} — ${CALLERID(num)}: ${BASE64_DECODE(${SMS_BASE64})}' >> /var/log/asterisk/sms.txt)

exten => sms,n,Hangup()


[dongle-incoming-ussd]

exten => ussd,1,Noop(Incoming USSD: ${BASE64_DECODE(${USSD_BASE64})})

exten => ussd,n,System(echo '${STRFTIME(${EPOCH},,%Y-%m-%d %H:%M:%S)} — ${DONGLENAME}: ${BASE64_DECODE(${USSD_BASE64})}' >> /var/log/asterisk/ussd.txt)

exten => ussd,n,Hangup()


[dongle-incoming]

include => dongle-incoming-sms

include => dongle-incoming-ussd


exten => _X.,1,Dial(SIP/me)

exten => h,1,Hangup()


Тут все еще проще — любой входящий звонок передается как звонок для клиента [me].

Верхние два раздела включенные как include => dongle-incoming-sms принимают sms и ussd соответственно, и записывают их в обычные текстовые файлы /var/log/asterisk/sms.txt и /var/log/asterisk/ussd.txt где их можно потом прочитать (кодировка UTF-8).



Эпилог


Вот вкратце и все. Но это только самая основа, если кому-то реально интересно как, или не получится у самого (все-таки те кто может все это повторить я уверен на 95% могут все это сделать и сами, без инструкции, и даже дополнить всем чего тут не хватает), я могу продолжить развив эту тему — как настроить sms чтобы они принимались и отправлялись на софт-клиент так же как звонки; как изменить dialplan таким образом чтобы номер был занят когда SIP клиент не подключен, либо звонящий попадал в Voicemail.


PS. В результате всего одного дня настройки я получил свой собственный телефонный номер за границей на котором так и не смог потратить 200 рублей денег положенных перед отъездом, хоть и пользовался им постоянно, и родственникам звонил и принимал звонки. Несравнимый опыт использования с роумингом где деньги можно было кидать как в топку тепловоза.


 
MyTetra Share v.0.59
Яндекс индекс цитирования