Asterisk. Пример 2 — SIP и DONGLE

В данной статье будет рассмотрена простейшая связка SIP и DONGLE, которая интересует большинство. Более подробная настройка системы описана в предыдущем примере. Здесь же приведу только фрагменты конфигов с небольшим описанием того, что там настроено.

Все приведенные листинги конфигов являются полными листингами, если не указано другое. Иными словами Вы, если только пытаетесь разобраться с системой, должны удалить все строки из Ваших существующих конфигов и добавить только те, что приведены в этой статье. Перед этой процедурой лучше сделайте копию оригинальных конфигурационных файлов — они Вам еще пригодятся для изучения.

В первую очередь настроим вызовы между двумя SIP линиями, которые будем использовать для проверки, тестирования и изучения.

Disclamer

Автор предупреждает читателей, о тонкой грани между допустимым использованием телефонных систем подобного рода и уголовной ответственностью, которая может наступить при неправильной маршрутизации телефонного трафика (рефайлинга). Пожалуйста, ознакомьтесь с законодательством Вашей страны, чтобы избежать проблем. Автор снимает с себя ответственность за любые действия читателя, в которых ему может помочь материал данной статьи и возлагает ее целиком и полностью на читателя данной статьи. Информация, приведенная в данной статье, является справочной и не носит практического характера.

SIP

Файл sip.conf должен выглядеть так:

[general]
language = ru
bindport = 5060
callcounter = yes
limitonpeers = yes
dtmfmode = rfc2833
compensate = yes
defaultexpiry = 3600
disallow = all
allow = alaw

[LocalSip](!)
dtmfmode = rfc2833
canreinvite=no
host = dynamic
type = friend
port = 5060
qualify = yes
deny = 0.0.0.0/0.0.0.0
permit = 0.0.0.0/0.0.0.0
callcounter = yes
disallow = all
allow = alaw

[6000](LocalSip)
username=6000
secret=606060
callerid=Vladimir Mayakovskiy <6000>
context=from-sip-phone

[6001](LocalSip)
username=6001
secret=616161
callerid=Taras Shevchenko <6001>
context=from-sip-phone

Здесь были вынесены общие параметры в группу параметров LocalSip, а далее были настроены две SIP-линии, к которым были применены параметры группы. Контекст, правила которого будут обрабатывать вызовы — from-sip-phone.

В консоле Asterisk выполните команду reload, чтобы перечитать конфиги и подключите два SIP-softphone с приведенными в конфиге учетными данными к серверу. Убедитесь, что авторизация прошла успешно.

sip show peers

Позвонить Вы еще никуда не сможете, так как мы еще не настроили маршрутизацию.

Dongle

Теперь давайте настроим GSM модемы (Dongle). У нас подключены 2 модема. Первый с SIM-картой оператора Киевстар, второй с SIM-картой оператора Life. Как уже указывалось в основной статье по установке системы Asterisk, линии Dongle можно сконфигурировать различными способами:

  • указать только IMEI — в этом случае привязка линии будет осуществляться по IMEI модема (мобильного терминала). Вы можете менять SIM-карты или разъемы USB. Линия будет закреплена за модемом.
  • указать только IMSI — в этом случае привязка линии будет осуществляться по IMSI номеру SIM-карты. Вы можете заменить модем на другой, можете поменять разъем USB. Линия будет закреплена именно за SIM-картой.
  • жестко указать интерфейсы audio и data. В этом случае линия будет привязана к контроллеру USB (по факту к гнезду USB). Это очень неудобный способ и оставлен в новых версиях Dongle только для совместимости со старыми версиями и с некоторыми операционными системами, где обнаружение по IMEI и IMSI не работает.

Самым удобным является способ привязки SIM карты (по номеру IMSI). В этом случае замена порта или модема, в случае их выхода из строя, не приведет к необходимости перенастраивать систему. Можно сочетать любые из способов, но это только затруднит эксплуатацию в будущем. Не усложняйте.

Файл dongle.conf должен иметь следующее содержание (обратите внимание на секцию defaults — в данном примере указаны только важные параметры, а не точное содержимое. Не удаляйте все содержимое этого файла):

[general]
interval=15

[defaults]
; в этой секции закомментируйте exten= и оставляйте все остальные параметры как есть, кроме следующих параметров:
rxgain=0 ; - это усиление принимаемого аудиосигнала (динамика)
txgain=0 ; - это усиление передаваемого аудиосигнала (микрофона)
language=ru ; - желательно указывать для корректного речевого информирования
dtmf=relax ; - желательно выключать, когда есть вероятность повреждения формы тональных сигналов

[KYIVSTAR]
imsi=255031111111111
context=from-gsm

[LIFE]
imsi=255061111111111
context=from-gsm

В итоге получим две линии, идентифицируемые как KYIVSTAR и LIFE, вызовы с которых должны будут обрабатываться правилами маршрутизации в контекте from-gsm.

Параметры rxgain и txgain задают усиление. Указывается количество dB в виде целого положительного или отрицательного числа. 0 — усиление выключено. Включайте усиление только при явной необходимости, иначе будет страдать качество звука.

В итоге имеем две SIP-линии и два Dongle (GSM линии). Самое время начинать звонить между ними.

Extensions

Сделаем следующую схему: SIP-линии должны звонить друг другу. SIP-линии должны звонить через линию KIEVSTAR только на номера этого оператора, а все остальные вызовы должны уходить через линию LIFE. Все входящие вызовы, поступающие на модемы, должны тут же маршрутироваться на обе SIP-линии. Очереди использовать не будем, может быть напишу об этом отдельно.

За маршрутизацию отвечает подсистема extensions. Настройки очень простые и понятные, частично они были описаны в первом примере. Но на всякий случай прокомментирую. Файл extensions.conf очень маленький:

[globals]
[general]
autofallthrough=yes


; Этот контекст принимает и обрабатывает вызовы с SIP-линий
[from-sip-phone]
; SIP-линии звонят друг другу
exten => _6XXX,1,Dial(SIP/${EXTEN})

; исходящие вызовы на номера оператора KYIVSTAR
exten => _06[7,8]XXXXXXX,1,Dial(Dongle/KYIVSTAR/${EXTEN})
exten => _09[6-8]XXXXXXX,1,Dial(Dongle/KYIVSTAR/${EXTEN})
exten => _039XXXXXXX,1,Dial(Dongle/KYIVSTAR/${EXTEN})

; все остальные исходящие вызовы без разбора отправляем через GSM линию LIFE
exten => _X.,1,Dial(Dongle/LIFE/${EXTEN})


; этот контекст принимает и обрабатывает вызовы с GSM-линий
[from-gsm]
; простая реализация без очередей - будут звонить обе SIP-линии
exten => s,1,Dial(SIP/6000&SIP/6001)

Вот и все. Пробуйте позвонить.

Удачи!

Asterisk. Пример 2 — SIP и DONGLE: 13 комментариев

  1. Есть один нюанс ( возможно это так стало в asterisk 14 )
    Долго бился над этой ошибкой
    При исходящих
    Если набирать в международном формате через +375,то в упор не видит extension
    При этом если набираешь просто номер без кода типа 777 77 77,то звонок идет. Точно так же звонок работает при 8029 777 77 77

    Собака была зарыта в том,что астер не понимал знака ПЛЮС +
    пришлось подставлять вот таким макаром:
    exten => _+37529X.,1,Dial(Dongle/dongle0/${EXTEN})|
    Либо глобально маску не учитывая код:
    exten => _+X.,

    Правило для входящих звонков
    [from-gsm]
    exten => _X.,1,Dial(SIP/6000)

    _X.,
    Означает:
    X = любые цифры
    Точка = любое кол-во символов

    у меня не находит extension ни с плюсом,ни без плюса,никак,если указывать через X

    Работает только так
    [from-gsm]
    exten => s,1,Dial(SIP/6000)

    1. Добрый день.
      Откройте первый пример и долистайте до параграфа Использование масок (шаблонов) для фильтров экстеншенов.
      Там Вы найдете ответ на Ваш вопрос, а именно то, что символ X в маске означает любую цифру от 0 до 9. Плюс, конечно же, не является цифрой, и не попадает под действие маски X.

      Также есть маска Z (любые цифры от 1 до 9) и маска N (любые цифры от 2 до 9). Предвидя очевидный вопрос сразу дам ответ, для чего это нужно: Международными стандартами телефонной связи принято, что цифра 0 перед набираемым номером является признаком того, что следующий за ней номер является национальным, а не локальным (например, 0-97-123-45-67), тоже самое касается и двух набираемых нулей 00 перед номером — в этом случае набираемый далее номер является международным. Для простоты записи два нуля заменяются одним символом плюс +, к которому все привыкли, но внутри телефонной сети это все равно работает как 00. Поэтому можно использовать маску Z для первой цифры, чтобы однозначно принимать только локальные номера (локальный номер не может начинаться на 0). Что касается маски N (цифры от 2 до 9), то тут похожая ситуация. Международным стандартом предусмотрено, что цифра 1 в начале номера является признаком номера спецслужб. Например 101, 102, 103, 112. Чтобы однозначно принимать только локальные номера, за исключением номеров спецслужб, следует использовать эту маску.

      Что касается:
      [from-gsm]
      exten => s,1,Dial(SIP/6000)

      Значит вызов поступает из подсистемы DONGLE без extension. Вы просто не указали его в конфиге dongle и это нормально, если он вам не нужен.
      Extension — это адрес назначения. Телефонный вызов поступает на Ваш модем, затем фиксируется подсистемой (драйвером) dongle и затем поступает в маршрутизацию. У этого вызова изначально нет адреса, так как модем является оконечным сетевым устройством (как мобильный телефон), а в конечные устройства нет смысла передавать адрес, так как конечное устройство однозначно и определенно точно имеет только один адрес (ваш номер телефона, который определен Вашей SIM-картой). Следовательно, вызов по определению поступает в Asterisk без адреса (без extension). Вы можете приписать ему extension в конфиге dongle.conf и тогда вызов поступит в маршрутизацию с этим прописанным вами вручную адресом. Иногда это полезно, например, если у вас несколько модемов и Вам нужно фиксировать в логах (CDR), с какого именно модема пришел вызов, либо же использовать эту информацию для маршрутизации. Но по умолчанию адреса нет, а значит такие вызовы подпадают под стартовый экстеншн — s.

  2. Здравствуй, о великий Денис!!!

    Большое спасибо тебе за прекрасную инструкцию, которая написана не как для себя, а так, чтобы каждий мог ее понять!
    Я очень долго (около 2х месяцев) искал и пробовал установить такие же системы, много раз — и все зря, ни одна из инструкций в интернете не работает!

    По твоей инструкции все установилось, все определяется, но я видимо, где-то натупил, и не могу настроить входящие звонки, сначала идет гудок а потом занято и пишет:
    WARNING[1068][C-00000021]: pbx.c:4415 __ast_pbx_run: Channel ‘Dongle/dongle0-010000000c’ sent to invalid extension but no invalid handler: context,exten,priority=from-gsm,096XXXXXXX,1

    Что же делать? Как дальше жить? Посоветуйте, подскажите, перепробовал много всего и перечитал. Не могу въехать, ткните носом что не так.

    Вот настройки:
    dongle:
    [general]
    interval=15

    [defaults]
    context=from-gsm
    group=0
    rxgain=0
    txgain=0
    autodeletesms=yes
    resetdongle=yes
    u2diag=-1
    usecallingpres=no
    callingpres=allowed_passed_screen
    disablesms=no
    language=ru
    callwaiting=no
    disable=no
    initstate=start
    dtmf=relax

    [dongle0]
    ;imei=121245678998
    imsi=25503456454676
    context=from-gsm
    exten=096////////

    extension.conf:

    [globals]
    [general]
    autofallthrough=yes
    //////////////////////////////////////

    [from-gsm]
    exten => 6001,1,Dial(SIP/6001)
    exten => 6002,1,Dial(SIP/6002)

    sip.conf:

    6000
    username=6000
    secret=pass6000
    callerid=Alex
    context=from-sip-phone

    1. Привет.
      Сейчас попытаюсь объяснить, как смогу. На самом деле всё очень просто, но почему-то всегда в этом месте у всех проблема, включая и меня тоже, когда я только начинал в этом разбираться.
      Придется перечитать несколько раз, чтобы понять, что это намного проще, чем кажется.

      Если читать лень — листай в самый низ — там ответ на твой вопрос. Но если есть желание разобраться, читай несколько раз до просветления.

      Начнем с файла dongle.conf

      В этом файле есть параметр context — это наименование контекста, который будет обрабатывать входящие вызовы, поступившие с устройства, обслуживаемого данным драйвером (dongle). Перечень контекстов для обработки вызовов находится в файле маршрутизации extenstions.conf.

      Есть еще параметр exten — это своего рода адрес назначения вызова (номер вызываемого абонента Б). Если бы это был не dongle, а, скажем, sip, то в exten находился бы номер телефона, который мы набрали на аппарате, то есть куда мы собираемся позвонить. Но, так как абсолютно все вызовы, пришедшие на наш модем, адресованы лишь одному телефонному номеру (мобильному номеру сим-карты), то exten обычно (но не обязательно) устанавливают для каждого модема свой и он обычно равен номеру телефона сим-карты, например +380991234567. Можно закомментировать exten в донгле, тогда вызовы не будут иметь адрес назначения вообще.

      Оба эти параметра можно сконфигурировать глобально для всех устройств dongle, прописав их значения в секции [defaults], но если нужно для каждого модема указать свои правила — тогда их следует закомментировать в [defaults] и прописать в каждом конкретном dongle. Если со всех модемов вызовы нужно принимать одинаково, то можно прописать значение context в секции [defaults], а параметр exten в секции [defaults] закомментировать вовсе — тогда все входящие вызовы не будут иметь адреса назначения. Если Вам по какой-то причине необходимо различать вызовы с разных модемов, но обрабатывать их при этом одинаково (например, нужно, чтобы в журнал вызовов CDR все вызовы попадали красиво, с номерами ваших сим-карт), тогда пропишите exten в каждом донгле.

      Идем дальше. Файл обработки вызовов extensions.conf

      Вызовы с разных драйверов (dongle, sip, iax и т.д.) поступают на обработку в подсистему маршрутизации, которая конфигурируется при помощи extensions.conf. Помимо стандартных секций [defaults] и [general], этот файл содержит множество секций-контекстов. Каждый контекст содержит группу правил для обработки вызовов. Каждое правило определяется в первую очередь адресом назначения вызова — exten, для которого это правило будет работать. Есть еще служебные адреса, такие как s (вызов без адреса назначения), t (таймаут) и т.д.

      Если в файле dongle.conf у вас все вызовы настроены на один и тот же контекст, например, в [defaults] указан context=from-dongle, а каждый из донглов имеет свой exten, тогда в extensions.conf это будет выглядеть так:

      [from-dongle]
      exten => +380991234567,1,Dial(6000)
      exten => +380557654321,1,Dial(6001)
      

      Но для этого донглы должны быть настроены таким образом:

      [dongle0]
      imsi=xxxxxxx
      exten=+380991234567
      [dongle1]
      imsi=xxxxxxx
      exten=+380557654321
      

      В чем же проблема и как решить?
      Ты получил ошибку, которая очень хорошо говорит сама за себя: sent to invalid extension but no invalid handler
      Потому что твой контекст

      [from-gsm]
      exten => 6001,1,Dial(SIP/6001)
      exten => 6002,1,Dial(SIP/6002)
      

      Пытается принять вызовы, адреса назначения которых 6001 и 6002, а в dongle настроен адрес назначения:

      [dongle0]
      context=from-gsm
      exten=096//////// <--- вот это твой адрес назначения, который приписывается всем входящим вызовам, поступившим на данный модем
      

      На самом деле, ты можешь прописать любой exten у донглов. Если тебе нужно напрямую жестко слинковать каждый из модемов с каждым из SIP телефонов, то это делается очень просто:
      Для каждого донгла пропиши exten, который соответствует тому телефону, на который нужно направить входящий вызов, например:

      [dongle0]
      context=from-gsm
      exten=6001
      [dongle1]
      context=from-gsm
      exten=6002
      

      А в маршрутизации extensions.conf можно ограничиться вот таким одним правилом:

      [from-gsm]
      exten => 6XXX,1,Dial(SIP/${EXTEN})
      

      И теперь, если вызов поступит на dongle0, то этому вызову в адрес назначения драйвером dongle будет приписан 6001 и с этим адресом назначения вызов попадет в маршрутизацию на контекст from-gsm.
      Этот контекст имеет всего одно правило и оно работает для всех адресов назначения, которые начинаются на 6 и имеют 4 цифры. То есть для приведенных выше двух донглов оно будет справедливо. Данное правило направляет вызов на подсистему SIP на адрес, который передан в самом exten, то есть в случае с dongle0 это 6001. Но на практике, наверное, вряд ли есть необходимость жестко соединять между собой модемы и сип-телефоны. Это просто демонстрационный пример, чтобы лучше понять, что такое context и exten.

      Удачи!

  3. Так как админ из меня так себе, то все таки считаю что не замечательно будет, если астериск голой попой на всеобщее обозрение выставить.

  4. Просто везде как то по разному объясняют реализацию перенаправление после звонков по сип номерам

    1. [from-gsm]
      exten => s,1,Dial(SIP/6000,10) ; 10 сек звонит 6000
      exten => s,n,Dial(SIP/6001,10) ; затем 10 сек звонит 6001
      exten => s,n,Dial(Dongle/MYSECONDCELL/+3801234567) ; затем вызов отправляется на Dongle с названием MYSECONDCELL на номер телефона +3801234567

  5. Привет Денис!

    Не подскажешь насколько правильно было выполнено перенаправление на сотовый после очередных звонков

    [from-gsm]
    ; простая реализация без очередей — будут звонить обе SIP-линии
    ;exten => s,1,Dial(SIP/6000&SIP/6001)
    exten => s,1,Dial(SIP/6000,10)
    exten => s,2,Dial(SIP/6001,10)
    exten => 6001,n,Dial(А вот тут я не понял что вписать/8сотовыйномер)
    exten => s,n,Hangup()

    Или это не правильная конструкция?

Добавить комментарий