Давным-давно, когда деревья были выше, трава зеленее и солнце ярче, я вёл бложик на сервисе под названием "Я.ру". Это была блогоплатформа имени Яндекса. Потом Яндекс эту самую "Ярушку" прибил как не приносящий прибыли проект. Соответственно, я перебрался в ЖЖ. А старые посты переносить не стал, ибо в них было мало ценного.
Сегодня мне в приват написал некий человек с просьбой восстановить одну из тех старых статей. Говорит, нужна она ему. Собственно на здоровье, читайте ниже. Но предупреждаю.
- С тех пор очень много воды утекло. Исходный текст был написан 6 марта 2009 года. За это время сменилось несколько стабильных дистрибутивов Debian-а, вышли новые версии Asterisk-а, прошивки для Panasonic-а и т.д.
- Не уверен, что конфиги отсюда подойдут под новые обстоятельства. Потому что сейчас эти модули Asterisk-а переименованы. ЕМНИП, zaptel-а уже давно не существует. Всякие там DAHDI надо собирать отдельно и т.д.
- Я давным-давно позабыл про эти Panasonic-овские АТСки как страшный сон. Поэтому вопросы мне по ним сейчас задавать бесполезно. Скорее всего, уже ничего не вспомню.
Жила-была фирма. Географически она располагалась в в нескольких различных зданиях, находящихся не очень далеко друг от друга. Но все-таки в разных. Поэтому для обеспечения связи между сотрудниками были закуплены две АТС Panasonic TDA-200. На одну из этих АТС (назовем ее главной) "приходили" N обычных двужильных аналоговых городских линий (их обслуживала плата LCOT16), M точно таких же аналоговых линий (на несколько плат SLC16) и K линий от системных телефонов (на плату DHLC8). Вторая АТС находилась в другом здании. К ней было подключено P внутриофисных аналоговых телефонов (через платы SLC16). Две АТС были связаны между собой по Qsig (платы PRI30) при помощи оптического линка с медиаконвертерами.
Время шло, фирма росла во всех смыслах этого слова. Штат увеличивался, сотрудникам становилось тесновато. Руководство арендовало еще несколько помещений. Но вот беда: эти помещения находились в достаточно удаленных зданиях. Недолго думая, провели туда оптику. Потом стали размышлять, как же обеспечить их телефонной связью. Еще несколько АТС покупать? Дороговато будет. Да и сотрудников в тех зданиях не так много и располагаются они не так "кучно". Аналоговые линии проводить? Весьма затруднительно. IP-телефония? Да, это выход. Такое решение и было принято. Сперва в тестовом режиме, а там как получится.
Какое решение выбрать? Бренды вроде Cisco достаточно дорого стоят, а на дворе кризис. Да и нет уверенности, что выбранное решение будет удовлетворять потребностям фирмы. Остаются OpenSource софтовые решения, благо программная часть бесплатна. Среди всяких Software PBX лидерами являются
Asterisk и
FreeSwitch. Лично мне FreeSwitch понравился больше как идеологически, так и функционально, но... "поковырявшись" с ним около недели, я так и не смог решить простейшей задачи: подключить к серверу 3 программных SIP-телефона и позвонить с одного на другой. Как любят шутить системные администраторы, лучшей документацией к OpenSource-продукту является его исходный код. К сожалению, это именно тот случай. То есть документации нет практически никакой, что на мой взгляд, сводит на нет все преимущества FreeSwitch. Поэтому я выбрал Asterisk, по которому есть подробные учебники, куча документации на
voip.rus.net и огромное русскоязычное сообщество (Community).
Дальше выбор способа стыковки конкретно Asterisk-а с конкретно Panasonic TDA-200. Можно это сделать, например, при помощи H.323. Но во-первых, соответствующая плата TDA0470 относительно дорогая; во-вторых, она обеспечивает всего 16 каналов; в-третьих, народ испытывал какие-то трудности с подключением таким способом. Говорят, в Asterisk-е надо что-то делать с функцией FastRestart. Но мне ходить по этим граблям не хотелось, поэтому я выбрал другой способ - соединить по E1/PRI. Преимущества: 30 линий (против 16 для H.323), менее дорогая плата TDA0290 и достаточно проторенная дорожка в плане беспроблемности подключения и работы.
Встал вопрос, какую плату плату покупать для Asterisk-а. Меня сильно смутил способ их обозначения. Где-то после индекса платы ставят литеру "P", где-то не ставят. Но потом на форуме мне народ разьяснил ситуацию. На деле все оказалось много проще. Топаем на
офсайт Digium, в раздел "Products", заходим в раздел "Digital Telephony Devices" и выбираем плату с нужным количеством портом ("span") и с нужной интерфейсной шиной (PCI, PCI-E, PCI-X и т.п.). Всё. На остальное можно не заморачиваться. Лично мне нужна была плата с одним портом для интерфейса PCI Express, поэтому я выбрал Digium TE121. Что касается расширения для аппаратного эхоподавления, то его всегда можно докупить потом отдельно, если вдруг процессор сервера будет слишком сильно загружен (что в случае работы с 30-ю линиями довольно-таки маловероятно).
Далее. Обжать провод для соединения по E1. Хоть там используются джеки RJ45, но это никакой не Ethernet. Используются всего две пары, контакты номер 1,2 и 4,5. Можно обжать как прямой провод, так и кроссовый. Тип провода можно выставить переключателем на Panasonic-овской плате TDA0290. Лично я для единообразия решил обжать кроссовый провод. Вот его разводка:
RJ-45 ----- RJ-45
1 ----- 4
2 ----- 5
4 ----- 1
5 ----- 2
Итак, провод обжат, платы водружены на свои места, подключены. Теперь необходимо настраивать программную часть. Она заключается в настройке как Asterisk-а, так и панасоника, на "низком" и на "высоком" уровне.
1. Asterisk, "низкий" уровень.
Данная плата полностью бесполезна, пока к ядру не подключен соответствующий модуль. А уже скомпилированный модуль этот обычно в стандартную поставку дистрибутива Debian (с которым я работаю), почему-то не входит. Причем модуль этот может быть либо Zaptel, либо DAHDI (в поздних версиях Asterisk). Заморачиваться с DAHDI мне почему-то не захотелось, поэтому я пошел по проторенной дорожке. Установил пакет
"zaptel-source" и все необходимое для его сборки. Запустил module-assistant (module-assistant prepare; m-a -t build zaptel), собрал модули. Дальше лезем в документацию к карте и ищем какой именно модуль нам нужен. Для моей TE121 это "wcte12xp". Но прежде чем загружать его (модуль), необходимо составить для него правильный конфигурационный файл /etc/zaptel.conf . Для работы с Panasonic-ом достаточно указать в этом файле следующее:
span=1,1,0,ccs,hdb3
bchan=1-15,17-31
dchan=16
loadzone = ru
defaultzone=ru
В строке "span=" параметры имеют следующий смысл:
- номер порта (спана) - если в плате их несколько, в противном случае кроме как "1" вариантов нет
- кто является мастером а кто слейвом при синхронизации времени. В моем случае мастером я оставил АТСку, а астериск сделал слейвом, поэтому поставил "1"
- Line Buld-Out (LBO). Параметр, который имеет смысл "подкручивать" для стабилизации связи на проблемных линиях. В моем случае длина линии равняется 1 метру, поэтому оставил "0".
- framing и coding. Не знаю что это такое. Знаю, что с "типовыми" параметрами ccs и hdb3 завелось, поэтому особенно вникать в тонкости не стал
- "bchan=", "dchan=" - указываются номера сигнальных (D-Channel) и голосовых (B-Channel) каналов. Это описано где-то в недрах стандарта E1.
- "*zone=" - вроде как описание где мы находимся. Не уверен, что эта настройки реально на что-либо влияют, но раз уж живем в России, то на
всякий случай зададим их.
Файл конфигурации составили, теперь можно подгрузить модуль командой "modprobe имя_модуля". В моем случае это "modprobe wcte12xp". Затем "ztcfg -vv", чтобы сконфигурировать его. Посмотреть результат можно с помощью "dmesg" и "zttool". Если все было сделано правильно, то zttool должна выводить что "все OK", а на соответствующей плате АТСки должны загореться зеленые индикаторы. Но пока не настроена ответная часть канала на АТС, скорее всего, результат будет прямо противоположный. Поэтому переходим к настройке АТС.
2. Настройка АТС, "низкий уровень".
Подключаем к АТС консоль администрирования (KX-TDA Maintenance Console), открываем пункт 1.1 (Slot). Созерцаем на схеме в соответствующем слоте свежеустановленную плату "PRI30". Если она автоматически перешла в режим "INS" ("In Service" - "В работе"), то переводим ее в режим "OUS" ("Out-of-service"), иначе нам не удастся изменить ее настройки. Затем тыкаем в нее мышкой и выбираем "Port Property" ("Свойства порта"). Там выставляем Port Type (тип порта) в "QSIG-Master" (помните, что в zaptel.conf мы установили синхронизацию таймингов в Slave?), CRC4 Mode (Режим CRC4) в "Disable" (в противном случае его надо также включить и в zaptel.conf, а оно нам надо?). После этого переводим плату в режим INS, и... должно заработать. В плане, индикаторы - загореться зеленым, zttool - говорить, что все хорошо. В противном случае двигаться дальше не имеет смысла: надо разбираться почему не работает линк. Если же линк работает, то переходим на более высокий уровень.
3. Настройка АТС, "высокий уровень".
А тут надо много чего "крутить". Лично я довольно долго ходил по граблям, как видимым, так и неочевидным. Но обо всем по порядку.
а) Объединить линии платы PRI30 в отдельную транковую группу. Для этого открываем пункт "10.1" (CO Line Settings). В таблице слева видим номер слота и номер порта. Справа можем задавать номер транковой группы (TRG) от 1 до 64. Выбираем любой незанятый номер и присваиваем его всем 30-ти линиям для соответствующей платы (то есть, фактически, слота).
б) Объявляем эту транковую группу локальной (в том смысле, что не "внешней"/"вражеской") для данной АТС. Для этого идем в пункт "9.1" (TIE Table). Думаем что бы написать в графе "Leading Number". Это такие цифры, при наборе которых АТС будет "отдавать" звонок в транковую группу, то есть нам на астериск. Тут есть ма-а-а-аленькая тонкость. Если хотите, чтобы на астериск проходили бы звонки "с города" (например, через DISA), то надо указать не просто одну цифру, а цифру и два знака "X" после нее. Сам бы ни за что не догадался, благо многоуважаемый НачШтаба подсказал (очень известная личность на форумах околотелефонной тематики). Допустим, что я желаю назначить VoIP-клиентам трехзначные номера, начинающиеся на 7-ку. Тогда в Leading Number я пишу "7XX". В графе "Trunk Group" указываем тот номер, который мы задали на предыдущем шаге, в пункте 10.1 консоли. При этом запоминаем номер строки таблицы, в который мы все это вписали (!).
в) Идем в пункт "2.6.1" консоли (Numbering Plan, Main), там на вкладку "Other PBX Extension". Вписываем первые цифры VoIP-номеров (в моем примере - "7") в ту же самую строчку, номер которой мы запомнили на предыдущем шаге.
г) Если к астериску не подключены городские линии (а в моем случае это именно так), то идем в пункт 3.1.2 (Local Access Priority). Находим в этой таблице тот номер транка, который мы присвоили астериску и вместо него ставим пустоту (первый, верхний пункт в ниспадающем списке выбора). Это нужно для того, чтобы АТС не пыталась бы "выходить в город" через астерисковский линк. Иначе может возникнуть сумятица, куча непоняток, недоразумений или просто отказов в обслуживании исходящих городских вызовов.
Вот так-то. Вроде бы просто добавить несколько новых абонентов. Ан-нет, дык надо прописать это все в четырех (!) разных местах. Если делать это в первый раз (как я, например), без опыта работы с Panasonic-ом, то со всем этим разобираться приходится довольно долго и не очень просто.
Теперь, когда Panasonic "знает" про Asterisk, можно приступить к настройке последнего.
4. Asterisk, "высокий уровень".
Тут простор для размышлений довольно большой. Поэтому я только приведу пример двух своих конфигов и укажи на самые злобные грабли, на которые я наступил.
а) /etc/aterisk/zapata.conf
[trunkgroups]
[channels]
language=ru
context=inbound-pri
switchtype=qsig
nationalprefix = 8
overlapdial=yes
signalling=pri_cpe
rxwink=300
usecallerid=yes
cidsignalling=dtmf
hidecallerid=no
callwaiting=yes
usecallingpres=yes
callwaitingcallerid=yes
transfer=yes
canpark=no
cancallforward=yes
callreturn=no
echocancel=yes
echocancelwhenbridged=no
rxgain=0.0
txgain=0.0
group=1
callgroup=1
pickupgroup=1
immediate=no
busydetect=yes
busycount=8
channel => 1-15,17-31
Ключевые (критичные) моменты:
- switchtype=qsig и signalling=pri_cpe (тип сигнализации, чтобы астериск и АТС понимали бы друг друга)
- overlapdial=yes (иначе Asterisk не будет во всех случаях понимать передаваемые ему АТСкой номера вызываемых абонентов)
- group=1 номер транковой группы, на которую мы потом будем ссылаться при составлении DialPlan-ов в extensions.conf
- channel => 1-15,17-31 номера каналов, которые будут задействованы для передачи голоса
- context=inbound-pri имя контекста, в который следует "заворачивать" звонки с этой транковой группы. Будет использоваться в extensions.conf
б) /etc/asterisk/sip.conf
[general]
context=default
allowguest=no
allowoverlap=yes
realm=myrealm
bindport=5060
bindaddr=0.0.0.0
srvlookup=yes
language=ru
domain=pbx.super-firma.ru
disallow=all
allow=alaw
[users](!) ; Шаблон локальных пользователей SIP.
type=friend
host=dynamic
nat=no
canreinvite=yes
qualify=yes
context=inbound-sip-local
allowsubscribe=no
call-limit=1
[vasya](users)
callerid="Vasya Pupkin" <701>
username=vasya
secret=123
- realm=myrealm некоторые капризные SIP-клиенты не хотят авторизоваться, если явно не указан этот самый Realm ("область") для Digest-авторизации
- domain=pbx.super-firma.ru служит тем же самым целям. Чтобы сервер знал, кого ему обслуживать (здесь можно просто вбить IP-адрес сервера)
- disallow=all, allow=alaw разрешаю SIP-клиентам работать только с использованием кодека A-Law по одной простой причине: это поможет избежать ненужного транскодирования, поскольку этот же самый кодек по умолчанию использует Panasonic TDA-200.
- context=inbound-sip-local - явно определяет контекст для звонков, поступающих с SIP-телефонов
- allowsubscribe=no - ну не нужна сотрудникам голосовая почта. Все равно они не умеют ей пользоваться. А логи Asterisk-а довольно сильно загаживаются предупреждениями о том, что клиент хочет проверить голосовую почту, а ее нет. Поэтому проще ее тупо запретить.
- call-limit=1 По умолчанию SIP позволяет устанавливать одновременно несколько сеансов связи и переключаться между ними. Но сотрудники у нас тут - не роботы. И одновременно общаться с несколькими абонентами все равно вряд ли смогут. Так что пусть уж если сотрудник занят, то вызывающий и услышит сигнал "занято", как в традиционной телефонии.
P.S. Есличо, я знаю где можно взять эти самые TDA/TDE 200 и платы к ним по цене металлолома, ежели вдруг кому-то надо.