Posts Tagged ‘ voip

Перекодирование записей звонков

Частенько приходится перегонять записи телефонных разговоров в другие форматы.
И постоянно приходится гуглить по этому поводу в поисках рабочих скриптов. Посему попробую сделать подборочку разных скриптов.
Начнем-с.
gsm -> wav

#!/bin/bash
cd /var/samba/convert
if ! test -d /var/samba/convert/wav
then
    mkdir /var/samba/convert/wav
    chmod -R 0644 /var/samba/convert/wav
fi
for a in *.gsm;
do
#Строка ниже для старых версий sox
#sox "$a" -t raw -r 8000 -s -w -c 1 `echo $a|sed "s/.wav/.sln/"` resample -ql;
sox "$a" -r 8000 -c 1 -2 -s wav/`echo $a|sed "s/.gsm/.wav/"` > /dev/null 2>&1
rm "$a" > /dev/null 2>&1
done

Read more

Создание очередей на примере Asterisk 1.6

Здравствуйте.
Для того, что бы более эффективно распределять звонки в офисе в Asterisk присутствует возможность создания очередей обработки звонка. Особенно эта функция актуальна для рекламных отделов компаний.
Будем считать, что у вас уже установлен и настроен Asterisk версии 1.6 и выше
Для начала расмотрим как описываются очереди (Queues)

Code queues.conf:
......
[queue_template](!)
musicclass=default      ; play [default] music
strategy=rrmemory       ; использовать стратегию обзвона  Round Robin Memory
joinempty=yes           ; загонять звонок в очередь если там отсутствуют агенты
leavewhenempty=no       ; оставлять очередь без агентов
ringinuse=no            ; звонить на члена очереди когда он занят ?
 
[sales](queue_template)
; Sales queue
 
[support](queue_template)
; Support queue

В данном примере мы создали шаблон queue_template и на базе шаблона создали 2 очереди: sales и support.
Теперь приступим к написанию диалплана.
Для этого нам нужно описать, как абоненты будут попадать в очередь, а также как логиниться и вылогиниваться из очереди агентам.
Пример 1:
Read more

Asterisk: импорт из Master.csv в Postgresql

postgres=# CREATE USER ast_user with password 'xxxxxxx';
CREATE ROLE
postgres=# CREATE DATABASE ast_db with owner ast_user;
CREATE DATABASE
postgres=#exit
 
psql ast_db ast_user
ast_db=> CREATE TABLE cdr (
calldate TIMESTAMP WITH TIME zone DEFAULT now() NOT NULL,
clid CHARACTER VARYING(80) DEFAULT '' NOT NULL,
src CHARACTER VARYING(80) DEFAULT '' NOT NULL,
dst CHARACTER VARYING(80) DEFAULT '' NOT NULL,
dcontext CHARACTER VARYING(80) DEFAULT '' NOT NULL,
channel CHARACTER VARYING(80) DEFAULT '' NOT NULL,
dstchannel CHARACTER VARYING(80) DEFAULT '' NOT NULL,
lastapp CHARACTER VARYING(80) DEFAULT '' NOT NULL,
lastdata CHARACTER VARYING(80) DEFAULT '' NOT NULL,
duration BIGINT DEFAULT 0::BIGINT NOT NULL,
billsec BIGINT DEFAULT 0::BIGINT NOT NULL,
disposition CHARACTER VARYING(45) DEFAULT '' NOT NULL,
amaflags BIGINT DEFAULT 0::BIGINT NOT NULL,
accountcode CHARACTER VARYING(20) DEFAULT '' NOT NULL,
uniqueid CHARACTER VARYING(32) DEFAULT '' NOT NULL,
userfield CHARACTER VARYING(255) DEFAULT '' NOT NULL
);
CREATE TABLE

Устанавливаем поддержку постгреса в Perl:

perl -e shell -MCPAN
install DBI::DBD
install DBD::Pg

Создаем скрипт для переноса даных:
Read more

Отладка Asterisk

просматривать красивый дамп по SIP протоколу:

tcpdump -pvvvvvv -i <inface> -s0  udp port 5060

Iskratel vs Asterisk

Состыковка Астериска с ИскраТел проходит довольно занятно.
Провайдер телефонной связи может отдавать телефонные звонки по SIP, но сервер сигнализации и голосовые сервера находятся в разных местах.
По умолчанию Астер считает, что источник RTP находится на одном хосте с Сервером сигнализации, чтоб сказать ему о поиске голоса на тех хостах которые приходят в INVITE, а также в SDP, в настройках sip.conf необходимо добавить такие строки

canreinvite=yes
dtmfmode=info

When SIP initiates the call, the INVITE message contains the information on where to send the media streams. Asterisk uses itself as the end-points of media streams when setting up the call. Once the call has been accepted, Asterisk sends another (re)INVITE message to the clients with the information necessary to have the two clients send the media streams directly to each other.

А также опцией permit разрешить посылать голос на хосты отличные от сигнального.
В итоге лог должен содержать что-то типа такого:
Read more

Blacklist в Asterisk

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

Реализация такой схемы:

[incoming]
exten => s,1,LookupBlacklist(j) ;проверка на наличие номера в базе, j - переход на приоритет n+101
exten => s,2,Goto(ivr,s,1)
exten => s,102,Dial(SIP/1234,60,tT)
exten => s,103,Hangup

Добавление номера в базу данных происходит таким образом:

asterisk -rx "database put blacklist 0442223344 1"

Если номеров много, можно реализовать скриптом.

В более новых версиях Asterisk (>1.4) нужно использовать функцию Blacklist()

pbx*CLI> core show function BLACKLIST

Пример диалплана:

exten=> s,1,Answer()
exten=> s,n,GotoIf($[${BLACKLIST()}=1]?blacklist)
exten=> s,n,GoTo(incoming,s,1)
exten=> s,n(blacklist),Hangup()

BLACKLIST() проверяет в базе данных AstDB в семействе blacklist ключ, равный Caller*ID, со значением 1. Если ключ есть и значение равно единице, то BLACKLIST() возвращает 1.
Добавление номера в черный список:

pbx*CLI> database put blacklist 0441112233 1

Новый синтаксис в Asterisk 1.6

Буду тут оставлять заметки о том как меняется синтаксис между Asterisk 1.2 и Asterisk 1.6

1. Вместо “трубы” теперь в диалплане используется запятая, например

1.2

include => kiev|8:30-18:30|mon-fri|*|*

1.6

include => kiev,8:30-18:30,mon-fri,*,*

2. В ivr сменилось использование переменных DigitTimeout, ResponseTimeout, например:
1.2

exten => s,1,DigitTimeout,5 ; Set Digit Timeout to 5 seconds
exten => s,2,ResponseTimeout,10 ; Set Response Timeout to 10 seconds

1.6

exten => s,1,Set(TIMEOUT(digit)=5) ; Set Digit Timeout to 5 seconds
exten => s,2,Set(TIMEOUT(response)=10) ;Set Response Timeout to 10 seconds

Блокировка звонков в не рабочее время

Нужно заблокировать звонки в не рабочее время из офиса  при помощи Asterisk

есть 2 варианта решения:

Read more

Е1 в Asterisk

По Украинской национальной версии в области телефонии поддключение по Е1 производится по сигнализации EuroISDN

в настройках chan_dahdi.conf Астериска нужно выставлять такие параметры:

switchtype = euroisdn
signalling = pri_cpe
prilocaldialplan=national

Что позволит принимать телефонные номера как national в стандарте EuroISDN но появляется небольшая проблема – требуется еще и от себя устанавливать аналогичное соединение, пролистав example который идет в комплекте к Астеру нашел такие строки:

; pridialplan may be also set at dialtime, by prefixing the dialled number with
; one of the following letters:
; U – Unknown
; I – International
; N – National
; L – Local (Net Specific)
; S – Subscriber
; V – Abbreviated
; R – Reserved (should probably never be used but is included for completeness)
;
; Additionally, you may also set the following NPI bits (also by prefixing the
; dialled string with one of the following letters):
; u – Unknown
; e – E.163/E.164 (ISDN/telephony)
; x – X.121 (Data)
; f – F.69 (Telex)
; n – National
; p – Private
; r – Reserved (should probably never be used but is included for completeness)

Чтоб соответствовать всему вышеперечисленому нужно в dialplan писать следующее:

exten =&gt; 2XXXXXX,1,Dial(${TRUNK}/Se${EXTEN})

Переменная PRI_CAUSE (ISDN Cause code)

Переменная PRI_CAUSE используется для передачи информации по линиям связи ISDN PRI о причине разрыва связи до ее фактического разрыва.

Переменная появилась, начиная с версии 1.0 сервера Asterisk.

Для каналов: Zap PRI, chan_capi и chan_misdn BRI есть возможность установки значения переменной PRI_CAUSE до выполнения команды Hangup(). Это приведет к тому, что в отправляемом сообщении PRI DISCONNECT будет установлен параметр CAUSE, который может быть использован телефонным коммутатором.
Read more

Сервисы в voip телефонах

Чтобы начать использовать сервисы в телефонах Cisco нужно в конфиг файл телефона добавить строки:

Для Cisco 7910(7911, 7941)^

1
<servicesurl>http://10.0.1.1/cisco/directory.php</servicesurl>

для 7940:

1
services_url: "http://10.0.1.1/cisco/directory.php"

Read more