Несколько лет назад, я работал в компании Rittal. Одним из проектов, которыми я занимался, было внедрение Астериска.

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

Из Риттала я ушел, раздел забросил, но сам Астериск не перестает меня восхищать. Кроме того, как ни странно, иногда люди находят в бездне интернета, что-то спрашивают, делятся мнениями и тд. Спасибо вам, это очень приятно!

Я постараюсь в ближайшее время выложить пару-тройку новых статей, посвященных Астериску. А может и попробую возродить весь раздел...



Простейший биллинг SnuBill 31.03.2015

UPD. Прекрасный человек по имени Максим адаптировал мой код под FreePBX - его проект вы можете посмотреть по этой ссылке.

Давненько я не писал ничего про Звездочку, хотя идей подкопилось немало. Надеюсь этой статьей возродить рубрику про Астериск.

К написанию этой статьи меня подтолкнул вопрос одного иноземного знакомца, который поинтересовался на тему биллинга в Астериске. Конечно, есть множество систем биллинга - тот же AsteriskNOW, насколько мне известно, содержит зачатки биллинга или, можно сказать, индустриальный стандарт A2Billing. Но страсть все сделать самому победила, и я набросал простой скрипт биллинга, который можно посмотреть под катом.

 
Читать дальше...

Связь двух астерисков 02.06.2011

Честно говоря, я планировал связать два астрериска уже после того, как полностью заработает один. Но суровая реальность расставила все по своим местам.

 
Читать дальше...

Занято v3 26.05.2011

Если вы читаете этот цикл статей с начала, то вы помните мои метания по поводу сигнала занято (вы можете посмотреть здесь и здесь).

После переписки с разработчиками, чтения мануалов и тд, стал понятен третий, финальный и правильный путь. Переходим к делу.

Во-первых, удаляем столбец call-limit из tbl_sip_conf - он больше не понадобится.

Во-вторых, добавляем два столбца в ту же таблицу

  `busylevel` int(11) NOT NULL default '1',
  `callcounter` varchar(45) NOT NULL default 'yes'

busylevel будет определять, при каком количестве звонков телефон переходит в статус занято, а callcounter разрешает такой подсчет.

После перезапуска sip очереди уже будут контролироваться автоматически, не допуская появления новых звонков в процессе разговора.

Теперь дополнительный отбой при наборе.

Перед набором SIP номера (у меня это macro-dial_sip_number) добавляем

; проверим набираемый номер на занятость
; по входящим
exten => s,n,GotoIF($[${GROUP_COUNT(${ARG1}@busy_in)} > 0 ]?number_is_busy)
; и исходящим
exten => s,n,GotoIF($[${GROUP_COUNT(${ARG1}@busy_out)} > 0 ]?number_is_busy)

; маркируем набираемый как "занято"
; набирающий уже маркирован
exten => s,n,Set(GROUP(busy_in)=${ARG1})

А в контексты набора номера с телефонов добавляем

; устанавливаем "занято"
exten => _X.,n,Set(GROUP(busy_out)=${CALLERID(NUM)})

Все!

 

Статус линии на телефоне Grandstream 2020 25.05.2011

В качестве телефона оператора колл-центра, мы выбрали телефон Grandstream GXP-2020. К нему подключаются дополнительные блоки кнопок и он умеет показывать статус линии (занята/свободна). Именно этим статусом и займемся.

Сначала добавим в таблицу tbl_sip_conf два столбца:

notifyringing varchar(10) NOT NULL default 'yes',
subscribecontext varchar(80) NOT NULL default 'sip_subscribe'

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

Из-за того, что указание в диалплане метки hint(а именно она нам и нужна) нельзя использовать шаблоны, придется немного схитрить.

В основной контекст я добавил следующие строки (они включают внешний файл /etc/asterisk/rittal/hints.conf):

[sip_subscribe]
#include /etc/asterisk/rittal/hints.conf

Для формирования этого файла из базы я использовал скрипт

<?php
    
// добавляем в мониторинг (hints)
    // все записи из tbl_sip_conf
    
$file_content="";
    
$SQL="SELECT name FROM tbl_sip_conf";
    
$rez_sql=mysql_query($SQL);
    
    while (
$row mysql_fetch_assoc($rez_sql)) 
    {
        
$file_content=$file_content.'exten=> '.$row['name'].',hint,SIP/'
            
.$row['name']."\r\n";
    }    
    
    
$fh fopen('/etc/asterisk/rittal/hints.conf''w') or die("can't open file");
    
fwrite($fh$file_content);
    
fclose($fh);
    
    
// в конце - перегрузим sip на астериске
    
shell_exec('sudo /usr/sbin/asterisk -rx "sip reload"');
?>

Этот скрипт создает файл вида

exten=> 1260,hint,SIP/1260
exten=> 1261,hint,SIP/1261

Теперь осталось в настройках телефона прописать на кнопку мониторинг.

 

Повтор последнего номера 19.05.2011

Еще одна "неподкатная" статейка - как повторить последний набранный номер? Все просто...

Во-первых, если пошел набор реального номера, его нужно сохранить (в моем случае - в AstDB).

Я вписал в контекст набора номера с SIP телефона следующую строчку (она в середине):

; это не набор системной функции, а набор номера
exten => _X.,1,NoOp(transfer to internal_phones_outgoing_dial)

; Записываем номер в AstDB
exten => _X.,n,Set(DB(last_dial/${CALLERID(NUM)})=${EXTEN})

exten => _X.,n,Gosub(internal_phones_outgoing_dial,${EXTEN},1)

Во-вторых, при наборе системного номера (в моем случае - **) этот номер нужно восстановить из базы и набрать:

; ** - повтор последнего номера
exten => **,1,NoOp(system functions - redial)
; если номер не задан, то уходим на возврат
exten => **,n,GotoIF($["${DB(last_dial/${CALLERID(NUM)})}" = ""]?end)
; набираем номерок
exten => **,n,Gosub(internal_phones_outgoing_dial,${DB(last_dial/${CALLERID(NUM)})},1)
exten => **,n(end),Return

 

Очередь звонков 16.05.2011

Рассмотрим организацию очередей звонков на примере ответа секретаря.

 
Читать дальше...

Настройка факса (прием) 12.05.2011

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

 
Читать дальше...

Входящий звонок 10.05.2011

Настало время обработать входящий звонок – проиграть голосовое меню и предложить набрать внутренний номер.

 
Читать дальше...

1 2