Корпоративна АТС на базі Asterisk
Далекої весни 2011 і перед нашою компанією постало таке питання, тому що зовнішні та внутрішні лінії вимагають постійного розширення, а кількість портів на старому Panasonic KX-TA624 було задано статично і розширення не підлягало. Відкриття офісів в інших містах та впровадження єдиної служби роботи з клієнтами в інших містах так само підштовхувало до якісних змін.
Насправді не працює жоден із цих параметрів. Підтримка Planet'а питання ігнорувала. Завести на це залізо 8800 стандартними засобами не виходило.
Довелося колупати глибше. На цій PBX є com-порт та telnet, при з'єднанні з яким запитується логін та пароль. Технічна підтримка Planet'а повідомляти реквізити для входу відмовилася… точніше проігнорувала прохання. Сторінку з прошивкою для девайса можна знайти тут: planet.com.ru/en/support/download2.php? > Прошивка виявилася не чим іншим, як архівом:
Найцікавішим виявився start_install.sh — цей скрипт виконується відразу після завантаження прошивки на пристрій. Відразу після рядка:
Пакуємо все назад в архів і завантажуємо прошивку на станцію.
Якщо все пройде вдало, можна буде логіниться на станцію через com-порт або telnet. Всередині був виявлений μClinux з Asterix 1.4
І почалося допилювання станції до робочого стану. Список змін викладати не будемо, тому що він, наразі, безповоротно втрачено.
Завдяки доступу до консолі станції вдалося реалізувати п.1-4 технічного завдання. І додати на станції 8800, що теж непогано, якби не: 1) постійні зависання станції та зовнішніх портів; 2) щоденні перезавантаження станції ночами; 3) часом, після перезавантаження, станції не вдавалося синхронізуватися з тимчасовим сервером, і вонаповідомляла клієнтам, що час не робочий, хоча насправді час був робітником.
Суб'єктивний відгук про залізо
VoIP dlink працюють добре. Зависань практично немає. Було кілька моделей із шлюбом, але їх без питань змінили на нові.
Linksys - непогано. Іноді трапляються зависання, причому зависає не сам голосовий шлюз, а порт FXO на ньому. На жаль, виявляється лише за зверненням клієнтів.
Planet ata-150s – погано. Дуже часто трапляються зависання, періодично з'являються шуми у трубці. Допомагає лише перезавантаження. Були куплені пачкою, тому доводиться працювати з тим, що є.
На жаль, лог установки asterіsk на debian не зберігся. Тому для статті буде переведено команди установки на Ubuntu 12.04. Відмінностей, за великим рахунком, має бути дуже мало, наприклад, в основний репозитарій debian не включений Asterisk 1.8, але є в backports.
Для роботи ми використовуємо такі пакети: 1 asterisk - Asterisk 1.8 2 libasterisk-agi-perl - модуль AGI для perl. Про це трохи згодом. 3 asterisk-mysql - розширення Asterisk, яке дозволяє зберігати статистику не в текстовому файлі, а в базі даних
Налаштування лога дзвінків
1) З-під root'а бази даних створимо нову базу та користувача:
2) Заходимо під щойно створеним користувачем:
3) Створюємо таблицю:
4) Переходимо в каталог конфігів астериск (всі подальші дії необхідно виконувати від імені супер-користувача) і робимо копію всього вмісту про всяк випадок:
У нас він має вигляд:
Конфіг cdr.conf залишився без змін.
Користувачі та контексти вихідних дзвінків
Для вихідних дзвінків користувачів ми маємо 4 контексти: 1 phone_int — дефолтнезначення. Користувачі, яким дозволено дзвінки лише на внутрішні 3-х значні номери. 2 phone_local - користувачам можна дзвонити на 7-значні внутрішньоміські номери; 3 phone_long_d – цим користувачам дозволені дзвінки всередині країни; 4 phone_too_long_d - міжнародні дзвінки.
Контексти включені одне одного, тобто. Користувачам phone_too_long_d дозволено дзвонити і на внутрішні номери співробітників, і всередині міста.
1) Розіб'ємо sip.conf на кілька:
sip_general.conf - основні налаштування asterisk. sip_internal.conf - внутрішні номери користувачів; sip_trunk.conf - зовнішні лінії;
2) Приклад налаштування 3-х номерів у sip_internal.conf:
Приклад основного конфігу:
Лінія pstn_beeline реєстрації не вимагає - фактично ця одна з "наземних" ліній, підключених через fxo порт linksys spa 3000, але про це трохи пізніше.
Для всіх вхідних дзвінків контекст один from_external.
Dialplan (План набору) - маршрутизація дзвінків
Найцікавіше у роботі будь-якої АТС – це план набору. План набору маршрутизує дзвінки згідно з правилами, які в ньому описані. Отже:
1) Вихідні дзвінки.
0 - перша цифра, яка прийшла [1-79] - другий цифрою може бути будь-яке число крім 8, т.к. це вихід на міжмісто XXXXXX - будь-які 7 цифр
X відповідає будь-якому числу від 0 до 9 Z відповідає будь-якому числу від 1 до 9 N відповідає будь-якому числу від 2 до 9
2 - пріоритет, означає, що ця дія буде виконана другою за рахунком.
SIP/$ — така собі подібність regexp'ів. Наприклад, при наборі номера 03799039 канал буде відправлено номер 3799039.
@pstn_beeline — канал, через який буде здійснено дзвінок.
&SIP/$@example_num — інший канал черезякий буде здійснено дзвінок у разі, якщо лінія білайну зайнята чи недоступна.
для того, щоб отримати контекст phone_local - потрібно включити до нього 2 контексти - phone_int та out_local; користувачеві, якому підключено такий контекст (у прикладі вище це користувач 112), дозволено дзвінки на міські номери.
2) Вхідні дзвінки обробляються так:
По суті своєї макроси це функції. Макрос можна передавати параметри, які він буде використовувати в залежності від контексту. Звернутися до макросу можна так:
Макроси, які ми використовуємо у плані набору:
Про те, як цю програму використовуємо ми, в наступному розділі.
Завдання. Реалізувати меню, яке працює так: 1) Вихідні дні та неробочий час — повідомлення про те, що клієнт зателефонував у неробочий час; озвучити час роботи. 2) Робочий час - вітання; залежно від часу, переключити клієнта на секретаря (якщо клієнт потрапив під час роботи офісу); • тех.підтримку в решту робочого часу
Робочим часом вважається понеділок-п'ятниця із 9 до 21; офіс працює з 9 до 13 і з 14 до 18 у будні (з години до двох в офісі обід).
Інструмент розв'язання задачі. Для виконання завдання було вибрано інструмент AGI. AGI (Asterisk Gateway Interface) - це вбудований в Asterisk метод виконання зовнішніх скриптів (за аналогією з CGI для http серверів), який може розширити функціональність asterisk за допомогою інших мов програмування. Як мову розробки вибрано perl — як універсальний інструмент вирішення будь-якого завдання. :-) На cpan є модуль Asterisk::AGI search.cpan.org/
Плюси AGI – простота розробки; гнучкість. Мінуси – значно зростає навантаження на сервер. Скрипткомпілюється при кожному зверненні, а чи не кешується; в інтернетах пишуть, що AGI глючить, але за час роботи у нас (
0.5 року) проблем із цим не спостерігалося. Проблем із обчислювальними потужностями у нас також немає.
Рішення завдання. Всі вхідні дзвінки надсилаємо сюди (дивіться попередній розділ):
Обробник вхідного дзвінка (/var/lib/asterisk/agi/ivr.pl) матиме такий вигляд:
Файл /var/lib/asterisk/agi/schedule.conf зберігає у собі «винятковий» час, тобто. час коли офіс працює не як завжди, наприклад, святковий або скорочений день. Приклад:
# 1 - дата (день.месяц) # 2 - який день (параметр необов'язка) # 0-неробочий або порожній # 1- звичайний робітник ( [9,13,18,21] ) або масив # 2.1 - час початку роботи офісу (9) # 2.2 - обід (13, тобто з 13 до 14) # 2.3 - час закінчення роботи офісу (18) # 2.4 - час закінчення роботи тех.підтримки # дата вводиться без нулів. 06.11 - не працює; 6.11 - працює 29.12 [9,11,17,20] 31.12
AGI обробник для дзвінків
Інструмент. Як і в минулому розділі - AGI.
Внутрішні номери співробітників зберігає базу даних mysql у таблиці users. Створимо таблицю:
додамо записи для номерів:
При дзвінку на 101 через 10 секунд дзвінок піде на 300 номер (у нас номер технічної підтримки); при дзвінку на 112 або 106 дзвінок нікуди не піде, а просто завершиться через 20 секунд.
Звернутися до оброблювача можна наступним чином( AGI(/var/lib/asterisk/agi/dial_internal.pl, $) ):
У dialplanе це:
Усі дзвінки записуються виключно у робочий час. У записі дзвінків також використовується AGI. Можна було б обійтися без нього, але набагато зручніше, коли логи розкладаються в окремі директорії. Приклад файлу лога: ./2013/03/28/20130328.150550.9033779401.wav, тобто. ./рік/місяць/день/рік_місяць_число.година_хвилин_секунда.номер_з_якого_здійсн.
Код обробника /var/lib/asterisk/agi/monitor.pl:
Із чергами все відносно просто. Конфіг називається queues.conf. Черги у нас 2 - технічна підтримка (номер 300) та бухгалтерія (301):
Налаштування зовнішніх ліній через linksys spa-3000
Завдання. У linksys spa-3000 є один fxo-порт і один fxs. При дзвінку за номером, підключеним до голосового шлюзу (далі г.ш.), дзвінок потрібно направити на порт fxs (там у нас стоїть факс). При цьому ми маємо можливість 1) здійснювати дзвінки через лінію, підключену до fxo порту з офісу; 2) перемикати на номер факсу, якщо дзвінок надійшов через іншу лінію; 3) дзвонити з факсу через будь-яку лінію, підключену до станції.
Рішення. Для того щоб здійснити задумане, потрібно налаштувати г.ш. наступним чином. Переходимо на сторінку Admin login->Advanced->PSTN Line: Proxy: 10.0.0.5 # (ip станції) Outbound Proxy: 10.0.0.5 # (ip станції) Register: yes User ID: pstn_beeline Password: pass_for_beeline
# для того, щоб дзвінок надходив в обхід станції відразу на факс. Dial Plan 2: ( ) PSTN Caller Default DP:2
Налаштування зовнішньої лінії на станції описано у розділі зовнішні лінії (pstn_beeline).
106 номер fax: Proxy: 10.0.0.5 # (ip станції) Outbound Proxy: 10.0.0.5 # (ip станції) Register: yes User ID: 106 Password: pass_for_fax
налаштування внутрішнього номера на станції описано в розділі користувачі та контексти вихідних дзвінків (106)
asterisk -r — доступ до командного рядка asterisk asterisk -rx 'sip show peers' — вивести в консоль списокпідключених користувачів без входу в консоль Asterisk. З ключем -x можна виконувати будь-яку команду, не заходячи в консоль asterisk