Оптимізуємо лістинг діалогового вікна Asterisk за допомогою MySQL

Більшість компаній зараз мають IP-телефонію, побудовану на базі Asterisk (*). Нещодавно зіткнувся з наступним, на перший погляд, банальним завданням: є близько 50 осіб співробітників, у кожного з них є внутрішній (доданий) номер і корпоративний робітник. Треба щоб співробітник був постійно на зв'язку, так як в офісі не всі і не завжди знаходяться, а якщо не додзвонитися клієнт - буде біда. Перше, що спадає на думку - діалплан такого виду:

exten => 3333,1,Dial(SIP/${EXTEN},20,tT); викликаємо додавальний

exten => 3333,2,Dial(SIP/trunk/3809631234567,60,tT); якщо не відповідь - набираємо на мобільний.

Начебто все просто і красиво. АЛЕ! Це ми описали тільки одного співробітника, а їх 50! А ще треба кожну розмову записати, наприклад. Лістинг вже розростається до непристойних масштабів. І не тільки лістинг, але і кількість помилок, що можна наробити в процесі складання діалплану. Перше, що мені спало на думку - старий, добрий MySQL. Що ми можемо тут реалізувати? Все просто, забиваємо базу співробітників з їх доданими і мобільними номерами і, підставляючи їх у змінні, телефонуємо.

Зірочку я піднімав з дистрибутива AsteriskNOW, який з уже піднятим м'язом і всім іншим. Непогано б створити базу і табличку для наших абонентів. У мене база називається aster_num і таблиця в ній - numbers.

describe numbers;

+---------------+----------------+------+-----+---------+------------------------+

| Field | Type | Null | Key | Default | Extra |

+---------------+-----------------+------+-----+---------+-----------------------+

| id | int(6) | NO | PRI | NULL | auto_increment |

| asterisk | varchar(20) | NO | | NULL | |

| mobile | varchar(20) | NO | | NULL | |

| first_name | varchar(20) | NO | | NULL | |

| last_name | varchar(20 ) | NO | | NULL | |

| location | varchar(20) | NO | | NULL | |

+---------------+-----------------+-------+-----+---------+---------------------+

Трохи про колонки нашої таблиці:

id - унікальний ідентифікатор співробітника

asterisk - додавальні номери

mobile - мобільні номери

first_name - ім'я співробітника

last_name - прізвище співробітника

location - адреса філії офісу

* з "єднується з MySQL через ODBC конектор, параметри якого описуються у файлі/etc/odbcinst.ini.

Опишемо в ньому наше підключення:

[aster_num]

driver=MySQL

server=localhost

user=xxx

password=xxx

database=aster_num

Port=3306

Налаштуємо з "єднання * з нашою базою.

/etc/asterisk/res_odbc.conf

[aster_num]

enabled=>yes

dsn=>aster_num

username=>xxx

password=>xxx

pooling=>no

limit=>1

pre-connect=>yes

Після перезавантаження перевіряємо наше з'єднання. Команда * odbc show all повинна нам показати приблизно наступне:

Name: aster_num

DSN: aster_num

Last connection attempt: 1970-01-01 03:00:00

Pooled: No

Connected: Yes

Отже, у нас все красиво працює! Ура! Залишилося зовсім не багато: заповнити таблицю і написати діалог. Припустимо, що у нас є співробітник Іван Іванов, з доданим 3333 і мобільним 380631234567. І співробітник Петро Петров, з доданим 3444 і мобільним 380979876543. Внесемо їх у нашу таблицю numders.

numders

+----+----------+-------------------+--------------+----------------+--------------+

| id | asterisk | mobile | first_name | last_name | location |

+----+----------+-------------------+--------------+----------------+--------------+

| 1 | 3333 | 380631234567 | Ivan | Ivanov | Kiev |

| 2 | 3444 | 380979876543 | Petr | Petrov | Kiev |

Накидаємо діалплан:

extensions.conf

exten => _3XXX,1,Dial(SIP/${EXTEN},20,tT)

exten => _3XXX,2,MySQL(Connect connid localhost xxx xxx aster_num)

exten => _3XXX,3,MySQL(Query resultid ${connid} SELECT mobile FROM numbers WHERE asterisk=${EXTEN})

exten => _3XXX,4,MySQL(Fetch fetchid ${resultid} mob_num)

exten => _3XXX,5,Dial(SIP/trunk/${mob_num},60,tT)

exten => _3XXX,6,MYSQL(Clear ${resultid})

exten => _3XXX,7,MYSQL(Disconnect ${connid})

Трохи поясню по пунктах, отже:

exten = > _3XXX,1,Dial (SIP/$ {EXTEN}, 20, tT) - телефонуємо на додавальний, який записано в змінну $ {EXTEN}, протягом 20 сек, з можливістю перекладу дзвінка.

exten = > _3XXX,2,MySQL (Connect connid localhost xxx xxx aster_num) - ініціалізуємо підключення до бази співробітників

exten = > _3XXX,3,MySQL (Query resultid $ {connid} SELECT mobile FROM numbers WHERE asterisk = $ {EXTEN}) - елементарний запит, для пошуку мобільного номера співробітника

exten = > _3XXX,4,MySQL (Fetch fetchid $ {resultid} mob_num) - підставляємо мобільний номер у змінну

exten = > _3XXX,5,Dial (SIP/trunk/$ {mob _ num}, 60, tT) - і телефонуємо на нього!

exten = > _3XXX,6,MYSQL (Clear $ {resultid}) - очищаємо змінну

exten = > _3XXX,7,MYSQL (Disconnect $ {connid}) - закриваємо з "єднання з базою.

Таким чином, всього сім рядків можуть описати дзвінки з переадресацією і перекладом номера для якої завгодно кількість співробітників.

Погодьтеся, що буде не дуже зручно для додавання нового співробітника в базу відкривати мускул і займатися нудними insert'ами. Для цього я написав простеньку адмінку, яка чудово справляється з цим завданням. Докладніше про це можна дізнатися з наступної статті. А поки ось її скріншот:

Сподіваюся, комусь ця публікація допоможе. Якщо виникають пропозиції, питання або проблеми - пишіть, не соромтеся.