Пользователь
0,0
рейтинг
26 ноября 2012 в 18:22

Разработка → Сам себе сотовый роуминг. Создание GSM гейта на asterisk + донгл от сотового оператора tutorial

Случилось так, что езжу я в командировки и отпуски не настолько часто чтобы пользоваться какой-то международной телефонией или виртуальным провайдером, но и не настолько редко чтобы вообще не забивать себе этим голову и пользоваться роумингом не заморачиваясь на расходах.
Езжу я не в те страны и не так надолго чтобы покупать симку местного оператора, зато в те страны где вай-фай есть почти везде.
Так уж вышло что в последнее время я плотно познакомился с программной АТС 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 рублей денег положенных перед отъездом, хоть и пользовался им постоянно, и родственникам звонил и принимал звонки. Несравнимый опыт использования с роумингом где деньги можно было кидать как в топку тепловоза.

PPS. WARNING, DISCLAIMER: поступила информация:
«Дело в том, что использование любых шлюзов прямо запрещено всеми сотовыми операторами. Вот „Условия оказания услуг связи МТС“:
static.mts.ru/uploadmsk/contents/1656/uslovia_msk_06042012.pdf

Пункт 1.3 Услуги связи МТС не могут быть использованы Абонентом без дополнительного письменного согласования с Оператором для… установки шлюзов для доступа к сети
электросвязи и Интернет-телефонии…

Такие же пункты есть в условиях других операторов сотовой связи, ибо маржа на роуминге зашкаливающая, и отказываться от такого навара операторы не будут. За использование подобного шлюза могут просто заблокировать сим-карту.»
Evgeny Talyzin @Mnemonik
карма
110,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Разработка

Комментарии (25)

  • 0
    Попробую сделать. Спасибо!
  • 0
    Кхм. На астериск 1.8 Е173 прекрасно заводились без modeswitch'а. Что я делал не так?
    Ибо, ЕМНИП — это составное устройство: Virtual CD с дровами, USB Mass Storage, и USB-модем (или виртуальная сетевуха в отдельных моделях). Если ядро умеет искаропки работать с USBCOMM — все заведется без особых проблем — сразу появятся /dev/ttyUSB*
    • 0
      1. нет
      2. за вас это делает udev. откройте директорию /lib/udev/rules.d/ найдите там файл число-usb_modeswitch.rules, откройте его и посмотрите что он делает. а делает он тоже самое — по втыканию определенных usb id (всех huawey) запускает usb_modeswitch с определенными опциями
      • 0
        Речь про голую систему. Модсвич там и не ночевал. А Е173 заводится нормально.
        • 0
          Ну если все инструкции, мануалы и описания в интернете говорят о том что это или флешка или модем, а у вас все сразу значит видимо так и есть.
          Кстати что такое для вас «голая система»? kernel+binutils+coreutils+fileutils+util-linux+bash+perl+sysvinit?
          • 0
            В данном конкретном случае — это Ubuntu 12.x Server, на котором установлены кроме ssh-демона только asterisk, asterisk-dev, openjdk, mono-runtime, и скомпилирован chan_dongle/chan_datacard.
  • +2
    А, если я не ошибаюсь, то можно взять симку мегафона, подключить услугу мултифон и подключиться к ней по SIP без модемов и танцев с бубнами.
    • +1
      вполне! не буду спорить.
      • +2
        Я сначала подумал, что вы предлагаете хитрым образом организовать локальную БС в роуминге.
        А так — интересно, конечно, но усилия не стоят того.

        В мегафоне, подключив мультифон, можно:

        1) возить с собой симку — получать смс, отправлять ussd запросы если нужно (т.к. напрамер, даже при подключении SMS+ смс от банков приходить не будут в смс+, только на сим-карту)

        2) через мультифон подключить номер как trunk к любой IP PBX и принимать звонки на компьютер, либо форвардить по IP за копейки на любой локальный мобильный страны пребывания

        3) не тратить время на все вышеупомянутые настройки, не нужно питание компа и интернет ))

        4) ну и плюс номер один и тот же остается :)

        Разумеется, возможно только с мегафоном. У мтс и билайна нет аналогов.
    • 0
      Только тарифы будут отличаться.
      • 0
        с отменой безлимитного мультифона за 100р исходящие в через него в больших количествах не особо имеют смысл (хотя, 80 коп. на мегу вполне неплохо, учитывая качество). Ряд других провайдеров дешевле. А вот вашим методом, знаю, пользуются те, кому надо много звонков принимать/совершать (штук по 16 модемов встравляют за раз в астериск). Тут да, имеет смысл. (Опять же, если МТС или Билайн или с региональными операторами — в Меге легче с мультифоном).
    • 0
      Ну только стоит отметить что сип там весьма специфический и вполне можно нарваться на танцы с бубном.
      • 0
        В мультифоне обычный сип. Работает у меня и ряда людей с астериском уже несколько лет с момента запуска. Работает отлично (недоступность раз в несколько месяцев бывает). Качество отличное из любой страны (пробовали много). Так что рекомендуем! Проверено электроникой :)
    • 0
      Полтора года назад писал как всё это связать в колцентр: SMS и SIP шлюз — Мультифон, Asterisk, Kannel
  • 0
    В своё время поднимал нечто похожее на донглах. Как показала практика, система работает очень стабильно. По крайней мере с E1550 и E150. Устраивал SMS опрос. За месяц система приняла порядка 3500 сообщений. Всё выдержало.
    blog.tavda.net/search/label/asterisk — вот тут немного по теме, только в качестве системы FreeBSD.
  • 0
    Я ничего не понял. Как это работает?

    Вы оставляете у себя дома включенный компьютер, в который воткнут USB-модем Huawey, и запущен Asterisk. У этого USB-модема есть телефонный номер в сети Мегафон.

    За границей вы запускаете SIP-клиент с каким-то SIP ID, и что дальше? Как позвонить Васе? Нужно с SIP-клиента дозваниваться на номер USB-модема? Но если вы дозвонитесь, трубка уже будет поднята, как тогда модем будет звонить еще кому-то в домашнем регионе?

    А как будут приниматься звонки? Тоже этого момента не понял.

    • +1
      первая половина — совершенно верно.
      вторая половина — sip клиент звонит сразу на +7-495-100, либо вообще по записной книжке телефона, и сразу туда и попадает.
      звонок передается в астериске на модем как исходящий звонок.
      Естественно звонит модем от своего исходящего номера (той сим-карты что в него поставили), а не SIP id.

      Если наглядно по аналогии, то то что вы описали — это прокси, когда браузер делает запрос к промежуточному серверу, а тот запрашивает сайт у реального сайта. То как работает описанная выше система — это nat, браузер даже не знает что между ним и сайтом есть кто-то кто подставляет вместо его айпи свой.

      Тоже самое со входящими — звонят на номер сим-карты стоящей в донгле, а реально звонит и поднять трубку можно на сип-клиенте, и входящий номер корректно отображает и даже имя, если в записной книжке телефона есть.
      • 0
        То есть, на компьютере поднят свой SIP клиент. Вы по SIP протоколу дозваниваетесь на него, и потом компьютер делает звонок в домашнем регионе по реальному телефону с помощью SIM-карты. Правильно?

        То есть, когда вы звоните по такой схеме, вы в SIP делаете донабор номера, на который нужно позвонить, правильно?

  • 0
    Неделю провозился с E1750, модем китайский, что только не пробовал, со своим софтом работает отлично, принимает звонки, звонит, принимает/отсылает смс. С chan_datacard / chan_dongle ничего не вышло, модем не отвечает на любые AT^ (с крышечкой) команды, плюс половина команд, что идут на ините (в сорцах) не работают так же. Так же, модем выдает IMSI, но не выдает IMEI…
    Кое-как добился, чтобы инитился и даже уже принимает смс, принимает звонок, но тишина. При отбое — астер падает с сегфолтом…
    Снял дамп AT команд с того софта, который отлично работает — так там совсем не то, что в коде chan_datacard / chan_dongle.
    Проще с нуля написать канал, чем адаптировать под этот модем.
  • 0
    Полезно.

    Только вот одно непонятно: Зачем прокидывать такой огромный пул? 5000-30000? Достаточно прокинуть 5060 (SIP) и RTP траффик (10000-20000, но вообще все зависит от клиента. У некоторых изменены стандартные RTP порты: лезем в настройки SIP-клиента, меняем на стандартные, если нет возможности, тогда прокидываем те, которые по умолчанию для вашего софт фотна. обычно они отличаются на ±1000 портов).

    Ах да. Еще одно:
    Я бы крайне сильно уделил внимание безопасности вашего торчащего наружу Юзер интерфейса для астера. Ломают только так…
    • 0
      nat 5060 порт + rtp и ничего лишнего кроме vpn на ружу. а в впн уже моно и ssh пустить.
      ну или тот же ssh в мир впустить с хитройй инициализацией, абыл как зовется — суть в том что сначала стучишься, допустим два разв в один порт, потом в другой, потом для твоего айпишника ssh разрешается.
      • +1
        Port knocking
    • +1
      а можно взять zoiper(в котором есть iax2) и тогда на астериске нужен будет всего 1 порт выкинуть наружу.
      я бы пошёл чуть дальше и:

      1)купил пару tp-link mr3020 и пару gsm-модемов.
      2)в tplink вливается openwrt и ставится модем.

      одну пару оставляете в своём городе, вторую(N2) — берете с собой. по приезду втыкаете tp-link в интернеты(по проводу или wifi) и покупаете пару местных симок либо с безлимитом внутри сети, либо цепляете опции, дающие «любимые номера».

      т.е. местные симки дают вам канал до пары N2, а интернет — до пары N1.

      схему можно упростить до 1 tp-link и аккаунта sipnet.
  • 0
    ТОлько не забывайте что некоторые брендированые модемы бывают залочены на оператора и отключены голосовые функции. По поводу usb_modeswitch его можно не использовать если перевести свисток в режим только модем.
  • 0
    Поскольку я не программист, то описанный путь видится мне весьма сложным. А сам я часто бываю в такой же ситуации, как и автор. Примерно раз в месяц выезжаю за рубеж на 3-4 дня. Смысла покупать сим-карту местного оператора — никакого. А поездка обязательно выпадает на какие-нибудь будни, чтобы принимать звонки по работе.

    Решил для себя проблему просто: купил сим-карту балтийского оператора для путешествий (активна 365 дней после пополнения или исходящего звонка) + к ней подключил услугу «сохранение номера». Т.е., переадресация входящих звонков с моего мобильного на киевский городской номер, а уже с него — на мой балтийский. Все это удовольствие за $0,20/мин. входящего звонка. Исходящие там по 0,25/мин. Так удается не зависеть от наличия и качества wi-fi.

    Удается тратить за поездку не больше 10 уе., поскольку те, с кем общаюсь часто, знают, что я за границей, и с ними мы говорим по Skype.

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