Quantcast
Channel: IP АТС Asterisk
Viewing all 1132 articles
Browse latest View live

Asterisk PJSIP Realtime

$
0
0

Asterisk PJSIP Realtime

pjsip-realtime Настройка ODBCреалтайм хранилища для объектов PJSIP - AORs, AUTHs, ENDPOINTs.

Требуемые пакеты

 yum install mysql-connector-odbc unixODBC unixODBC-devel libmyodbc

Создадим базу данных MySQL

 mysqladmin -u root -p create realtimedb

Создайте пользователя и задайте права на БД:

 mysql -u root -p -e "grant all privileges on realtimedb.* to db_user@localhost identified by 'db_password';"
 mysql -u root -p -e "flush privileges;"

Импортируем схему базы данных

 wget https://asterisk-pbx.ru/downloads/schema/realtime.sql
 mysql -u root -p realtimedb < realtime.sql

Получим следующие таблицы:

Получим следующие таблицы:

MariaDB [(none)]> use realtimedb;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [realtimedb]> show tables;
+-----------------------------+
| Tables_in_realtimedb        |
+-----------------------------+
| extensions                  |
| iaxfriends                  |
| meetme                      |
| musiconhold                 |
| ps_aors                     |
| ps_auths                    |
| ps_contacts                 |
| ps_domain_aliases           |
| ps_endpoint_id_ips          |
| ps_endpoints                |
| ps_globals                  |
| ps_registrations            |
| ps_subscription_persistence |
| ps_systems                  |
| ps_transports               |
| queue_members               |
| queue_rules                 |
| queues                      |
| sippeers                    |
| voicemail                   |
+-----------------------------+
20 rows in set (0.00 sec)

Настроим unixODBC

Файл odbcinst.ini создается при установке unixodbc и, как правило, не требует изменений:

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1

В файле odbc.iniнастроим dsn:

nano /etc/odbc.ini

(файл odbc.ini по умолчанию не создан)

[asterisk]
Driver = MySQL
Description = MySQL connection to ‘asterisk’ database
Server = localhost
Port = 3306
Database = realtimedb
UserName = db_user
Password = db_password

Проверим подключение:

Проверим подключение:

 echo "select 1" | isql -v asterisk db_user  db_password
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| quit                                  |
|                                       |
+---------------------------------------+
SQL> select 1
+---------------------+
| 1                   |
+---------------------+
| 1                   |
+---------------------+
SQLRowCount returns 1
1 rows fetched

Настроим Asterisk res_odbc

/etc/asterisk/res_odbc.conf

[asterisk]
enabled => yes
dsn => asterisk
username => db_user
password => db_password
pre-connect => yes

В файле /etc/asterisk/modules.confвключите загрузку модулей odbc:

[modules]
preload => res_odbc.so
preload => res_config_odbc.so

Проверим подключение в Asterisk:

 asterisk -rx 'core reload' && asterisk -rx 'odbc show'
ODBC DSN Settings
-----------------

  Name:   asterisk
  DSN:    asterisk
    Number of active connections: 1 (out of 1)

Asterisk sorcery.conf

Sorcery определяет иерархию использования данных в Asterisk.
В данном случае мы укажем, что модуль res_pjsipхранит данные перечисленных объектов (aors, auths, endpoints, domain_alias и contact) в реалтайм хранилище:

/etc/asterisk/sorcery.conf
[res_pjsip] ; Realtime PJSIP configuration wizard
endpoint=realtime,ps_endpoints
auth=realtime,ps_auths
aor=realtime,ps_aors
domain_alias=realtime,ps_domain_aliases
contact=realtime,ps_contacts

[res_pjsip_endpoint_identifier_ip]
identify=realtime,ps_endpoint_id_ips

формат:
object type [/options] = wizard name, wizard configuration data

где, в данном примере wizard name - realtime, а wizard configuration data - имя объекта из /etc/asterisk/extconfig.conf.

Для использования смешанной конфигурации (реалтайм и статической), используется следующая схема:

endpoint=realtime,ps_endpoints
endpoint=config,pjsip.conf,criteria=type=endpoint

Asterisk Realtime extconfig.conf

Свяжем объекты pjsip с реалтайм коннектором res_odbc (asterisk) .
/etc/asterisk/extconfig.conf

[settings]
ps_endpoints => odbc,asterisk
ps_auths => odbc,asterisk
ps_aors => odbc,asterisk
ps_domain_aliases => odbc,asterisk
ps_endpoint_id_ips => odbc,asterisk
ps_contacts => odbc,asterisk

формат:
объект ⇒ драйвер, имя коннектора, <имя таблицы>
Если имя таблицы не задано, то по умолчанию назначается, как имя объекта. Подробнее о реалтайм конфигурации - Asterisk Realtime: extconfig.conf

Asterisk конфигурация PJSIP

Транспорт PJSIP лучше определить в текстовой конфигурации:

/etc/asterisk/pjsip.conf

[transport-udp]
type = transport
protocol = udp
bind = 0.0.0.0:5060
local_net = 192.168.0.0/24
external_media_address = extern ip address
external_signaling_address = extern ip address
allow_reload=true

Заполнение базы данных PJSIP

Для создания внутренних номеров, достаточно заполнить минимальными параметрами три ключевых таблицы:

  • ps_aors
 insert into ps_aors (id, max_contacts) values (1001, 1);
  • ps_auths
 insert into ps_auths (id, auth_type, password, username) values (1001, 'userpass', 'Pass', 1001);
  • ps_endpoints
 insert into ps_endpoints (id, transport, aors, auth, context, disallow, allow, direct_media) values (1001, 'transport-udp', '1001', '1001', 'testing', 'all', 'alaw,ulaw,opus', 'no');

tips&tricks: Импорт из csv файла

Для автоматизации наполнения таблиц MySQL удобно использовать csv файлы.
Создайте следующий csv файл, например при помощи приложения OpenOffice Calc:

1000,transport-udp,1000,1000,from-internal,all,"alaw,ulaw,opus","no",
1001,transport-udp,1001,1001,from-internal,all,"alaw,ulaw,opus","no",

где в каждой новой строке данные уникального номера.

Импортируйте данный в таблицу MySQL:

LOAD DATA INFILE '/usr/src/ps_endpoints.csv'
INTO TABLE ps_endpoints
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

где /usr/src/ps_endpoints.csvпуть к csv файлу.

import csv to mysql

import csv to mysql

MariaDB [testalembic]> LOAD DATA INFILE '/usr/src/ps_endpoints.csv'
    -> INTO TABLE ps_endpoints
    -> FIELDS TERMINATED BY ','
    -> ENCLOSED BY '"'
    -> LINES TERMINATED BY '\n';
Query OK, 1 row affected, 99 warnings (0.01 sec)
Records: 1  Deleted: 0  Skipped: 0  Warnings: 99
MariaDB [realtimedb]> select id,transport,aors,auth,context,allow,disallow,direct_media  from ps_endpoints;
+------+---------------+------+------+---------------+----------------+----------+--------------+
| id   | transport     | aors | auth | context       | allow          | disallow | direct_media |
+------+---------------+------+------+---------------+----------------+----------+--------------+
| 1000 | transport-udp | 1000 | 1000 | from-internal | alaw,ulaw,opus | all      | no           |
+------+---------------+------+------+---------------+----------------+----------+--------------+
1 row in set (0.00 sec)

Обновление данных

Для обновления уже заполненyых строк, используйте команду UPDATE. Например добавим значение в колонку remove_existing:

  update ps_aors set remove_existing = 'yes';
MariaDB [realtimedb]> select id,max_contacts,remove_existing from ps_aors;
+------+--------------+-----------------+
| id   | max_contacts | remove_existing |
+------+--------------+-----------------+
| 1000 |            1 | yes             |
| 1001 |            1 | yes             |
+------+--------------+-----------------+

Asterisk 13 RealTime SIP

$
0
0

Asterisk 13 RealTime SIP

см также: Asterisk PJSIP Realtime

CREATE TABLE `sip_peers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `accountcode` varchar(20) DEFAULT NULL,
  `directmedia` varchar(128) DEFAULT NULL,
  `disallow` varchar(100) DEFAULT 'all',
  `allow` varchar(100) DEFAULT 'alaw;ulaw;gsm;g729',
  `allowoverlap` enum('yes','no') DEFAULT 'yes',
  `allowsubscribe` enum('yes','no') DEFAULT 'yes',
  `allowtransfer` varchar(3) DEFAULT NULL,
  `amaflags` varchar(13) DEFAULT NULL,
  `autoframing` varchar(3) DEFAULT NULL,
  `auth` varchar(40) DEFAULT NULL,
  `buggymwi` enum('yes','no') DEFAULT 'no',
  `callgroup` varchar(10) DEFAULT NULL,
  `callerid` varchar(80) DEFAULT NULL,
  `cid_number` varchar(40) DEFAULT NULL,
  `fullname` varchar(40) DEFAULT NULL,
  `call-limit` int(8) DEFAULT '0',
  `callingpres` varchar(80) DEFAULT NULL,
  `canreinvite` char(6) DEFAULT 'yes',
  `context` varchar(80) DEFAULT NULL,
  `callbackextension` varchar(80) DEFAULT NULL,
  `defaultip` varchar(15) DEFAULT NULL,
  `defaultuser` varchar(128) DEFAULT NULL,
  `dtmfmode` varchar(7) DEFAULT NULL,
  `encryption` varchar(128) DEFAULT NULL,
  `fromuser` varchar(80) DEFAULT NULL,
  `fromdomain` varchar(80) DEFAULT NULL,
  `fullcontact` varchar(80) DEFAULT NULL,
  `g726nonstandard` enum('yes','no') DEFAULT 'no',
  `host` varchar(31) NOT NULL DEFAULT '',
  `insecure` varchar(20) DEFAULT NULL,
  `ipaddr` varchar(15) NOT NULL DEFAULT '',
  `language` char(2) DEFAULT NULL,
  `lastms` varchar(20) DEFAULT NULL,
  `mailbox` varchar(50) DEFAULT NULL,
  `maxcallbitrate` int(8) DEFAULT '384',
  `mohsuggest` varchar(80) DEFAULT NULL,
  `md5secret` varchar(80) DEFAULT NULL,
  `musiconhold` varchar(100) DEFAULT NULL,
  `name` varchar(80) NOT NULL DEFAULT '',
  `nat` varchar(128) DEFAULT NULL,
  `outboundproxy` varchar(80) DEFAULT NULL,
  `deny` varchar(95) DEFAULT NULL,
  `permit` varchar(95) DEFAULT NULL,
  `pickupgroup` varchar(10) DEFAULT NULL,
  `port` varchar(5) NOT NULL DEFAULT '',
  `progressinband` enum('yes','no','never') DEFAULT 'no',
  `promiscredir` enum('yes','no') DEFAULT 'no',
  `qualify` char(3) DEFAULT NULL,
  `regexten` varchar(80) NOT NULL DEFAULT '',
  `regseconds` int(11) NOT NULL DEFAULT '0',
  `rfc2833compensate` enum('yes','no') DEFAULT 'no',
  `rtptimeout` char(3) DEFAULT NULL,
  `rtpholdtimeout` char(3) DEFAULT NULL,
  `secret` varchar(80) DEFAULT NULL,
  `sendrpid` enum('yes','no') DEFAULT 'yes',
  `setvar` varchar(100) NOT NULL DEFAULT '',
  `subscribecontext` varchar(80) DEFAULT NULL,
  `subscribemwi` varchar(3) DEFAULT NULL,
  `t38pt_udptl` enum('yes','no') DEFAULT 'no',
  `transport` varchar(128) DEFAULT NULL,
  `trustrpid` enum('yes','no') DEFAULT 'no',
  `type` varchar(6) NOT NULL DEFAULT 'friend',
  `useclientcode` enum('yes','no') DEFAULT 'no',
  `usereqphone` varchar(3) NOT NULL DEFAULT 'no',
  `username` varchar(128) DEFAULT NULL,
  `videosupport` enum('yes','no') DEFAULT 'yes',
  `vmexten` varchar(80) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `name_2` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=latin1 ROW_FORMAT=DYNAMIC;

/etc/odbcinst.ini

# Driver from the mysql-connector-odbc package
# Setup from the unixODBC package
[MySQL]
Description     = ODBC for MySQL
Driver          = /usr/lib/libmyodbc5.so
Setup           = /usr/lib/libodbcmyS.so
Driver64        = /usr/lib64/libmyodbc5.so
Setup64         = /usr/lib64/libodbcmyS.so
FileUsage       = 1

/etc/odbc.ini

[asterisk]
Driver=MySQL
SERVER=localhost
PORT=3306
DATABASE=asterisk
USER=asterisk
PASSWORD= PASSWORD

/etc/asterisk/res_odbc.conf

[sql]
enabled => yes
dsn => asterisk
username => asterisk
password => PASSWORD
pre-connect => yes

/etc/asterisk/extconfig.conf

[settings]
sipusers => odbc,sql,sip_peers
sippeers => odbc,sql,sip_peers

/etc/asterisk.modules.conf

load = res_odbc.so
load = res_config_odbc.so
CLI> module show like odbc
Module                         Description                              Use Count  Status      Support Level
res_config_odbc.so             Realtime ODBC configuration              0          Running              core
res_odbc.so                    ODBC resource                            0          Running              core
2 modules loaded
*CLI> odbc show all

ODBC DSN Settings
-----------------

  Name:   sql
  DSN:    asterisk
    Last connection attempt: 1970-01-01 03:00:00

/etc/asterisk/sip.conf

[general]
rtcachefriends=yes

Добавление данных

INSERT INTO asterisk.sip_peers ( NAME, username, secret, context, HOST, nat, qualify, TYPE) VALUES ('1001', '1001', 'USERPASSWORD', 'USERCONTEXT', 'dynamic', 'yes', 'no', 'friend'); 

http://vetal-daw.blogspot.ru/2015/08/realtime-config-sip-asterisk-13.html

Asterisk Realtime: extconfig.conf

$
0
0

Asterisk Realtime: extconfig.conf

Реалтайм Архитектура Asterisk - набор драйверов и функций для конфигурации в режиме реального времени. Существует два типаконфигурации - статический и динамический:

  1. Статический хранит конфигурации в БД, как конфигурационные файлы и также обновляет данные при перезагрузке модулей.
  2. Динамический используется для создания и обновления объектов в режиме реального времени, при совершении вызовов.

Оба режима могут использоваться одновременно.

Реалтайм архитектура поддерживает разные типы хранилищ. В данный момент, большинство драйверов основаны на SQL, но есть и поддержка других методов, например LDAPи CURL.

В данный момент поддерживаются следующие бэкенды:

  • ODBC: интегрированная в Asterisk UnixODBC подсистема поддерживает множество разных БД.
  • MySQL: нативная поддержка MySQL, интегрирована в Asterisk
  • PostgreSQL: нативная поддержка PostgreSQL, интегрирована в Asterisk
  • SQLite и SQLite3: для небольших БД можно использовать SQLite3.
  • LDAP: получайте учетные данные из LDAPдиректорий.
  • cURL: Получайте и отправляйте данные веб приложениям и связанным с ними БД.

Статическая конфигурация

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

Все настройки записываются под одной категорией - [settings]

Конфиг ⇒ Драйвер БД, имя категории из конфига драйвера res_<driver>, таблица базы данных. Если таблица не указана, будет использовано имя конф. файла.

file.conf => driver,category DB res_....conf[,table[,priority]]

Пример записи для загрузки 'queues.conf' через ODBCи 'extensions.conf' из SQlite:

 queues.conf => odbc,asterisk,ast_config
 extensions.conf => sqlite,asterisk,ast_config

Следующие конфиги НЕ МОГУТбыть использованы в реалтайм хранилище:

  • asterisk.conf
  • extconfig.conf (данный файл)
  • logger.conf

Также, некоторые конфиги не загрузятся из Realtime хранилища, если драйвер БД (хранилища) не был, ранее, загружен оператором 'preload' в конфиге 'modules.conf':

  • manager.conf
  • cdr.conf
  • rtp.conf
  • features.conf
  • cel.conf
  • indications.conf

Списки контроля доступа (ACL) также не смогут быть использованы в manager.conf без предварительной загрузки драйвера хранилища. /etc/asterisk/modules.conf

[modules]
preload => res_odbc.so
preload => res_config_odbc.so

Структура таблицы статической базы данных

Структура статической таблицы БД реалтайм архитектуры Asterisk значительно отличается от, собственно, Realtimeтаблиц. Она предполагает единую схему для всех подключаемых конфигов.

static ast_config.sql

create table ast_config (
 id int(11) NOT NULL auto_increment,
 cat_metric int(11) NOT NULL default '0',
 var_metric int(11) NOT NULL default '0',
 commented int(11) NOT NULL default '0',
 filename varchar(128) NOT NULL default '',
 category varchar(128) NOT NULL default '',
 var_name varchar(128) NOT NULL default '',
 var_val varchar(128) NOT NULL default '',
 PRIMARY KEY (id),
 KEY `filename_comment` (`filename`,`commented`)
)ENGINE = InnoDB;
  • 'cat_metric' и 'var_metric' определяют порядок (очередность). 'cat_metric' во всей конфигурации, а 'var_metric', внутри категории. Метрика с меньшим значением представляется раньше, метрика с большим позднее. На примере порядка выбора кодеков в sip.conf, это будет работать так: 'disallow=all' - метрика 0 представляется 1-й, затем 'allow=alaw' - метрика 1 и далее 'allow=g729'
  • Если поле 'commented' не равно '0', строка считается закомметированной и игнорируется.
  • `filename` - Конфиг которому предназначены данные (например extensions.conf).
  • 'category' - контекст диалплана или категория конфига.
  • `var_name` - опция (параметр) конфига, напрмер extenв диалплане.
  • `var_val` - собственно данные, после знака '⇒' в конфиге.

Пример статической конфигурации extensions.conf

extconfig.conf

 extensions.conf => odbc,asterisk,ast_config

Опции и диалплан в extensions.conf:

[general]
static=yes

[globals]
RECDIR=/mnt/record	; Директория записи

[from-internal]
exten => _9X.,1,Dial(PJSIP/${EXTEN:1}@trunk,60,trU(sub-monitor,s,1)
exten => _9X.,n,Hangup
[sub-monitor]
exten => s,1,Noop(**rec to mount**)
exten => s,n,MixMonitor(${RECDIR}/${UNIQUEID}.wav)
exten => s,n,Return

В таблице ast_config будут представлены так:

MariaDB [asterisk]> select * from ast_config;
+----+------------+------------+-----------+-----------------+---------------+----------+--------------------------------------------------------------------+
| id | cat_metric | var_metric | commented | filename        | category      | var_name | var_val                                                            |
+----+------------+------------+-----------+-----------------+---------------+----------+--------------------------------------------------------------------+
|  1 |          0 |          0 |         0 | extensions.conf | general       | static   | yes                                                                |
|  2 |          1 |          0 |         0 | extensions.conf | globals       | RECDIR   | /mnt/record                                                        |
|  3 |          2 |          0 |         0 | extensions.conf | from-internal | exten    | _9X.,1,Dial(PJSIP/${EXTEN:1}@siptrunk,60,trU(sub-monitor,s,1) |
|  4 |          2 |          1 |         0 | extensions.conf | from-internal | exten    | _9X.,n,Hangup                                                 |
|  5 |          3 |          0 |         0 | extensions.conf | sub-monitor   | exten    | s,1,Noop(**rec to mount**)                                         |
|  6 |          3 |          1 |         0 | extensions.conf | sub-monitor   | exten    | s,n,MixMonitor(${RECDIR}/${UNIQUEID}.wav)                          |
|  7 |          3 |          2 |         0 | extensions.conf | sub-monitor   | exten    | s,n,Return                                                         |
+----+------------+------------+-----------+-----------------+---------------+----------+--------------------------------------------------------------------+
7 rows in set (0.00 sec)

Реалтайм конфигурация

Работа в режиме реального времени. Любые изменения в реалтайм хранилище, используются системой при новых вызовах, без перезагрузки модулей и применения настроек. Данные реалтайм хранилищ, могут модифицироваться во время выполнения диалплана, при помощи встроенных функций.

Конфигурация вызывает заданное семейство реалтайм в формате: драйвер базы данных, имя категории из конфига драйвера res_<driver>, таблица БД, приоритет (если таблица не задана, будет использовано имя семейства (family)): family => Driver DB,category DB res_...conf[,Table][,prioritet]

example => odbc,asterisk,alttable,1
example => mysql,asterisk,alttable,2
example2 => ldap,"dc=oxymium,dc=net",example2

Приоритет - необязательный параметр , применяется в случае ошибки получения данных. Если соединению с приоритетом 1 не удалось получить данные, будет произведена попытка получить данные через соединение с приоритетом 2. Приоритеты должны быть упорядочены: 1,2,3, но не 1,2,4

Доступные бакенды

  • odbc … res_config_odbc
  • sqlite … res_config_sqlite
  • sqlite3 … res_config_sqlite3
  • pgsql … res_config_pgsql
  • curl … res_config_curl
  • ldap … res_config_ldap
  • mysql … res_config_mysql (через add-ons в menuselect)

В конфигах res_pgsqlи res_config_sqliteБД назначаются в категории [general] и всегда используется эта БД. В res_config_mysqlБД тоже назначается в секции [general], но можно указать несколько баз данных (см. конфиг mysql)

Использование и подключение

Созданные семейства реалтайм можно подключать директивой switch ⇒ в диалплане, как в случае с extensions.conf:

 [default]
 switch => Realtime/mycontext@extensions 

или вызывать при помощи специальных функций диалплана (в описании функций, можно найти примеры):

пример extconfig.conf

Файлы конфигурации Asterisk

FreePBX Follow Me

$
0
0

FreePBX Follow Me

Следуй за мной. Предустановленный переход вызова на местный или внешний номер.

Edit Follow Me

  • Disable - Выключить Follow Me
  • Initial Ring Time - Время через которое будет вызван номер из списка Follow Me.
  • Ring Strategy - стратегия наведения вызова на несколько номеров.
    • ringallV2: Звонит первый в списке телефон в течении Initial Ring Time, по истечении этого времени звонят все телефоны из списка.
    • ringall - Звонят, одновременно, все телефоны из списка.
    • hunt - Звонит 1-й телефон из списка, если нет ответа в течении Ring Time, звонит следующий и так далее до конца списка.
    • memoryhunt - Звонит 1-й телефон из списка, затем 1-й и 2-й, затем 1-й, 2-й и 3-й и тд.
    • firstavaialbleЗвонит первый доступный из списка номер и Destination If No Answerпо неответу.
    • firstnotonphoneЗвонит первый доступный из списка номер и только он.
  • Ring Time - Время в течении которого будут вызываться номера из списка Follow Me.
  • Follow-Me List - список номеров для переадресации. Могут быть указаны как внутренние номера системы, так и внешние. Внешний номер должен заканчиваться #.

Пример списка:

2201 - Основной номер.
4001 - Другой внутренний номер.
1234567890# - Внешний номер. Решетка символ конца номера. Используйте, также, префикс выхода на внешнюю линию.
  • Announcement - Здесь можно указать системное сообщение, которое прозвучит перед тем, как будут вызваны номера из списка Follow Me.
  • Play Music on Hold - Здесь можно выбрать музыку на удержании MOH, которая будет проигрываться вызывающему абоненту. Если указано Ring, абонент услышит КПВ.
  • CID Name Prefix - Здесь можно указать префикс CallerID отображаемого на местных телефонах, для указания что поступает переадресованный вызов. Т.к. префикс передается как CallerID NAME, на внешний номер, вероятнее всего, передаваться не будет.

Call Confirmation Configuration

  • Confirm Calls - Эта опция включает голосовое предупреждение о переадресации на внешний номер (отмеченный #). Для подтверждения надо нажать «1».
  • Remote Announce - Голосовое сообщение внешнему абоненту с запросом подтверждения о приеме вызова (нажмите 1)
  • To-Late Announce - Голосовое сообщение внешнему абоненту.

Change External CID Configuration

Модификация внешнего CallerID

  • Mode
    • Default - В этом режиме предается CallerID вызывающего абонента без изменений.
    • Fixed CID Value - Если вы выбрали этот режим будет передано CID назначенное в поле Fix CID Option
    • Outside Fixed CID Value - Тоже само, за исключением вызовов с внутренних номеров.
    • Use Dialed Number - Устанавливает в качестве CID входящий номер, на который пришел вызов.
    • Force Dialed Number - Тоже самое, только игнорирует опцию “Block Foreign Caller ID”, если таковая задана на транке, через который идет вызов.
  • Fixed CID Value - задайте CID если выбран режим Fixed CID Valueили Outside Fixed CID Value.

Destination if no answer

  • Destination if no answer - назначение вызова, если никто из списка Follow Me не ответил по истечении Ring Timeв соответствии со стратегией вызова. По умолчанию выполняется «Normal Extension Behavior» - нормальные условия для екстеншена, как если бы Follow Me не было задано.

см. также

FreePBX

Asterisk Phonebook - телефонная книга

$
0
0

Asterisk Phonebook - телефонная книга

Общая телефонная книга, основанная на CMS/LAMP и используемая Asterisk PBX, имя и номер заносятся в базу MySQL и выводятся, например, в XML-браузере IP телефона или браузере. Click to Dial из браузера.

phonebook

Установка Asterisk Phonebook

Требуются следующие приложения

  • Apache Webserver 2.x +
  • php 4.2 - 5.3 (в 5.4 без register_globals = On не работает)
  • Asterisk 1.4 - Asterisk 12
  • MySQL 4.1 +
  • FreePBX (опционально)
  # cd /var/www/html

Скачайте исходник с помощью wget.

  # wget https://asterisk-pbx.ru/downloads/phonebook_asterisk.tar.gz

Распакуйте архив

  # tar -xzvf phonebook_asterisk.tar.gz

Создайте директорию ~/phonebook/upload и установите права на неё rwxrwxrwx

  # mkdir phonebook_asterisk/upload \\
  # chmod 777 /var/www/html/phonebook_asterisk/upload

Отредактируйте php.ini

  register_globals = On

Создание базы данных MySQL

CREATE DATABASE IF NOT EXISTS `asterisk` ;

CREATE TABLE `pbook` (
  `id` int(11) NOT NULL auto_increment,
  `calld` varchar(50) NOT NULL,
  `name` varchar(50) NOT NULL,
  `bemerkung` text NOT NULL,
  `Diverses` int(1) NOT NULL default '0',
  KEY `id` (`id`),
  KEY `calld` (`calld`),
  KEY `name` (`name`)
)  ;


CREATE TABLE `pbook_directory` (
  `id` int(9) NOT NULL,
  `tel` varchar(20) NOT NULL,
  `name` varchar(50) NOT NULL,
  `strasse` varchar(50) NOT NULL,
  `ort` varchar(50) NOT NULL,
  KEY `tel` (`tel`),
  KEY `name` (`name`)
) ;


CREATE TABLE IF NOT EXISTS `users` (
  `extension` varchar(20) NOT NULL default '',
  `password` varchar(20) default NULL,
  `name` varchar(50) default NULL,
  `voicemail` varchar(50) default NULL,
  `ringtimer` int(3) default NULL,
  `noanswer` varchar(100) default NULL,
  `recording` varchar(50) default NULL,
  `outboundcid` varchar(50) default NULL,
  `directdid` varchar(50) default NULL,
  `didalert` varchar(50) default NULL,
  `faxexten` varchar(20) default NULL,
  `faxemail` varchar(50) default NULL,
  `answer` tinyint(1) default NULL,
  `wait` int(2) default NULL,
  `privacyman` tinyint(1) default NULL
) ;


CREATE TABLE IF NOT EXISTS `events` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
  `event` longtext,
  `uxtime` int(11) NOT NULL,
  `DEST` varchar(20) NOT NULL,
  `SRC` varchar(20) NOT NULL,
  `UID` varchar(20) NOT NULL,
  `CID` varchar(20) NOT NULL,
  `CIDNAME` varchar(50) NOT NULL,
  `IDdest` varchar(20) NOT NULL,
  `IDsrc` varchar(20) NOT NULL,
  `EVNT` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
);


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CREATE DATABASE IF NOT EXISTS `asteriskcdrdb` ;


CREATE TABLE IF NOT EXISTS `cdr` (
  `calldate` datetime NOT NULL default '0000-00-00 00:00:00',
  `clid` varchar(80) NOT NULL default '',
  `src` varchar(80) NOT NULL default '',
  `dst` varchar(80) NOT NULL default '',
  `dcontext` varchar(80) NOT NULL default '',
  `channel` varchar(80) NOT NULL default '',
  `dstchannel` varchar(80) NOT NULL default '',
  `lastapp` varchar(80) NOT NULL default '',
  `lastdata` varchar(80) NOT NULL default '',
  `duration` int(11) NOT NULL default '0',
  `billsec` int(11) NOT NULL default '0',
  `disposition` varchar(45) NOT NULL default '',
  `amaflags` int(11) NOT NULL default '0',
  `accountcode` varchar(20) NOT NULL default '',
  `uniqueid` varchar(32) NOT NULL default '',
  `userfield` varchar(255) NOT NULL default ''
) ;

Смотри также Команды mysql

Настройки Phonebook

Внесите изменения в файл config.php
Для MySQL

$mysql_host="localhost"; // eg, localhost - хост MySQL
$mysql_user="root";  // пользователь базы данных mysql
$mysql_password="********";  // пароль к базе данных mysql
$mysql_db_book="asterisk";

// mysql settings DB asteriskcdrdb for cdr tables
$cdr_mysql_host="localhost"; // eg, localhost - should not be empty for productive servers
$cdr_mysql_user="root";  // mysql db user, if you not shure prefer root
$cdr_mysql_password="********";  // insert your password
$cdr_mysql_db_book="asteriskcdrdb"; // should be well

Общие настройки

// Language
$language="en";

// A-Z register
$anz_numbers=40; // количество записей

// диапазон внутенних номеров asterisk:
$local_from=1;  // range begin
$local_to=1000; // range end
$local_list="100,209"; // дополнительные номера через запятую
$local_freepbx=1; // внутренние номера freepbx, если freepbx нет:  $local_freepbx=0 ;

// отображаемая длина номера
$clidlen=25;

// мониторинг событий
// пример : $sip_monitoring="100,101,111,112,113";  //     100 = ваш номер
$sip_monitoring="100,101,111,112,113";

// 1 = show all report entries | 0 = only the local phone number
$report_show_all=1;

Для Asterisk

/// Asterisk ////////////////////////////////////
// Location of Asterisk LOGFILE
$logfile = "/var/log/asterisk/cdr-csv/Master.csv";

// Настройки для Asterisk API в 'manager.conf'

// [phonebook]
// secret = 1234
// deny=0.0.0.0/0.0.0.0
// permit=127.0.0.1/255.255.255.0
// read = system,call,log,verbose,command,agent,user
// write = system,call,log,verbose,command,agent,user

$UserName="phonebook";
$Secret="1234";

// контекст из которого будет производится набор в extensions.conf
$context="from-internal";

//// end of config.php //////////////////////////

Включить поиск по CID для FreePBX

Отредактируйте /etc/asterisk/extensions.conf

# ;; найдите следующий контекст
[macro-user-callerid]
;;;; вместо этой строки
exten => s,1,Noop(user-callerid: ${CALLERID(name)} ${CALLERID(number)})

;;;; вставьте следующие две
exten => s,n,DBGet(name=cidname/${CALLERIDNUM})
exten => s,n,SetCIDName(${name})

;;;; дальше отставить код
exten => s,n,GotoIf($["${CHANNEL:0:5}" = "Local"]?report)
exten => s,n,GotoIf($["${REALCALLERIDNUM:1:2}" != ""]?start)
exten => s,n,Set(REALCALLERIDNUM=${CALLERID(number)})

Перезапустите Asterisk

 CLI>core reload

Использование Phonebook

Откройте в браузере http://your_pbx/phonebook_asterisk/book.php
Укажите в настройках номер своего екстеншена и префикс выхода на внешние линии (если требуется) и сохраните ссылку. phonebook setup

Уже существующие телефоны отображаются справа. Кликните на требуемый номер.

phonebook call

Дополнительно

Если вам требуется ограничить доступ к телефонной книге используйте .htaccess.

<Limit GET>
        Order deny,allow
        Allow from localhost
        Allow from 192.168.1.
        Deny from all
        Satisfy any</Limit>

troubleshooting

При попытке набора в консоли Asterisk CLIвозникает ошибка:

ERROR[]: utils.c: ast_careful_fwrite: fwrite() returned error: Broken pipe

Отредактируйте файл, добавив sleep(1);

nano ../phonebook_asterisk/manager.php

$timeout = 10;
 $asterisk_ip = "127.0.0.1";
 $socket = fsockopen($asterisk_ip,"5038", $errno, $errstr, $timeout);
 fputs($socket, "Action: Login\r\n");
 fputs($socket, "UserName: $UserName\r\n");
 fputs($socket, "Secret: $Secret\r\n\r\n");
 fputs($socket, "Action: Originate\r\n" );
 fputs($socket, "Channel: SIP/$ext\r\n" );
 fputs($socket, "Exten: $num\r\n" );
 fputs($socket, "Callerid: $ext to $call <$ext>\r\n");
 fputs($socket, "Timeout: 15000\r\n" );
 fputs($socket, "Context: $context\r\n" );
 fputs($socket, "Priority: 1\r\n" );
 fputs($socket, "Async: yes\r\n\r\n" );
 fputs($socket, "Action: Logoff\r\n\r\n");
 sleep (1);
 $wrets=fgets($socket,128);

http://highsecurity.blogspot.ru/2011/03/cisco-sip-ip-phone-corporate-directory.html

How To

Asterisk настройка очереди - queues.conf

$
0
0

Asterisk настройка очереди - queues.conf

Очередь входящих вызовов Asterisk. Подробное описание стратегии вызовов. Penalty, timeout, member и все доступные параметры. Примеры.

Основы работы с очередями в Asterisk

Для создания статической очереди, достаточно определить её имя в квадратных скобках и стратегиювызова операторов. Остальные параметры будут назначены по умолчанию.

/etc/asterisk/queues.conf

[queue_01]
strategy = ringall

В дальнейшем имя очереди будет использовано для вызова ее в диалплане командой Queue.

 exten => s,1,Queue(queue_01)

Для применения параметров очередей и управления ими, могут быть использованы команды консоли Asterisk:

*CLI> queue
add   reload   remove   reset    set      show     pause    unpause

Asterisk queue reload

*CLI> queue reload
members     parameters  rules       all

Выполните queue reload allдля инициации новой очереди и queue show <имя очереди>для её отображения в консоли Asterisk:

Asterisk queue status

*CLI> queue show queue_01
queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
   No Members
   No Callers

В данном случае очередь пуста, принимать вызовы некому. Агенты принимающие вызовы в очереди могут быть статическими, т.е. назначены в конфиге очереди - queues.conf:

/etc/asterisk/queues.conf

[queue_01]
strategy = ringall
member = PJSIP/2777

Теперь у очереди есть members, пользователи для обработки входящих вызовов:

*CLI> queue show queue_01
queue_01 has 0 calls (max unlimited) in 'ringall' strategy (0s holdtime, 0s talktime), W:0, C:0, A:0, SL:0.0% within 0s
   Members:
      PJSIP/2777 (ringinuse enabled) (Not in use) has taken no calls yet
   No Callers

Или же, агенты могут быть динамическими, т.е. добавляться при помощи интерфейсов Asterisk - CLI, AMIили AGI.

Пример конфигурации очереди

Комментарии даны относительно заданного в примере значения.

  • [queue_01] ;имя очереди, все параметры заданные после него и до следующих […] скобок, будут относится к данной очереди.
  • announce-frequency=45 ;объявление каждые 45 секунд
  • announce-holdtime=yes ;объявлять среднее время ожидания
  • announce-position=yes ;объявлять позицию в очереди
  • autofill=yes ;включить автозаполнение очереди
  • autopause=no ;не вкл. автопаузу если оператор не ответил на вызов
  • autopausebusy=no ; не вкл. автопаузу, если оператор не ответил на вызов когда был занят.
  • autopausedelay=0 ; таймаут автопаузы =0 (выкл.)
  • autopauseunavail=yes ;вкл. автопаузу, если оператор недоступен.
  • joinempty=paused,penalty,inuse,ringing ;присоединиться к очереди, даже если все операторы имеет один из перечисленных статусов.
  • leavewhenempty=no ;не покидать очередь из-за если все недоступны
  • maxlen=11 ;максимально кол-во ожидающих в очереди = 11
  • memberdelay=0 ; пауза между перед соединением агента и вызывающего абонента = 0
  • monitor-type=mixmonitor ; приложение записи - mixmonitor
  • penaltymemberslimit=5 ;если очередь обслуживают 5 или меньше операторов, не использовать пенальти
  • periodic-announce-frequency=0 ;не делать объявление: все операторы заняты (по умолч.)
  • queue-callswaiting=queue-callswaiting ;файлы объявлений в очереди.
  • queue-thankyou=queue-thankyou
  • queue-thereare=queue-thereare
  • queue-youarenext=queue-youarenext
  • reportholdtime=no ; не объявлять агенту время, которое абонент провел в очереди
  • retry=5 ;пауза перед повторным вызовом оператора 5 секунд.
  • ringinuse=no ; не вызывать операторов со статусом 'in use' (вызывается очередью).
  • servicelevel=20 ; считать процент вызовов отвеченных в течении 20 секунд.
  • setqueuevar=yes ; задать переменные очереди
  • setinterfacevar=yes ;задать переменные интерфейсов (операторов очереди)
  • setqueueentryvar=yes ;задать переменные сред. время ожидания и позиция абонента.
  • strategy=ringall ; стратегия - звонят все операторы
  • timeout=15 ; время вызова операторов, перед retry
  • timeoutpriority=app ; приоритет таймаута приложения
  • timeoutrestart=yes ; сбросить таймаут оператора, если он CONGESTION
  • weight=0 ;вес очереди = 0
  • wrapuptime=0 ;время отдыха оператора после вызова = 0
  • member=PJSIP/2777 ;пользователь очереди.

[queue]

[queue]

[queue_01] ;имя очереди, все параметры заданные после него и до следующих […] скобок, будут относится к данной очереди.
announce-frequency=45 ;объявление каждые 45 секунд
announce-holdtime=yes ;объявлять среднее время ожидания
announce-position=yes ;объявлять позицию в очереди
autofill=yes ;включить автозаполнение очереди
autopause=no ;не вкл. автопаузу если оператор не ответил на вызов
autopausebusy=no ; не вкл. автопаузу, если оператор не ответил на вызов когда был занят.
autopausedelay=0 ; таймаут автопаузы =0 (выкл.)
autopauseunavail=yes ;вкл. автопаузу, если оператор недоступен.
joinempty=paused,penalty,inuse,ringing ;присоединиться к очереди, даже если все операторы имеет один из перечисленных статусов.
leavewhenempty=no ;не покидать очередь из-за если все недоступны
maxlen=11 ;максимально кол-во ожидающих в очереди = 11
memberdelay=0 ; пауза между перед соединением агента и вызывающего абонента = 0
monitor-type=mixmonitor ; приложение записи - mixmonitor
penaltymemberslimit=5 ;если очередь обслуживают 5 или меньше операторов, не использовать пенальти
periodic-announce-frequency=0 ;не делать объявление: все операторы заняты (по умолч.)
queue-callswaiting=queue-callswaiting ;файлы объявлений в очереди.
queue-thankyou=queue-thankyou
queue-thereare=queue-thereare
queue-youarenext=queue-youarenext
reportholdtime=no ; не объявлять агенту время, которое абонент провел в очереди
retry=5 ;пауза перед повторным вызовом оператора 5 секунд.
ringinuse=no ; не вызывать операторов со статусом 'in use' (вызывается очередью).
servicelevel=20 ; считать процент вызовов отвеченных в течении 20 секунд.
setqueuevar=yes ; задать переменные очереди
setinterfacevar=yes ;задать переменные интерфейсов (операторов очереди)
setqueueentryvar=yes ;задать переменные сред. время ожидания и позиция абонента.
strategy=ringall ; стратегия - звонят все операторы
timeout=15 ; время вызова операторов, перед retry
timeoutpriority=app ; приоритет таймаута приложения
timeoutrestart=yes ; сбросить таймаут оператора, если он CONGESTION
weight=0 ;вес очереди = 0
wrapuptime=0 ;время отдыха оператора после вызова = 0
member=PJSIP/2777 ;пользователь очереди.

Общие (глобальные) настройки очередей.

 [general]
Persistent Members (Постоянные пользователи )

Сохранять каждого динамического пользователя во внутренней БД Asterisk (astdb), чтобы после перезагрузки, все пользователи были восстановлены из записей очереди в astdb. см. также RemoveQueueMember По умолчанию:

 persistentmembers = no
AutoFill Behavior (Автозаполнение очереди)

Старое, по умолчанию, поведение очереди (autofill=no) подразумевало последовательный тип подключения, при котором ожидающий абонент, подключался к пользователю, только с первой позиции в очереди. Новое поведение по умолчанию, (autofill=yes) позволяет ожидающему абоненту, подключится к пользователю (агенту) очереди, с любой позиции, если есть свободные агенты, не дожидаясь, пока он займет головную позицию. Такое поведение позволяет быстрее обрабатывать вызовы и является предпочтительным.

 autofill = yes

Monitor Type (Приложение для записи разговоров )

Приложение MixMonitorзаписывает разговор непосредственно в один файл, в отличии от устаревшего Monitor, раздельно записывающего вх. исх. голосовые потоки.

 monitor-type = MixMonitor
UpdateCDR behavior(Изменить поведение CDR)

Записать в поле CDRdstchannelимя агента, которое вы можете установить во время входа в систему с параметром MemberName AddQueueMember.

 updatecdr = yes
shared_lastcall (общий последний вызов)

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

 shared_lastcall=no
Negative_penalty_invalid

Рассматривать операторов с отрицательным пенальти, как неактивных (не подавать на них вызовы).

 negative_penalty_invalid = no
log_membername_as_agent

Регистрировать агентов с именем, а не номером интерфейса. параметр для обратной совместимости, поведение как при работе с модулем chan_agents.

 log_membername_as_agent = no

Параметры очередей Asterisk

 [queuename]
Musicclass

Устанавливает класс Музыки на Удержании (MOH) используемый данной очередью. Эта установка будет иметь приоритет над всеми, кроме переменной канала, заданной в диалплане: Set(CHANNEL(musicclass)=whatever)

 musicclass = default
announce

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

 announce = file_to_play

Asterisk queue strategy

Стратегия вызова операторов очереди.

Важнейший параметр, указывает как будет распределяться вызовы между агентами:

  1. ringall - вызываются все пользователи одновременно, пока кто-нибудь не ответит (по умолчанию)
  2. leastrecent - вызвать оператора дольше всех не принимавшего вызовы.
  3. fewestcalls - вызвать оператора принявшего меньше всего вызовов.
  4. random - распределить вызовы случайным образом.
  5. rrmemory - по кругу (round robin), после агента отвечавшего крайним.
  6. linear - вызывать начиная с первого в порядке перечисления. Динамические агенты, будут вызываться в порядке добавления.
  7. wrandom - звонит случайный интерфейс, но использует штраф этого участника в качестве веса (weight) при расчете метрики.

Таким образом, оператор с пенальти 0 будет иметь метрику в диапазоне от 0 до 1000,
оператор с пенальти 1 от 0 до 2000,
а оператор с пенальти 2 будет иметь метрику между 0 и 3000.
Обратите внимание, что при использовании этой стратегии, пенальти оператора не такой же,
как при использовании других стратегий очереди.
Он используется ТОЛЬКО в качестве весового коэффициента для вычисления метрики.

 strategy = ringall
servicelevel

Параметр статистики. Задает диапазон от 0 до servicelevel=в секундах. Приложение app_queueвысчитает процент вызовов, отвеченных за указанный период. Например, если servicelevel=30 ожидавших в очереди не более 30-ти секунд.

 servicelevel=30

Ниже приведен пример, где мы видим, что 89.4% процента вызовов в очереди q1были отвечены в течении 30 секунд (SL:89.4% within 30s).

*CLI> queue show q1
q1 has 0 calls (max unlimited) in 'leastrescent' strategy (6s holdtime, 120s talktime), W:0, C:5156, A:584, SL:89.4% within 30s
   Members:
      SIP/4886 (ringinuse disabled) (Not in use) has taken no calls yet
      SIP/4887 (ringinuse disabled) (Not in use) has taken no calls yet
      PJSIP/4889 (ringinuse disabled) (Unavailable) has taken no calls yet
   No Callers
context

Указывает на контекст диалплана, в который ожидающий в очереди абонент может попасть набором одной цифры в DTMF. В контексте должен быть определен екстеншен для обработки этой цифры. Например, можно использовать для интерактивного меню.

 context = context_name
penaltymemberslimit

не использовать penalty, если очередь обслуживают кол-во операторов меньшее или равное тому, что указано:

 penaltymemberslimit = 5

Asterisk queue Timeout

Примечание для рассматриваемых далее таймаутов очереди.
Таймаут выхода из очереди по не ответу, не является параметром очереди, а может быть назначен как опция вызова приложения Queue
Queue(queuename,[options],[optionalurl],[announceoverride],[timeout])
Пример:

 Queue(queuename,t,,,45)

Timeout

Очередь имеет два разных «таймаута» связанных с ней. Один из них назначается в queue.conf. Этот таймаут указывает в течении какого промежутка времени, в секундах, будет вызываться телефон пользователя, прежде чем будет считаться, что он не ответил. Второй таймаут, это аргумент приложения Queue(). Это абсолютный таймаут, по истечении которого, вызов выходит из очереди и переходит на следующий приоритет в контексте. В некоторых ситуациях, эти таймауты сталкиваются. Например, если таймаут в queue.confустановлен 5 секунд, retry = 4 секунды, а таймаут приложения Queue()задан 10 секунд
произойдет следующее:

  • вызов попадает в очередь
  • очередь выбирает оператора и вызывает его в течении 5 секунд
  • затем выдерживается время retry - 4 секунды
  • очередь выбирает второго оператора.

Как долго будет вызываться второй оператор? Осталась 1 секунда до истечения абсолютного таймаута приложения Queue(). Будет ли второй оператор вызываться 1 секунду или 5 как задано в таймауте queue.conf?

Эту коллизию призван разрешить параметр timeoutpriority: если timeoutpriority=conf, то второй оператор будет вызваться в течении 5-ти секунд. Если timeoutpriority=app, то в течении 1-й секунды.

Существуют и некоторые исключения и приведенных выше правил:
предположим timeoutpriority=app, в queues.confтаймаут равен 0, а аргумент приложения Queueзадан 10 сек.
Тогда timeoutpriorityигнорируется, а таймаут приложенияиспользуется как таймаут вызова операторов queues/conf.
И наоборот, если таймаут приложенияне задан, тогда timeoutpriorityигнорируется и таймаут конф. файлаqueues.confвсегда используется.

Несмотря на то, что timeoutpriority=confтаймаут конфигурационного файлаqueues.confимеет приоритет над таймаутом приложения,
если таймаут конф. файларавен 0, каждый участник очереди будет вызываться в течении неопределенного времени, а таймаут приложениябудет проверяться после этих попыток.

По умолчанию: timeoutpriority=app

timeout = 15
retry = 5
timeoutpriority = app|conf
weight

Чем выше вес (weight) очереди, тем выше приоритет для вызова оператора обслуживающего больше одной очереди.
по умолч. 0

 weight=0
wrapuptime

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

 wrapuptime=0
autofill

Переопределяет глобальную установку autofill, рассмотренную выше, отдельно для каждой очереди.

 autofill=yes|no
autopause

Поставить оператора на паузу, если он не ответил на вызов. см. также PauseQueueMember

  • no: Не использовать автопаузу для данной очереди.
  • yes: Поставить на паузу, только в данной очереди.
  • all: Поставить на паузу во всех очередях, которые обслуживает оператор.
 autopause=no|yes|all
Autopausedelay

Отложить постановку на паузу оператора на время, с момента завершения последнего неудачного вызова.

 autopausedelay=60
Autopausebusy

Ставить или нет оператора на паузу, если он занят (BUSY).

autopausebusy=no
Autopauseunavail

Ставить или нет оператора на паузу, если он недоступен (UNAVAILABEL).

 autopauseunavail=no
maxlen

Максимально кол-во ожидающих в очереди. Если превышено, последующие вызовы будут отвергаться.
0 - неограниченно.

maxlen=0

Asterisk queue variables

variables

Примечание для рассматриваемых ниже параметров очереди - setinterfacevar, setqueueentryvar, setqueuevar. Если канал оператора (member channel) определен как Local, то для установки переменных он должен быть оптимизирован при помощи опции /n. Например:

 Local/2666@from-queue/n

Если setinterfacevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:

  • MEMBERINTERFACE - наименование интерфейса оператора(например. Local/1234)
  • MEMBERNAME - имя оператора (например. O.Agentova)
  • MEMBERCALLS - кол-во вызовов принятых данным интерфейсом оператора.
  • MEMBERLASTCALL - Время последнего вызова (UNIX-time).
  • MEMBERPENALTY - штраф (penalty) оператора.
  • MEMBERDYNAMIC - указывает динамический пользователь или нет.
  • MEMBERREALTIME - указывает realtime конфигурация оператора или нет.
 setinterfacevar=no

пример

пример

мы видим что интерфейс SIP/4887 динамический и время последнего вызова в UNIX-time.

exten => s,1,Queue(q1,cF,,,30)
   same => n,verbose(${MEMBERLASTCALL})
   same => n,verbose(${MEMBERDYNAMIC})
   same => n,verbose(${MEMBERINTERFACE})
-- Executing [s@from-fs-pjsip:1] Queue("PJSIP/fs_pjsip-0000003b", "q1,cF,,,30")
-- Called SIP/4887
-- SIP/4887-00000041 is ringing
-- SIP/4887-00000041 answered PJSIP/fs_pjsip-0000003b
-- Stopped music on hold on PJSIP/fs_pjsip-0000003b
-- Executing [s@from-fs-pjsip:2] Verbose("PJSIP/fs_pjsip-0000003d", "1476870427")
-- Executing [s@from-fs-pjsip:3] Verbose("PJSIP/fs_pjsip-0000003b", "1")
-- Executing [s@from-fs-pjsip:4] Verbose("PJSIP/fs_pjsip-0000003b", "SIP/4887")
setqueueentryvar

Если setqueueentryvar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди:

  • QEHOLDTIME - время ожидания вызывающего абонента.
  • QEORIGINALPOS - позиция в очереди.
 setqueueentryvar=no
setqueuevar

Если setqueuevar=yes, то следующие переменные будут назначены в каналах вызывающего абонента и оператора очереди, при соединении или когда вызывающий абонент покидает очередь:

  • QUEUENAME - имя очереди.
  • QUEUEMAX - максимальное кол-во вызовов разр. в очереди;
  • QUEUESTRATEGY - стратегия очереди;
  • QUEUECALLS - текущее кол-во вызовов в очереди;
  • QUEUEHOLDTIME - среднее время ожидания в очереди на данный момент;
  • QUEUECOMPLETED - кол-во обработанных вызовов;
  • QUEUEABANDONED - кол-во отвергнутых (неотвеченных) вызовов;
  • QUEUESRVLEVEL - уровень обслуживания очереди;
  • QUEUESRVLEVELPERF - процент вызовов отвечающих условию servicelevelна данный момент;
 setqueuevar=no
membermacro

Если установлено, выполнить Macro, когда соединение с оператором установлено.
Эта опция может быть перекрыта параметром macroприложения Queue()

 membermacro=macro_name[,arg1[,...][,argN]]
membergosub

Если установлено, выполнить GoSub, когда соединение с оператором установлено.
Эта опция может быть перекрыта параметром gosubприложения Queue()

 membergosub=gosub_context_name[,arg1[,...][,argN]]
announce-frequency

Как часто анонсировать позицию в очереди и среднее время ожидания. Если 0 то не анонсировать. Примечание: этот параметр игнорируется при изменении позиции абонента в очереди (см. min-announce-frequency)

 announce-frequency = 90
min-announce-frequency

Минимальный интервал между моментом перехода на следующую позицию и анонсом среднего времени удержания. Это полезно для избежания постоянных объявлений когда позиция в очереди абонента часто меняется. т.е., если позиция в очереди изменилась, то не оповещать, даже если подошло время announce-frequency. (см. announce-frequency)

 min-announce-frequency = 15
periodic-announce-frequency

Как часто делать periodic-announce.

 periodic-announce-frequency=60
random-periodic-announce

Производить периодическое оповещение в случайном порядке? По умолчанию - no.

 random-periodic-announce=no
relative-periodic-announce

Отсчитывать время для periodic-announceс момента завершения предыдущего анонса, а не от его начала. по умолчанию выключено.

 relative-periodic-announce=no
announce-holdtime

Включать объявление о среднем времени ожидания в объявление о позиции в очереди?
Можно указать yes, noили once (один раз).

 announce-holdtime = yes|no|once
announce-position

Объявлять позицию в очереди?
Возможные значения: «yes», «no», «limit», или «more».

  • yes - оповещать о позиции ожидающего абонента;
  • more - если кол-во ожидающих в очереди больше чем задано в announce-position-limit.

т.е., если announce-position-limit=5объявлять, что в очереди ожидают больше 5-ти абонентов.

  • limit - только ожидающие абоненты в пределах announce-position-limitуслышат объявление.
  • no - не объявлять позицию.
 announce-position = yes
announce-to-first-user

Если включено, то объявления будут проигрываться первому в очереди. Это может привести к ситуации, когда агент готов принять вызов, но соединени откладывается из-за объявления и приведет к задержкам в очереди. по умолчанию выключено.

 announce-to-first-user = no
announce-position-limit

Если назначено «limit» или «more» в announce-positionбудет задействован этот параметр.

 announce-position-limit = 5
announce-round-seconds

Округлять тайминги объявлений до заданного значения, если не = 0 Возможные значения 0, 5, 10, 15, 20, and 30.

announce-round-seconds = 10
Аудио файлы используемые для объявлений

Если не заданы другие, используются файлы перечисленные ниже:

queue-youarenext = queue-youarenext ;(«You are now first in line.»)

queue-thereare = queue-thereare ; («There are»)

queue-callswaiting = queue-callswaiting ; («calls waiting.»)

queue-holdtime = queue-holdtime ; («The current est. holdtime is»)

queue-minute = queue-minute ; («minute.»)

queue-minutes = queue-minutes ; («minutes.»)

queue-seconds = queue-seconds ; («seconds.»)

queue-thankyou = queue-thankyou ; («Thank you for your patience.»)

queue-reporthold = queue-reporthold ; («Hold time»)

periodic-announce = queue-periodic-announce ; («All reps busy / wait for next»)

queue-less-than

queue-quantity1

queue-quantity2

periodic-announce

Можно установить несколько звуковых файлов для основного объявления через запятую. Файлы будут воспроизведены в порядке перечисления.
Например:

 periodic-announce = queue-periodic-announce,your-call-is-important,please-wait
monitor-format

Для включения записи вызовов, требуется задать «monitor-format»,
если monitor-formatне задан, запись разговоров считается выключенной.
Вызовы будут записаны только с момента поднятию трубки оператором.

 monitor-format = gsm|wav|wav49
Queue Empty Options(параметры заполнения очереди)

Параметры очереди Asterisk «joinempty» и «leavewhenempty» регламентируют условия при которых абонент может встать в очередь и покинуть ее, соответственно.
Параметры «joinempty» и «leavewhenempty» могут принимать несколько значений, перечисленных через запятые.
Ниже приведем список факторов влияющих на эти параметры:

  • paused: считать недоступным, если оператор на паузе;
  • penalty: считать недоступным, если пенальти оператора меньше чем QUEUE_MAX_PENALTY;
  • inuse: считать недоступным, если телефон оператора в данный момент вызывается (звонит);
  • ringing: a member is not considered available if his phone is currently ringing
  • unavailable: Касается в основном каналов Agent (заданных в agents.conf). если агент назначен в agent.conf, но не зарегистрировался(каналы Agent можно считать устаревшими)
  • invalid: Интерфейсы имеющие статус «invalid».
  • unknown: Не имеющий явного статуса оператор.
  • wrapup: Оператор на таймауте wrapuptimeпосле вызова.

Пример, не подключаться к очереди,если все операторы имеют один из перечисленных статусов:

 joinempty = paused,inuse,invalid

Покинуть очередь, если все операторы имеют один из указанных статусов:

 leavewhenempty = inuse,ringing

; Устаревшие значения, могут быть указаны для обратной совместимости:

  • yes - (empty) for joinempty; penalty,paused,invalid for leavewhenempty
  • no - penalty,paused,invalid for joinempty; (empty) for leavewhenempty
  • strict - penalty,paused,invalid,unavailable
  • loose - penalty,invalid
reportholdtime

Если нужно оповестить оператора о том сколько абонент ожидал в очереди.

 reportholdtime = no
ringinuse

Чтобы избежать посылки вызова на оператора, чей интерфейс находится с состоянии 'in use', установите = no. Помимо общего значения очереди, можно установить этот параметр для отдельных пользователей очереди через команду QUEUE_MEMBER, поле 'ringinuse' реалтайм пользователей и CLI/AMI:

*CLI> queue set ringinuse no on SIP/4887 in queue1

 SIP/4887 (ringinuse disabled) (dynamic) (Not in use)

*CLI> queue set ringinuse yes on SIP/4887 in queue1

 SIP/4887 (ringinuse enabled) (dynamic) (Not in use)

только драйверы каналов SIPи PJSIP поддерживают в данный момент статус 'in use'

 ringinuse = no
memberdelay

Параметр устанавливает время задержки между моментом, когда агент отвечает на вызов и соединения его с вызывающим абонентом.

  memberdelay = 0
timeoutrestart

Если параметр «timeoutrestart» установлен в значение yes, тогда значение таймаута для агента будет сбрасываться, если от него будет получен сигнал BUSY или CONGESTION. Это бывает полезно, когда агент имеет возможность отметить вызов, отвергая его или, производя некоторые действия, которые имеют подобный эффект. (Обнаружено, что если вызов агента завершился со статусом NOANSWER (ring, no-answer), это так же заставляет вызов отправить к следующему агенту в очереди по алгоритму roundrobin).

 timeoutrestart = no
defaultrule

назначить правила по умолчанию. Конфигурация находится в queuerules.conf

 defaultrule = myrule

Asterisk queue Members

Каждый пользователь очереди перечисляется в отдельной строке
в виде технология/строка набора. Под пользователем понимается оператор очереди.
Дополнительный параметр penaltyможет быть задан после запятой.

Каждый оператор очереди Asteriskимеет параметр penalty.
Пенальти может быть определен в настройках пользователя очереди:

  member ⇒ interface[,penalty][,membername][,state_interface][,ringinuse]

или при добавлении динамического агента:

  queue add member <dial string> to <queue> [[[penalty <penalty>] as <membername>] state_interface <interface>] 

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

Предположим, очередь обслуживают 3 оператора с пенальти - 0,1 и 2 соответственно.
Первым будет вызван оператор с пенальти = 0 и только если он недоступен, оператор с пенальти = 1 и так далее.

Пенальти оператора может быть динамически изменен, например через CLI:

 queue set penalty <penalty> on <interface> [in <queue>]

или через AMI Actions QueuePenalty.

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

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

Дополнительное описание интерфейса указывается после третьей запятой.
На этот интерфейс будут посылаться уведомления app_queue,
но для вызова будет всегда использоваться указанный первым интерфейс.

 member => interface [,penalty][,membername][,state_interface][,ringinuse]
member => DAHDI/1
member => DAHDI/2,10
member => DAHDI/3,10,Stev Morrissev
member => Local/1000@default,0,Patty Smithoff,SIP/1000
member => Local/2000@default,0,Syd Buratinov,SIP/2000,no

IP АТС Asterisk и FreeSWITCH

$
0
0

IP АТС Asterisk и FreeSWITCH

Составим техническое задание.
Установим, настроим IP АТС Asterisk и FreeSWITCH.
Подберем и настроим VoIPоборудование.
Обучим обслуживающий персонал.

Базовая настройка IP АТС Asterisk

Для внедрения IP АТСнебольшой емкости (до 100 абонентов), прекрасно подходит программная АТС Asterisk с веб интерфейсом FreePBX. Русскоязычный, простой и интуитивно понятный веб интерфейс позволит вам, в дальнейшем, обслуживать АТСбез дополнительных затрат. Все используемое ПО является свободно распространяемым и вы платите только за пусконаладку. Приобретая базовую установку Asterisk вы гарантировано получаете:

Программное обеспечение и функционал:

  • Asterisk 14
  • FreePBX 13 - веб интерфейс настройки Asterisk
  • CDR-viewer - веб интерфейс записи и детализации вызовов
  • ARI (RESTful) и AMI - интерфейсы приложений.
  • Протоколы связи: SIP, IAX2, h323, DAHDI
  • Функции:
    • Очереди
    • Группы приема вызовов
    • Телеконференции
    • Автосекретарь
    • Маршрутизация вызовов
    • Переадресация вызовов
    • Факс-на-Емайл.
  • Операционная система: Centos 7 (Centos 6, Ubuntu или Debian - по требованию)

Базовая настройка IP АТС Asterisk:

  • Создание требуемого кол-ва IP абонентов
  • Подключение требуемого кол-ва SIP (или h323) транков к провайдеру IP телефонии.
  • Подключение потоков ISDN PRI E1.
  • Настройка входящей/исходящей маршрутизации по вашему ТЗ.
  • Настройка дневного/ночного режима
  • Настройка голосового меню (IVR)
  • Настройка групп приема вызовов.
  • Базовые настройки безопасности (IPtables и fail2ban)
  • Настройка приобретенного у нас оборудования (VoIPшлюзов, IP телефонов).
  • Консультации по настройке вашего оборудования.
  • Базовое обучение использования FreePBX для настройки Asterisk (Подключение IP абонентов, IP транков; создание очередей, телеконференций, голосовых меню, групп приема вызовов; использование сервисных кодов и отчетов о звонках.)
  • Бесплатная тех. поддержка в течении месяца с момента ввода в эксплуатацию.

Варианты установки:

  1. Удалённая установка/настройка на сервере заказчика.
  2. Установка на сервере заказчика.
  3. Установка/настройка на VPS хостинге
  4. Продажа сервера с установленной и настроенной системой.
  5. Embeddedустановка на устройства, например роутеры, поддерживающие работу с OpenWRT. Функционал может быть ограничен.

Расширенная настройка IP АТС Asterisk.

Базовая настройка Asterisk при помощи веб-интерфейса предоставляет большие возможности, намного превосходящие возможности традиционных АТС, но, отнюдь не полностью реализующие возможности Asterisk. Для систем большой емкости и самых продвинутых запросов мы предлагаем расширенную настройку. Полностью описать возможности и способы применения не под силу сжатому описанию, поэтому перечислим основные:

Реализация реалтайм архитектуры.

Под реалтайм в Asterisk подразумевается взаимодействие с базами данных и другими типами хранилищ в режиме реального времени. Поддерживается статическое хранение настроек Asterisk в БД и собственно реалтайм взаимодействие. -В первом случае, настройки получаются из хранилища в момент загрузки модуля или ядра АТС, так же как и при использовании конфигурационных файлов. -Во втором (реалтайм) настройки не требуют применения и доступны сразу, после внесения изменений. Также в Asterisk имеется большой набор команд и функций, для взаимодействия с реалтайм хранилищами в момент обработки вызова. В каких случаях применяется Реалтайм Архитектура?

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

Поддерживаются следующие типы хранилищ: MySQL, PostgreSQL, SQLite, LDAP, нативно и через ODBC, а также прием и передача данных при помощи cURL. Предлагаем любые реализации реалтайм архитектуры Asterisk.

Взаимодействие со сторонними приложениями

Asterisk имеет три интерфейса (4-ре вместе Command Line Interface) для взаимодействия с другими приложениями:

  1. AMI - Asterisk manager Interface
  2. ARI - Asterisk RESTful Interface
  3. AGI - Asterisk Gateway Interface

Сами по себе интерфейсы в установленном Asterisk готовы к работе и не требуют серьезной настройки. Предлагаем консультации по работе с APIи ПО под нужды клиентов.

Шифрование TLS SRTP

Для подключения внешних пользователей к корпоративной телефонной сети, часто используется шифрование голосового трафика. Asterisk поддерживает шифрование протоколом SRTP с методом обмена ключами SDES через SDP. Предлагаем настройку защищенных телекоммуникационных систем.

Построение корпоративной телефонной сети АТС

Предлагаем построение распределенных телефонных систем, интеграцию с другими АТСчерез VoIPи ISDN протоколы связи, с единым номерным планом и централизованным управлением. Построение VPN сетей под нужды телефонии. На нашем счету проекты объединяющие по 50 филиалов в единую телефонную сеть. Наши специалисты подберут оптимальное оборудование, зарекомендовавшее себя в других проектах.

Настройка IP АТС FreeSWITCH

«Там, где пехота не пройдет…»
Кросс-платформенная много-пользовательская программная АТС FreeSWITCH зарекомендовала себя системой повышенной производительности. Более сложный в настройке и обслуживании, чем Asterisk, тем не менее, FS показывает вчетверо большую производительность, при потреблении равных ресурсов. Если абонентская емкость превышает 200 номеров, имеет смысл рассмотреть FreeSWITCH в качестве альтернативы.

  1. IP АТСбольшой емкости.
  2. Много-пользовательские системы с распределенными ресурсами.
  3. Виртуальные и облачные АТС.
  4. Сервер широкополосных телеконференций.
  5. Session Border Controller.
  6. Сервер маршрутизации и биллинга.
  7. Системы автоматического оповещения абонентов.

Мы предлагаем установку и настройку IP АТС FreeSWITCH в любой из указанных ролей. В базовую настройку входит установка и настройка отказоустойчивой системы FreeSWITCH,
с использованием СУБД PostgreSQL в качестве базы данных ядра и регистраций,
а также MySQL - для отчетов о звонках, с веб-интерфейсом поиска и прослушивания записей.
Диалплан - XML .
Для систем автообзвона, предлагаем установку и настройку Newfies-diаler + FreeSWITCH на Debian 8.
Для систем биллинга и маршрутизации - ASTPP billing.


Свяжитесь с нами для получения подробной информации.
Asterisk

Only edit this fieldset if “IP ATC” is set to “Asterisk”.

Y Z O W H
FreeSWITCH

Only edit this fieldset if “IP ATC” is set to “FreeSWITCH”.

Настроим Asterisk, FreeSWITCH, IP АТС.

Настройка SIP в Asterisk - sip.conf

$
0
0

Настройка SIP в Asterisk - sip.conf

asterisk sip.conf Файл 'sip.conf' отвечает за настройку внутренних и внешних каналов SIPв Asterisk. Объекты конфигурации - пиры, описываются в отдельных секциях, которые обозначаются именами в [квадратных скобках]. Действует принцип наследования, как и в большинстве конфигов Asterisk: все что задано после имени в квадратных скобках, относится к одному объекту, пока не будет объявлен следующий.
Предопределенная категория - [general], задает глобальные настройкидрайвера SIP Asterisk, которые распространяются на все объекты, но могут быть переопределены для отдельных пиров в их категориях.

Asterisk SIP trunk

SIPтранк в Asterisk, это совокупность объектов для совершения исходящих и приема входящих вызовов по протоколу SIP. Выделим три основных объекта настроек транков в Asterisk:

  • register - формирует запрос SIP REGISTER для аутентификации на сервере провайдера.
  • peer - SIPобъект, через который совершаются вызовы. Формирует запросы OPTIONS, INVITE и тд.
  • user - SIPобъект для создания канала входящего вызова , его аутентификации и определения контекста транка.

Соединение обозначенное как user, это определение любой системы или оконечной точки (endpoint), которой мы разрешаем входящие вызовы на наш сервер Asterisk. Соединение type=userне обозначает никакого пользователя, а только создает канал и указывает контекст, для входа в диалплан аутентифицированных входящих вызовов.
Через соединение обозначенное как peerсовершаются исходящие вызовы.

Asterisk Register String

Register string - строка регистрации определяющая параметры SIPзапроса REGISTER.
В секции [general] добавьте определение register:

register ⇒ sipuser[:secret[:authuser]]@host[:port][/extension]

  • sipuser - идентификатор пользователя на SIPсервере провайдера.
  • authuser - не обязательное имя пользователя для авторизации на SIPсервере
  • secret - пароль пользователя.
  • host - домен или ip адрес SIPсервера.
  • port - на какой порт посылать запросы регистрации серверу host. Если не задано, то по умолчанию - 5060
  • /extension - расширение для обработки вызовов в диалплане Asterisk. Extension - подставляется в SIPзаголовок <contact>. Это значение используется удаленным SIPсервером, когда ему необходимо совершить вызов в сторону Asterisk. Задайте в контексте транка соответствующее расширение, для обработки входящих вызовов, например: exten ⇒ _1234567,1,Queue(queuename), где 1234567 - extension.
    • Если данный параметр не указан в строке регистрации, удаленный SIPсервер, вероятнее всего, использует параметр sipuserв качестве идентификатора вызова.

Вышеприведенный пример, упрощенный вариант строки регистрации. Полный вариант содержит больше информации:
register => [peer?][transport://]user[@domain][:secret[:authuser]]@host[:port][/extension][~expiry]

Обратите внимание на параметр transport, например tls:
register => tls://user:password@host


Строка регистрации имеет напрямую связанные с ней параметры [general]:

  • registertimeout=20 - повторять попытки регистрации каждые 20 секунд (по умолчанию)
  • registerattempts=10 - кол-во неудачных попыток регистрации. По умолчанию - 0 (т.е. продолжать бесконечно)

Для контроля SIPсообщений, статуса пиров и регистраций удобно использовать команды Asterisk CLI.
Вот некоторые из них:

  • sip show peers - Отобразить все пиры и их статус.
  • sip show peer <имя пира> - Показать конфигурацию определенного пира.
  • sip show registry - Отобразить статус регистраций на удаленном UAS.
  • sip set debug on - Показывать все SIPсообщения.
  • sip reload - Перечитать конфигурационный файл.
  • sip show settings - Показать текущую конфигурацию chan_sip.

Для получения подробной информации о командах смотрите Asterisk CLI - интерфейс командной строки.

Пример вывода команды sip show registryв консоли Asterisk:

#asterisk -rx 'sip show registry'
Host          dnsmgr   Username   Refresh   State        Reg.Time
sip.server:5060  N    1234567       105     Registered    Mon, 19 Dec 2016 11:48:03

Возможные состояния (state):

  • Registered - зарегистрирован.
  • Request Sent - запрос отправлен, ожидает ответа.
  • No Authentication - ответ отрицательный, регистрация отвергнута.

Пример SIPзапроса REGISTER

Пример SIPзапроса REGISTER

Reliably Transmitting (NAT) to sip.server:5060:
REGISTER sip:sip.serverSIP/2.0
Via: SIP/2.0/UDP asterisk.externip:5060;branch=z9hG4bK6eec0290;rport
Max-Forwards: 70
From: <sip:userid@sip.server>;tag=as6e3f5edb
To: <sip:userid@sip.server>
Call-ID: 6c3aef7a75d50db930fae9040cef6cf0@192.168.0.231
CSeq: 102 REGISTER
Supported: replaces, timer
User-Agent: Asterisk 13.9.0
Expires: 120
Contact: <sip:extension@asterisk.externip:5060>
Content-Length: 0


Регистрация необходима, чтобы принимать входящие вызовы от провайдера, если используется SIPтранк с аутентификацией. Как правило, это касается услуг связи предоставляемых через публичную сеть. Но могут быть и другие варианты SIPтранков, без аутентификации, через серую сеть провайдера, например. Или для связи двух доверенных серверов Asterisk в корпоративной сети. В этом случае регистрация не требуется, аутентификация, обычно, происходит по ip адресу. Для такого транка достаточно создать пир friendс минимумом параметров. Например:

[siptrunk-no-auth]
host=172.16.0.1
type=friend
disallow=all
allow=alaw
allow=opus
context=from-trunk
qualify=yes

Asterisk SIP peer

Для совершения исходящих вызовов должен быть создан объект type=peer.

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

Asterisk не делает различий между внутренними и внешними линиями, любой вызов совершается через какой-либо канал. Когда SIPсервер провайдера, вызывает Asterisk, то он совершает вызов через peer, проходя аутентификацию у user.

Конфигурация пиров осуществляется при помощи текстовых блоков, отделенных друг от друга квадратными скобками. Имя в квадратных скобках может совпадать с параметром 'defaultuser', но не обязательно.

[имя_пира]
type=peer, user или friend
параметр1=значение
параметр2=значение

Где имя_пира - это произвольное имя SIPустройства, на которое можно ссылаться из других конфигурационных файлов. Параметр type может принимать одно из трех значений: type = value

  • peer: SIPобъект, через который совершаются исходящие вызовы.
  • user: SIPобъект, через который принимаются входящие Asterisk .
  • friend: Запись, которая одновременно и userи peer. Этот тип, как правило, задается телефонам и другим оконечным устройствам. Для SIPпользователей этого типа Asterisk создаёт два объекта, один type=peerи один type=user, с одинаковыми именами.

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

[siptrunk]
type=friend               ;peer и user в одном флаконе
host=sip.server.tld       ;sip сервер провайдера
port=5060                 ;порт сигнализации sip сервера
transport=udp             ;транспорт для sip протокола

defaultuser=sipuser       ;имя пользователя
secret=password           ;пароль

fromuser=sipuser          ;переопределяет user в sip заголовке From: <sip:user@domain>;
fromdomain=sip.server.tld ;переопределяет domain в sip заголовке From: <sip:user@domain>;
insecure=port,invite      ;port - не требовать совпадения порта в инвайте
                          ;invite - не требовать аутентификации в инвайте
nat=force_rport,comedia   ;политики работы через nat
canreinvite=no            ;не соединять медиа потоки peer-to-peer в обход сервера
directmedia=nonat         ;тоже что canreinvite в новой редакции

dtmfmode=rfc2833          ;использовать спецификацию rfc2833 для передачи DTMF сигналов
context=from-siptrunk     ;контекст обработки входящих вызовов в extensions.conf.

disallow=all              ;запретить использование всех кодеков, чтобы затем разрешить определенные.
allow=alaw
allow=ulaw
allow=g729

В приведенном выше примере, для простоты, использован type=friend. Как уже было сказано, в этом случае будут созданы два SIPобъекта peerи userс одинаковыми именами и одинаковыми общими параметрами. Для объекта userдва ключевых параметра, это hostи context. В некоторых случаях, хост пира через который совершаются исходящие вызовы,через провайдера и хост user, через который принимаются вызовы, могут отличаться. В этом случае требуется создавать два типа объектов - peerи userсоответственно, для одного транка. Но в большинстве случаев, можно использовать тип friend.
Параметры hostи portте же, что и в строке регистрации, если провайдером не оговорено другое.
Транспорт, как правило UDP, задан по умолчанию в секции [general]. Укажите только если требуется задать специфический транспорт.
defaultuserи secretпараметры аутентификации для исходящих вызовов, обычно те же, что и useridи passwordв строке регистрации.
Параметры fromuserи fromdomainпринудительно подставляют в поле From: исходящего инвайта, указанные значения, что позволяет избежать отправки в сторону провайдера данных из инвайта пользователя.
Параметр insecureвыключает аутентификацию входящих вызовов. В большинстве случаев, провайдер не посылает параметры аутентификации в инвайте, поэтому надо указывать insecure=invite.
Если сервер Asterisk находится за NAT, а сервер провайдера в публичной сети интернет, то требуется указать тип nat=force_rport,comedia, чтобы Asterisk указывал в качестве обратного адреса параметры назначенные в [general] - externip. Смотрите подробнее: NAT, SIP и Asterisk
Спецификация dtmfmodeдолжна совпадать со стороной провайдера.
В указанном контексте будет определено, куда поступают входящие вызовы. Рассмотрим маршрутизацию вызовов в следующем разделе.

Входящая и исходящая маршрутизация sip транка в диалплане Asterisk

В диалплане (extensions.conf ) можно использовать разнообразный синтаксис для вызова (dial ) SIPустройств.

SIP/devicename
SIP/username@domain   (SIP uri)
SIP/username[:password[:md5secret[:authname[:transport]]]]@host[:port]
SIP/devicename/extension
SIP/devicename/extension/IP или Host
SIP/username@domain/IP или Host

В файле extensions.conf, для совершения исходящих вызовов, у Вас должно присутствовать правило набора, примерно такого вида:

exten => _9.,1,Dial(SIP/${EXTEN:1}@siptrunk-peer-name,30,r)

Где siptrunk-peer-nameимя SIPпира, назначенное транку. Переменная ${EXTEN:1} получает номер екстеншена и удаляет первую цифру- '9'. Подробная информация приведена в Asterisk Dialplan - extensions.conf.

Пример контекста для входящих вызовов в файле 'extensions.conf':

[from-siptrunk]
exten => _1234567,1,Dial(SIP/100&SIP101,180,tr) ; вызвать внутренние номера 100 и 101 одновременно.
exten => _1234568,1,Queue(queuename) ; поместить вызов в очередь
exten => _1234569,1,Dial(PJSIP/89219981138@pjsiptrunk,60,tr) ; перенаправить вызов на внешний номер

Где from-siptrunk контекст заданный userили friendобъекту.

Настройка SIP пира для регистрации внутренних абонентов

Как уже отмечалось Asterisk не делает особых различий между транками и абонентами, поэтому конфиг телефона будет похож на SIPтранк, но все же немного другой.

[777]
host=dynamic
type=friend
secret=**password**
qualify=yes
nat=no
port=5061
directmedia=no
context=from-internal
disallow=all
allow-alaw
allow=ulaw
alow=gsm
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
username=777
fromuser=777
dial=SIP/777
mailbox=777@device
call-limit=2
callcounter=yes
faxdetect=no
callgroup=1
pickupgroup=1

Рассмотрим некоторые опции:

  • host - dynamic или ip адрес с которого подключается абонент.
  • type - для абонентского пира это обычно friend
  • secret - пароль, использование сложных паролей убережет вас от многих неприятностей, даже если вы считаете сеть безопасной, в дальнейшем все может измениться и ваша предусмотрительность окажется очень кстати.
  • qualify - посылать SIPзапросы OPTIONS для проверки доступности устройства (возможно это является избыточным, т.к. большинство устройств сами обновляют регистрацию, через заданный в настройках интервал)
  • nat - если телефон находится в локальной сети то 'no', если регистрируется из интернет или другой интра сети, то 'force_rport'
    • nat = no - без NAT RFC3581
    • nat = force_rport - использовать rport, даже если его нет
    • nat = comedia - отправить медиа поток на порт Asterisk 12, независимо от указаний SDP.
    • nat = auto_force_rport - установить 'force_rport' параметр если Asterisk обнаружил NAT (по умолчанию)
    • nat = auto_comedia - установить 'comedia' параметр если Asterisk обнаружил NAT
  • directmedia - направлять медиа поток (RTPтрафик) через сервер или напрямую между каналами (пирами).

см. также по теме:NAT, SIP и Asterisk

  • port - порт SIPсигнализации устройства (не путайте c bindport asterisk, который для данного драйвера SIPв Asterisk может быть только один, 5060 по умолчанию, но для нового драйвера Asterisk pjsip.conf, может, или даже должен, быть назначен уникальный порт для каждого транспорта)
  • deny - сети из которых запрещено подключение
  • permit - сети из которых разрешено подключение (если абонент находится в локальной сети, назначьте ему параметр permit=192.168.1.0/255.255.255.0 и регистрация на этом пире будет разрешена только из этой подсети. ACLочень действенная мера безопасноcти. См. также Asterisk:acl.conf
  • call-limit -сколько одновременных вызовов (concurrent calls) может производится через данный канал. Хорошая идея, как для локальных так и для удаленных абонентов. Если пир взломан, злоумышленники не смогут пропустить через канал больше указанного кол-ва вызовов зараз(ы).

'call-limit' опция признана устаревшей и заменена на 'callcounter'. Установить ограничение одновременных вызовов теперь можно переменной канала function 'GROUP_COUNT'
пример использования данного метода можно помотреть здесь: Ограничение количества одновременных вызовов по набранному номеру.

Настройка нескольких SIP пиров по шаблону

Если у вас множество SIPпиров, которые имеют общие настройки и отличаются например, только 'username' и 'secret', можно создать шаблон.
Для этого надо создать шаблонный пир, а рядом с его именем в квадратных скобках, написать восклицательный знак в круглых скобках и задать общие настройки:

[local_pattern](!)
host=dynamic
type=friend
context=from-internal
nat=no
disallow=all
allow=ulaw
allow=alaw

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

[776](local_pattern)
username=776
secret=super_puper_secret_1
callerid=8123216111
[777](local_pattern)
username=777
secret=super_puper_secret_2
callerid=8121234567

Asterisk sip.conf General SIP Options

Полный список параметров general sip.conf

Следующие параметры используются в общей [general] секции sip.conf:

allowexternalinvites

Если установлено 'no', запрещает INVITE и REFER от внешних (не из localnet) доменов. См domain

 allowexternalinvites=yes|no
allowguest

Если 'no', запрещает гостевые(без аутентификации) подключения. По умолчанию sipguest подключения разрешены.

 allowguest=no|yes
allowoverlap

Вкл. или Выкл набор по одной цифре (т.е. каждая набранная цифра будет сразу отправляться в канал)

 allowoverlap=no|yes
allowsubscribe

Разрешить ли внешним устройствам подписку (SUBSCRIBE) на информацию о статусе екстеншена. По умолчанию - 'yes':

 allowsubscribe=yes|no
allowtransfers

Когда установлено 'no', запрещает любые трансферы, если не переопределено в настройках пира.

 allowtransfers=no|yes
alwaysauthreject

Если включено, всегда отвечает на INVITE и REGISTER, SIPсообщением 401 Unauthorized, вместо того чтобы сообщить вызывающему о существовании запрашиваемого user или peer. Важная настройка безопасности

alwaysauthreject=no|yes
autodomain

Установите эту опцию 'yes', чтобы добавить локальное HOSTNAME и локальный IP адрес в список доменов:

 autodomain=yes|no
bindaddr and bindport

Эти параметры определяют IP адрес и порт на которых Asterisk будет слушать SIPзапросы. Для драйвера канала SIP Asterisk 'chan_sip' можно назначить только один адрес и порт для всех подключений для UDP и один порт для TCP транспорта, в отличии от нового драйвера PJSIP. По умолчанию адрес не задан и лучше так и оставить. Некоторые рекомендуют изменять порт по умолчанию 5060, на другой, в целях безопасности. Но помните, что это только одна из мер безопасности, не самая важная, и не гарантирует вам полной защиты от злоумышленников.

bindaddr=0.0.0.0
bindport=5060

Вы можете задать независимые для UDP, TCP и TLS транспорта значения udpbindadd, tcpbindaddrи tlsbindaddr

buggymwi

Вкл. эту опцию, чтобы избежать ошибок при сообщении с некоторыми ip телефонами при отправке MWI сообщений.

buggymwi=no|yes
callevents

Установите 'yes', если хотите генерировать информацию о SIPсобытиях для AMI (asterisk manager interface)

 callevents=yes
checkmwi

Время в секундах, между проверками голосовой почты :

 checkmwi=30
compactheaders

Использовать или нет компактные SIPзаголовки.

 compactheaders=yes|no
defaultexpiry

Срок действия регистрации в секундах для входящих и исходящих регистраций. При входящей регистрации, этот параметр задается клиентской стороной, и заданное здесь значение используется, только если клиент не сообщил свое занчение. Для исходящих регистраций этот параметр сообщается удаленной стороне UAS (user agent server)

 defaultexpiry=300
directrtpsetup

Данная опция позволяет управлять RTPсоединением между двумя оконечными точками без re-INVITE(экспериментальная опция, используйте на свой страх и риск).

 directrtpsetup=yes|no
domain

Задает имя домена сервера Asterisk по умолчанию. Командой CLI'sip show domains' выводится список локальных доменов.

 domain=example.com
dumphistory

Вкл. или Выкл. отчет в завершении SIPдиалога. SIP history выводится в DEBUG лог канала.

 dumphistory=yes|no
externhost

Когда Asterisk находится за NAT, SIPзаголовок обычно использует IP адрес сервера. Если включить данную опцию, Asterisk будет производить периодические DNSопросы для определения имени хоста и заменять IP адрес на 'externhost'.

 externhost=my.hostname.tld

Используйте externip.

externip

externip содержит IP адрес в качестве аргумента. Если Asterisk находится за NAT, SIPзаголовок Contact: содержит внутренний IP адрес сервера, тогда удаленная сторона не знает куда отправлять ответы. Параметр externip вкупе с параметром nat=force_rport модифицирует SIPзаголовок, сообщая удаленному SIPсерверу адрес на который надо слать ответы:

 externip=123.123.123.123
externrefresh

Если все же используется 'externhost', указывает промежуток времени в секундах между запросами DNS.

 externrefresh=30
g726nonstandard

Значения: yes/no, по умолчанию: no. Если клиент собирается для сеанса связи «договориться» использовать звуковой кодек G726-32, с использованием компрессии AAL2, вместо RFC3551 (что требуется для аппаратов фирмы Sipura и шлюзов от Grandstream, и может другим). То это противоречит спецификации RFC3551, клиент должен вместо этого «договориться» использовать AAL2-G726-32

 g726nonstandard=yes
ignoreregexpire (global)

Если ignoreregexpire установлен 'yes', Asterisk сделает одно из двух, в зависимости от настроек пиров: 1)Non-realtime peer Когда регистрация истекает, информация не удаляется из памяти или БД Asterisk и вызовы будут разрешены несмотря на то, что время регистрации истекло.

2)Realtime peers Когда peer сконфигурирован в режиме реального времени, информация о регистрации используется независимо от defaultexpiry

 ignoreregexpire=yes|no
jbenable

Вкл. поддержку RTP jitter buffer на принимающей стороне канала SIP. По умолчанию 'no'. Будет работать, только если удаленная сторона поддерживает эту функцию. подробнее о Джиттер

 jbenable=yes|no
jbforce

Принудительное использование jitter buffer принимающей стороной SIPканала.

 jbforce=yes|no
jbimpl

Использовать фиксированный или подстраиваемый (адаптивный) jitter buffer. fixed jitter buffer всегда использует значение из jbmaxsize adaptive может принимать значение больше jbmaxsize По умолчанию 'fixed':

 jbimpl=fixed|adaptive

Из личного опыта, вкл. 'adaptive' может приводить к весьма плачевным результатам.

jblog

Вкл./выкл jitter buffer frame лог. По умолчанию 'no':

 jblog=yes|no
jbmaxsize

Установите максимальную длину буфера в миллисекундах:

 jbmaxsize=200
jbresyncthreshold

Джиттер буфер порог синхронизации. По умолчанию 1000:

 jbresyncthreshold=1000
icesupport

Использовать Interactive Connectivity Establishment (ICE) в Asterisk

 icesupport=no
limitonpeers

Применять call-limit только для type=peer Это улучшит использование call-limit для устройств настроенных, как type=friend, отделив ограничение call-limit от входящих вызовов.

 limitonpeers=yes|no
localnet

укажет серверу Asterisk какие подсети являются локальными, прозрачными для использования IP адресов сервера, SIPзапросы к которым не требуют модификации поля Contact: c использованием externipили externhost

 localnet=192.168.1.0/24
 localnet=172.16.0.0/16
matchexterniplocally

Сверять 'externip' с 'localnet' и производить подстановку, только если 'externip' из локальной подсети. Не совсем ясно, зачем это может понадобиться? Возможно при очень нестандартной топологии сети.

 matchexterniplocally=yes|no
maxexpiry

Максимальная продолжительность регистрации в секундах.

 maxexpiry=3600
minexpiry

Минимальная продолжительность регистрации в секундах.

 minexpiry=60
notifymimetype

Указывает MIME тип используемый для message-waiting indication (MWI) в SIP NOTIFY сообщении.

 notifymimetype=text/plain
notifyringing

Сообщать подписчикам о состоянии вызов (RINGING):

 notifyringing=yes|no
notifyhold

Сообщать подписчикам (subscribers) о состоянии удержание (HOLD):

 notifyhold=yes|no
pedantic

Скурпулезная проверка SIPсообщений. Устанавливает более строгую проверку по стандартам SIPRFC.

 pedantic=yes
realm

Данная установка используется для аутентификации в SIP. Задайте realm полное доменное имя вашего сервера. Имя должно быть совершенно уникальным.

 realm=mybox.example.com
recordhistory

Вкл. или Выкл историю sip для всех каналов.

 recordhistory=yes|no
registerattempts

Сколько попыток внешних регистраций произведет Asterisk, прежде чем откажется от продолжения. По умолчанию стоит '0', что значит бесконечно.

 registerattempts=0
registertimeout

Таймаут между попытками регистрации на другом устройстве.

 registertimeout=30
relaxdtmf

Если плохо распознаются DTMFсигналы, включите данную опцию.

 relaxdtmf=yes|no
rtautoclear

(global)Конфигурация Realtime Peers Указывает должен ли Asterisk обнулять созданные на лету friends по истечении времени регистрации. Если установлено 'yes', по истечении срока регистрации, удалять friends до нового запроса. Если задано число, то оно используется вместо обычного времени регистрации.

rtautoclear=yes|no|seconds
rtcachefriends

(global)

Если rtcachefriends включен, Asterisk будет кэшировать friends(реалтайм пиры), которые приходят из realtime engine, так же, как если бы они сконфигурированы в «sip.conf».

 rtcachefriends=yes|no
rtsavesysname

(global) Определяет, должен ли Asterisk сохранить SystemName в базе данных в режиме реального времени во время регистрации:

 rtsavesysname=yes|no
rtupdate

(global) Если установлено 'yes' Asterisk будет обновлять IP-адрес, порт и период регистрации пиров при регистрации. По умолчанию 'yes':

 rtupdate=yes|no
sipdebug

Указывает, должен или нет Asterisk включать SIP debug сразу при загрузке драйвера канала SIP.

 sipdebug=yes|no
sendrpid

ОТправлять или нет Remote-Party-ID header:

 sendrpid=yes|no
srvlookup

Записи DNS SRV являются одним из способов указания адреса для связи сервером. Используя записи SRV, вы получаете многие преимущества DNS, в то время как отключения SRV DNSлишает вас возможности принимать SIPвызовы на основании доменных имен. В настоящее время поддержка записей SRV в Asterisk несколько хромает. Если несколько записей SRV возвращаются, Asterisk будет использовать только первую запись. Чтобы включить, установите srvlookup = yes в секции [general] файла sip.conf:

 srvlookup=yes
transport

Задает транспорт по умолчанию. По умолчанию 'udp', но может быть 'tcp', 'tls', 'ws' или 'wss'.Если задано TCP а tcpenable=no будет использован UDP транспорт.

transport=udp
tcpenable

Включить поддержку TCP транспорта chan_sip Asterisk.

 tcpenable=yes
tcpbindaddr

Адрес на котором Asterisk «слушает» TCP подключения.

  IPv4 example: bindaddr=0.0.0.0:5062
  IPv6 example: bindaddr=[::]:5062
tcpauthtimeout

tcpauthtimeout указывает максимальное время в секундах данное клиенту на аутентификацию. Если за заданное время клиент не прошел проверку он отключается. (По умолчаннию 30 секунд)

 tcpauthtimeout = 30
tcpauthlimit

Максимальное кол-во неаутентифицированных сессий в момент любой времени.

 tcpauthlimit = 100
t1min

Минимальная задержка туда-обратно (minimum round-trip) для сообщения контролируемого хоста. По умолчанию 100 миллисеунд:

 t1min=100
subscribecontext

Ограничить запросы SUBSCRIBE только указанным контекстом, если не переопределено в настройках пира.

 subscribecontext=internal
t38pt_udptl

Установка t38pt_udptl 'yes' вкл. T.38 fax (UDPTL) насквозь (passthrough) для SIP-to-SIPвызовов с поддержкой T.38. Эта настройка включается глобально для всех устройств, но вы можете отключить её для конкретного устройства.

 t38pt_udptl=yes|no

T.38 fax passthrough работает только для SIP-to-SIPвызовов, любые local или agent каналы не могут быть использованы.

tos_sip, tos_audio, andtos_video

Asterisk может установить TOS bits в IP заголовках для помощи маршрутизаторам приотеризации трафика. tos_sip, tos_audio, и tos_video установки управляют TOS битами для SIPсообщений, RTPаудио и RTPвидео, соответственно. Поддерживаются: CS0, CS1, CS2, CS3, CS4, CS5, CS6, CS7, AF11, AF12, AF13, AF21, AF22, AF23, AF31, AF32, AF33, AF41, AF42, AF43. Можно также использовать цифровые значения для TOS битов.

trustrpid

Доверять или нет Remote-Party-ID header: Asterisk SIP trustrpid

 trustrpid=yes|no
useragent

Значение поля useragent в SIPзаголовке. По умолчанию версия Asterisk:

 useragent=Asterisk PBX v14.6.0

Если вы не желаете сообщать, что используете Asterisk, напишите Cisco или Avaya, или abyrvalg v2.0.

usereqphone

usereqphone опция говорит Asterisk добавить «user=phone» в SIP URIs которые содержат действующий номер телефона:

usereqphone 
videosupport

Dinstar DAG2000-8S8O - Asterisk

$
0
0

Dinstar DAG2000-8S8O - Asterisk

192.168.1.2 - IP адрес сервера Аsterisk
192.168.1.4 - IP адрес Dinstar

fxo1 - порт FXO Dinstar
fxo1 - SIPтранк Asterisk

001 - Offhook Auto-Dial - код набираемый шлюзом при поступлении входящего вызова по FXO порту
001 - префикс получаемый шлюзом от сервера Asterisk

Dinstar

SIP Server

Задайте IP адрес Asterisk в качестве Primary SIP sever:

dinstar dag sip server

Port

Создайте FXS порты:

dinstar dag port fxs

Создайте FXO порты:

Параметр Offhook Auto-Dial - DIDкоторый будет вызываться на Asterisk, при поступлении входящего вызова на FXO.

dinstar dag port fxo

Advanced > SIP parameter

Задайте SIPнастройки, в примере принимаем подключения только с севера Asterisk

asterisk advanced_sip_parameters

Call & Routing > IP trunk

создайте IP Trunk с адресом Asterisk
в принципе, можно обойтись и SIP server заданным в первую очередь (см. выше)

dinstar dag call_and_routing-ip_trunk

Routing Parameter

Оставим без изменений.

dinstar call_and_routing-routing_parameter

IP->Tel Routing

Маршрутизация (выбор FXO порта, по которому будет произведен исходящий вызов)
по префиксу полученному от Asterisk (в примере - 001)
На скриншоте выше, мы отставили по умолчанию Calls from IP > Routing Before Manipulation
т.е. маршрутизировать до преобразования номера,
теперь перейдем к преобразованию.

dinstar dag call_and_routing-ip-tel_routing

Manipulation > IP->Tel Callee

нам нужно удалить полученный от Asterisk префикс 001 чтобы отправить в FXO правильный номер:

Calls from - источник вызова

Callee Prefix - префикс на основании которого будет произведено преобразование.

Calls to Port - порт FXO в который будет направлен вызов после преобразования.

Stripped Digits from Left - количество удаляемых цифр, в примере «3».

dinstar manipulation-ip-tel_routing

asterisk + freepbx

В астериск создадим нужное кол-во SIPтранков, с параметрами заданными при создании FXO портов шлюза:

freepbx asterisk sip trunk

Настроим маршрутизацию в Asterisk при помощи FreePBX.

Входящая маршрутизация

При создании FXO портов мы задали уникальные параметры Offhook Auto-Dial, для каждого FXO порта.

Пропишите их в качестве DIDв модуле Connectivity > Inbound Routes
Таким образом реализуется наведение входящих вызовов с каждого порта FXO по требуемому назначению.

freepbx inbound routes

Исходящая маршрутизация

Как уже говорилось выше, выбор FXO порта на шлюзе, через который будет произведен вызов
производится по уникальному префиксу.
Создадим требуемое кол-во маршрутов. В примере пользователь набирает префикс выхода на городские линии «9», который удаляется Asterisk
и автоматически подставляется префикс «001», который передаётся шлюзу.
Далее производится маршрутизация в шлюзе, описанная выше.

freepbx outbound_routes

Asterisk pjsip.conf

$
0
0

Asterisk pjsip.conf

asterisk pjsip.conf Описание параметров настройки pjsip в Asterisk. Подробное руководство на русском. Примеры и сравнения. pjsip vs sip.

PJSIP - драйвер канала SIP в Asterisk

Что такое PJSIP

PJSIP мультимедийная библиотека с открытым кодом, для реализации протоколов SIP, SDP, RTP, STUN, TURNи ICE. Она сочетает лучшие возможности SIPсигнализации, хорошую проходимость NATи высокий уровень взаимодействия с приложениями. Подходит практически для любого типа систем, начиная от компьютеров и заканчивая встраиваемыми системами (embedded systems) и мобильными телефонами.

Формат файла pjsip.conf

Pjsip.conf обычный текстовый файл, как и все конфигурационные файлы Asterisk, состоит из секций. Каждая секция (раздел) определяет конфигурацию объекта res_pjsip. Секции отделены друг от друга именами, заключенными в квадратные скобки [какая неожиданность] и содержат одну или более конфигурационную опцию и её значение отделенное знаком равно.

[ SectionName ]
ConfigOption = Value
ConfigOption = Value

Имена секций pjsip.conf

В большинстве случаев имена секций могут быть произвольными, однако в случае с типами ENDPOINT и AORимена должны совпадать со заголовком SIPURI«To» для идентификации входящих SIPзапросов. Каждая секция имеет обязательную опцию type=, которой определяется назначение секции в конфигурации объектов res_pjsip.

Типы секций pjsip.conf

Ниже перечислены типы секций res_pjsipи простейшие примеры конфигурации.

Варианты и значения по умолчанию

Как узнать возможные варианты значений и параметры по умолчанию? В этом поможет встроенная справка интерфейса командной строки (CLI).

"config show help res_pjsip <configobject> <configoption>"

Например: config show help res_pjsip endpoint rewrite_contact

config show  help  res_pjsip endpoint rewrite_contact[endpoint]
rewrite_contact = [Boolean](Default: no)(Regex: false) 
Allow Contact header to be rewritten with the source IP address-port 
 On inbound SIP messages from this endpoint, the Contact header or an
appropriate Record-Route header will be changed to have the source IP address
and port. This option does not affect outbound messages sent to this endpoint.

И видим. что параметр rewrite_contactимеет значение по умолчанию = no, тип значения Boolean, т.е. возможное значение = yes

Секция System

System settings

System settings

[system]

  • timer_t1=500 ; Установить значение таймера T1в миллисекундах (default: «500»)
  • timer_b=32000 ; Установить значение таймера Bв миллисекундах (default: «32000»)
  • compact_headers=no ; Использовать короткие формы имен SIPзаголовков(default: «no»)
  • threadpool_initial_size=0 ; Initial number of threads in the res_pjsip threadpool (default: «0»)
  • threadpool_auto_increment=5 ; The amount by which the number of threads is incremented when necessary (default: «5»)
  • threadpool_idle_timeout=60 ; Number of seconds before an idle thread should be disposed of (default: «60»)
  • threadpool_max_size=0 ; Maximum number of threads in the res_pjsip threadpool. A value of 0 indicates no maximum (default: «0»)
  • disable_tcp_switch=yes ; Disable automatic switching from UDP to TCP transports if outgoing request is too large. See RFC 3261 section 18.1.1. Disabling this option has been known to cause interoperability issues, so disable at your own risk. (default: «yes»)
  • type= ; Must be of type system (default: «»)

Секция Global

Global settings.

Global settings.

  • max_forwards=70 ; Value used in Max Forwards header for SIP requests (default: «70»)
  • type= ; Must be of type global (default: «»)
  • user_agent=Asterisk PBX SVN-branch-12-r404375 ; Value used in User Agent header for SIP requests and Server header for SIP responses (default: «»)
  • default_outbound_endpoint=default_outbound_endpoint ; Endpoint to use when sending an outbound request to a URI without a specified endpoint (default: «d efault_outbound_endpo int»)
  • debug=no ; Enable/Disable SIP debug logging. Valid options include yes|no

; or a host address (default: «no»)

  • keep_alive_interval=20 ; The interval (in seconds) at which to send keepalive messages on all active connection-oriented transports (default: «0»)
  • contact_expiration_check_interval=30 ;The interval (in seconds) to check for expired contacts.
  • disable_multi_domain=no ; Disable Multi Domain support. If disabled it can improve realtime performace by reducing number of database requsts (default: «no»)
  • endpoint_identifier_order=ip,username,anonymous The order by which endpoint identifiers are given priority. Currently, «ip», «username», «auth_username» and «anonymous» are valid identifiers as registered by the res_pjsip_endpoint_identifier_* modules. Some modules like res_pjsip_endpoint_identifier_user register more than one identifier. Use the CLI command «pjsip show identifiers» to see the identifiers currently available. (default: ip,username,anonymous)
  • max_initial_qualify_time=4 ; The maximum amount of time (in seconds) from startup that qualifies should be attempted on all contacts. If greater than the qualify_frequency for an aor, qualify_frequency will be used instead.
  • regcontext=sipregistrations ; If regcontext is specified, Asterisk will dynamically create and destroy a NoOp priority 1 extension for a given endpoint who registers or unregisters with us. The extension added is the name of the endpoint.
  • default_voicemail_extension=asterisk ;The voicemail extension to send in the NOTIFY Message-Account header if not set on endpoint or aor. (default: «»)

The following unidentified_request options are only used when «auth_username» matching is enabled in «endpoint_identifier_order».

  • unidentified_request_count=5 ; The number of unidentified requests that can be received from a single IP address in unidentified_request_period seconds before a security event is generated. (default: 5)
  • unidentified_request_period=5 ; See above. (default: 5 seconds)
  • unidentified_request_prune_interval=30 ; The interval at which unidentified requests are check to see if they can be pruned. If they're older than twice the unidentified_request_period, they're pruned.
  • default_from_user=asterisk ; When Asterisk generates an outgoing SIP request, the From header username will be set to this value if there is no better option (such as CallerID or endpoint/from_user) to be used
  • default_realm=asterisk ; When Asterisk generates a challenge, the realm will be set to this value if there is no better option (such as auth/realm) to be used

Asterisk Task Processor Queue Size
On heavy loaded system with DB storage you may need to increasetaskprocessor queue. If the taskprocessor queue size reached high water level, the alert is triggered. If the alert is set the pjsip distibutor stops processing incoming requests until the alert is cleared. The alert is cleared when taskprocessor queue size drops to the low water clear level. The next options set taskprocessor queue levels for MWI.

  • mwi_tps_queue_high=500 ; Taskprocessor high water alert trigger level.
  • mwi_tps_queue_low=450 ; Taskprocessor low water clear alert level.

; The default is -1 for 90% of high water level.

                  ; Unsolicited MWI
                  ; If there are endpoints configured with unsolicited MWI
                  ; then res_pjsip_mwi module tries to send MWI to all endpoints on startup.
 * **mwi_disable_initial_unsolicited**=no ; Disable sending unsolicited mwi to all endpoints on startup.  If disabled then unsolicited mwi will start processing on the endpoint's next contact update.
  • ignore_uri_user_options=no ; Enable/Disable ignoring SIPURI user field options. If you have this option enabled and there are semicolons in the user field of a SIPURI then the field is truncated at the first semicolon. This effectively makes the semicolon a non-usable character for PJSIP endpoint names, extensions, and AORs. This can be useful for improving compatability with an ITSP that likes to use user options for whatever reason.
                    ; Example:
                    ; URI: "sip:1235557890;phone-context=national@x.x.x.x;user=phone"
                    ; The user field is "1235557890;phone-context=national"
                    ; Which becomes this: "1235557890"

Note: The caller-id and redirecting number strings obtained from incoming SIPURI user fields are always truncated at the first semicolon.

*CLI> pjsip show settings

Global Settings:

 ParameterName                     : ParameterValue
 =============================================================
 contact_expiration_check_interval : 30
 debug                             : no
 default_from_user                 : asterisk
 default_outbound_endpoint         : default_outbound_endpoint
 default_voicemail_extension       :
 endpoint_identifier_order         : ip,username,anonymous
 keep_alive_interval               : 0
 max_forwards                      : 70
 max_initial_qualify_time          : 0
 regcontext                        :
 user_agent                        : FPBX-12.0.76.4(13.9.0)

System Settings:

 ParameterName             : ParameterValue
 ==========================================
 compact_headers           : false
 disable_tcp_switch        : true
 threadpool_auto_increment : 5
 threadpool_idle_timeout   : 60
 threadpool_initial_size   : 0
 threadpool_max_size       : 50
 timer_b                   : 32000
 timer_t1                  : 500

ENDPOINT

Модуль ENDPOINT определяет многочисленные параметры SIP, а также связь с другими модулями - AUTH, AORи TRANSPORT.
Секция ENDPOINT должна быть обязательно связана с одной или несколькими секциями AOR.
По сути дела, ENDPOINT является основным профилем SIPтелефона или SIPтранка в res_pjsip, аналогично пиру в sip.conf.
Только если там определялись почти все параметры, то здесь часть ключевых свойств вынесены в специальные секции (модули), которые и будут рассмотрены ниже.

ENPOINT все параметры

ENPOINT все параметры

  • 100rel=yes - разрешить поддержку RFC3262 ACK (по умолчанию «yes»)
  • aggregate_mwi=yes ; (default: «yes»)
  • allow= - используемые кодеки (по умолчанию: «»)
  • aors= - AoR используемая ENDPOINT (по умолчанию: «»)
  • auth= - Объект аутентификации соотнесенный с endpoint (по умолчанию: «»)
  • callerid= - CallerID используемый endpoint (default: «»)
  • callerid_privacy=allowed_not_screened - Уровень приватности (по умолчанию: «allowed_not_screened»)
  • callerid_tag= - Внутренняя метка (Internal id_tag) для endpoint (по умолчанию: «»)
  • context=default - Контекст диалплана для данной endpoint.
  • direct_media_glare_mitigation=none ; Mitigation of direct media re INVITE glare (default: «none»)
  • direct_media_method=invite ; Direct Media method type (default: «invite»)
  • connected_line_method=invite ; Connected line method type (default: «invite»)
  • direct_media=yes ; Determines whether media may flow directly between endpoints (default: «yes»)
  • disable_direct_media_on_nat=no ; Disable direct media session refreshes when NAT obstructs the media session (default: «no»)
  • disallow= ; Media Codec s to disallow (default: «»)
  • dtmf_mode=rfc4733 ; DTMF mode (default: «rfc4733»)
  • media_address= ; IP address used in SDP for media handling (default: «»)
  • bind_rtp_to_media_address= ; Bind the RTP session to the media_address. This causes all RTP packets to be sent from the specified address. (default: «no»)
  • force_rport=yes ; Force use of return port (default: «yes»)
  • ice_support=no ; Enable the ICE mechanism to help traverse NAT (default: «no»)
  • identify_by=username ; A comma-separated list of ways the Endpoint or AoR can be identified.
    • «username»: Identify by the From or To username and domain
    • «auth_username»: Identify by the Authorization username and real. In all cases, if an exact match on username and domain/realm fails, the match will be retried with just the username (default: «username»)
  • redirect_method=user ; How redirects received from an endpoint are handled (default: «user»)
  • mailboxes= ; NOTIFY the endpoint when state changes for any of the specified mailboxes. Asterisk will send unsolicited MWI NOTIFY messages to the endpoint when state changes happen for any of the specified mailboxes. (default: «»)
  • voicemail_extension= ; The voicemail extension to send in the NOTIFY Message-Account header (default: global/default_voicemail_extension)
  • mwi_subscribe_replaces_unsolicited=no ;An MWI subscribe will replace unsoliticed NOTIFYs (default: «no»)
  • moh_suggest=default ; Default Music On Hold class (default: «default»)
  • moh_passthrough=yes ; Pass Music On Hold through using SIP re-invites with sendonly when placing on hold and sendrecv when taking off hold
  • outbound_auth= ; Authentication object used for outbound requests (default: «»)
  • outbound_proxy= ; Proxy through which to send requests a full SIPURI must be provided (default: «»)
  • rewrite_contact=no ; Allow Contact header to be rewritten with the source IP address port (default: «no»)
  • rtp_ipv6=no ; Allow use of IPv6 for RTP traffic (default: «no»)
  • rtp_symmetric=no ; Enforce that RTP must be symmetric (default: «no»)
  • send_diversion=yes ; Send the Diversion header conveying the diversion information to the called user agent (default: «yes»)
  • send_pai=no ; Send the P Asserted Identity header (default: «no»)
  • send_rpid=no ; Send the Remote Party ID header (default: «no»)
  • rpid_immediate=no ; Send connected line updates on unanswered incoming calls immediately. (default: «no»)
  • timers_min_se=90 ; Minimum session timers expiration period (default: «90»)
  • timers=yes ; Session timers for SIP packets (default: «yes»)
  • timers_sess_expires=1800 ; Maximum session timer expiration period (default: «1800»)
  • transport= ; Desired transport configuration (default: «»)
  • trust_id_inbound=no ; Accept identification information received from this endpoint (default: «no»)
  • trust_id_outbound=no ; Send private identification details to the endpoint (default: «no»)
  • type= ; Must be of type endpoint (default: «»)
  • use_ptime=no ; Use Endpoint s requested packetisation interval (default: «no»)
  • use_avpf=no ; Determines whether res_pjsip will use and enforce usage of AVPF for this endpoint (default: «no»)
  • media_encryption=no ; Determines whether res_pjsip will use and enforce usage of media encryption for this endpoint (default: «no»)
  • media_encryption_optimistic=no ; Use encryption if possible but don't fail the call if not possible.
  • g726_non_standard=no ; When set to «yes» and an endpoint negotiates g.726 audio then g.726 for AAL2 packing order is used contrary to what is recommended in RFC3551. Note, 'g726aal2' also needs to be specified in the codec allow list (default: «no»)
  • inband_progress=no ; Determines whether chan_pjsip will indicate ringing using inband progress (default: «no»)
  • call_group= ; The numeric pickup groups for a channel (default: «»)
  • pickup_group= ; The numeric pickup groups that a channel can pickup (default: «»)
  • named_call_group= ; The named pickup groups for a channel (default: «»)
  • named_pickup_group= ; The named pickup groups that a channel can pickup (default: «»)
  • device_state_busy_at=0 ; The number of in use channels which will cause busy to be returned as device state (default: «0»)
  • t38_udptl=no ; Whether T 38 UDPTL support is enabled or not (default: «no»)
  • t38_udptl_ec=none ; T 38 UDPTL error correction method (default: «none»)
  • t38_udptl_maxdatagram=0 ; T 38 UDPTL maximum datagram size (default: «0»)
  • fax_detect=no ; Whether CNG tone detection is enabled (default: «no»)
  • fax_detect_timeout=30 ; How many seconds into a call before fax_detect is disabled for the call.Zero disables the timeout.(default: «0»)
  • t38_udptl_nat=no ; Whether NAT support is enabled on UDPTL sessions(default: «no»)
  • t38_udptl_ipv6=no ; Whether IPv6 is used for UDPTL Sessions (default:«no») for this endpoint (default: «»)
  • language= ; Set the default language to use for channels created for this endpoint (default: «»)
  • one_touch_recording=no ; Determines whether one touch recording is allowed for this endpoint (default: «no»)
  • record_on_feature=automixmon ; The feature to enact when one touch recording is turned on (default: «automixmon»)
  • record_off_feature=automixmon ; The feature to enact when one touch recording is turned off (default: «automixmon»)
  • rtp_engine=asterisk ; Name of the RTP engine to use for channels created for this endpoint (default: «asterisk»)
  • allow_transfer=yes ; Determines whether SIP REFER transfers are allowed for this endpoint (default: «yes»)
  • sdp_owner=- ; String placed as the username portion of an SDP origin o line(default: «-»)
  • sdp_session=Asterisk ; String used for the SDP session s line (default: «Asterisk»)
  • tos_audio=0 ; DSCP TOS bits for audio streams (default: «0»)
  • tos_video=0 ; DSCP TOS bits for video streams (default: «0»)
  • cos_audio=0 ; Priority for audio streams (default: «0»)
  • cos_video=0 ; Priority for video streams (default: «0»)
  • allow_subscribe=yes ; Determines if endpoint is allowed to initiate subscriptions with Asterisk (default: «yes»)
  • sub_min_expiry=0 ; The minimum allowed expiry time for subscriptions initiated by the endpoint (default: «0»)
  • from_user= ; Username to use in From header for requests to this endpoint (default: «»)
  • mwi_from_user= ; Username to use in From header for unsolicited MWI NOTIFYs to this endpoint (default: «»)
  • from_domain= ; Domain to user in From header for requests to this endpoint (default: «»)
  • dtls_verify=no ; Verify that the provided peer certificate is valid (default: «no»)
  • dtls_rekey=0 ; Interval at which to renegotiate the TLS session and rekey the SRTP session (default: «0»)
  • dtls_cert_file= ; Path to certificate file to present to peer (default:«»)
  • dtls_private_key= ; Path to private key for certificate file (default: «»)
  • dtls_cipher= ; Cipher to use for DTLS negotiation (default: «»)
  • dtls_ca_file= ; Path to certificate authority certificate (default: «»)
  • dtls_ca_path= ; Path to a directory containing certificate authority certificates (default: «»)
  • dtls_setup= ; Whether we are willing to accept connections connect to the other party or both (default: «»)
  • dtls_fingerprint= ; Hash to use for the fingerprint placed into SDP (default: «SHA-256»)
  • srtp_tag_32=no ; Determines whether 32 byte tags should be used instead of 80 byte tags (default: «no»)
  • set_var= ; Variable set on a channel involving the endpoint. For multiple channel variables specify multiple 'set_var'(s)
  • rtp_keepalive= ; Interval, in seconds, between comfort noise RTP packets if RTP is not flowing. This setting is useful for ensuring that holes in NATs and firewalls are kept open throughout a call.
  • rtp_timeout= ; Hang up channel if RTP is not received for the specified number of seconds when the channel is off hold (default: «0» or not enabled)
  • rtp_timeout_hold= ; Hang up channel if RTP is not received for the specified number of seconds when the channel «0» or not enabled)
  • contact_user= ; On outgoing requests, force the user portion of the Contact header to this value (default: «»)
Простой пример конфигурации секции ENDPOINT
[777]
type=endpoint
context=from-internal
disallow=all
allow=alaw
transport=udp-transport
auth=auth777
aors=777

В данном примере мы видим тип секции: type=endpoint
контекст, разрешенные кодеки и также ассоциацию с другими секциями
transport=udp-transport, auth=auth777и aors=777.
Насколько я понимаю, опции typeи aorsявляются обязательными для работоспособности точки.
Для назначения Caller ID этому пиру(ENDPOINT), потребуется задать следующие параметры:

trust_id_outbound=yes
callerid=V Pupkin <777>

TRANSPORT

Настройка транспортного уровня res_pjsip. Используются протоколы UDP, TCP, WebSockets и методы шифрования TLS/SSL. Можно настроить одну транспортную секцию для использования множеством точек (ENDPOINT), или создать уникальный транспортный уровень для конкретной точки. Условно, можно сравнить TRANSPORT, с секцией [general] sip.conf.

TRANSPORT все параметры

TRANSPORT все параметры

  • async_operations=1 ; Number of simultaneous Asynchronous Operations (default: «1»)
  • bind= ; IP Address and optional port to bind to for this transport (default: «»)
  • ca_list_file= ; File containing a list of certificates to read TLS ONLY (default: «»)
  • ca_list_path= ; Path to directory containing certificates to read TLS ONLY. PJProject version 2.4 or higher is required for this option to be used. (default: «»)
  • cert_file= ; Certificate file for endpoint TLS ONLY. Will read .crt or .pem file but only uses cert, a .key file must be specified via priv_key_file. Since PJProject version 2.5: If the file name ends in _rsa, for example «asterisk_rsa.pem», the files «asterisk_dsa.pem» and/or «asterisk_ecc.pem» are loaded (certificate, inter- mediates, private key), to support multiple algorithms for server authentication (RSA, DSA, ECDSA). If the chains are different, at least OpenSSL 1.0.2 is required. (default: «»)
  • cipher= ; Preferred cryptography cipher names TLS ONLY (default: «»)
  • domain= ; Domain the transport comes from (default: «»)
  • external_media_address= ; External IP address to use in RTP handling (default: «»)
  • external_signaling_address= ; External address for SIP signalling (default: «»)
  • external_signaling_port=0 ; External port for SIP signalling (default: «0»)
  • method= ; Method of SSL transport TLS ONLY (default: «»)
  • local_net= ; Network to consider local used for NAT purposes (default: «»)
  • password= ; Password required for transport (default: «»)
  • priv_key_file= ; Private key file TLS ONLY (default: «»)
  • protocol=udp ; Protocol to use for SIP traffic (default: «udp»)
  • require_client_cert= ; Require client certificate TLS ONLY (default: «»)
  • type= ; Must be of type transport (default: «»)
  • verify_client= ; Require verification of client certificate TLS ONLY (default:«»)
  • verify_server= ; Require verification of server certificate TLS ONLY (default: «»)
  • tos=0 ; Enable TOS for the signalling sent over this transport (default: «0»)
  • cos=0 ; Enable COS for the signalling sent over this transport (default: «0»)
  • websocket_write_timeout=100 ; Default write timeout to set on websocket transports. This value may need to be adjusted for connections where Asterisk must write a substantial amount of data and the receiving clients are slow to process the received information. Value is in milliseconds; default is 100 ms.
  • allow_reload=no ; Although transports can now be reloaded, that may not be desirable because of the slight possibility of dropped calls. To make sure there are no unintentional drops, if this option is set to 'no' (the default) changes to the particular transport will be ignored. If set to 'yes', changes (if any) will be applied.

По умолчанию, для применения настроек транспортного уровня недостаточно перечитать конфиги. Потребуется рестартовать Asterisk, если не задано allow_reload=true (по умолчанию - false)

простой пример конфигурации секции TRANSPORT
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0

или TLS транспорт c ключами:

[transport-tls]
type=transport
protocol=tls
bind=0.0.0.0:5066
cert_file=/etc/asterisk/keys/asterisk.crt
priv_key_file=/etc/asterisk/keys/asterisk.key
external_media_address=123.123.123.1
external_signaling_address=123.123.123.1
local_net=10.10.0.0/16
method=tlsv1

Каждый транспорт в системе должен иметь уникальный порт.

localhost*CLI> pjsip show transports

Transport:  <TransportId........>  <Type>  <cos>  <tos>  <BindAddress....................>
 =========================================================================================

Transport:  udp-transport             udp      0      0  0.0.0.0:5080
Transport:  udp-transport-infra       udp      0      0  192.168.1.110:5081
Transport:  udp-transport-megafon     udp      0      0  0.0.0.0:5060

AUTH

Секция аутентификации содержит опции и полномочия для входящих и исходящих регистраций. С этой секцией ассоциируются такие секции как ENDPOINT и REGISTRATIONS.
Разные ENDPOINT и REGISTRATIONS могут использовать одну и ту же секцию аутентификации, если требуется.

config show help res_pjsip auth

config show help res_pjsip auth

localhost*CLI> config show help res_pjsip auth
auth: [category !~ /.?/] 
Authentication type 
 Authentication objects hold the authentication information for use by other
objects such as'endpoints' or 'registrations'. This also allows for multiple
objects to use a single auth object. See the 'auth_type' config option for
password style choices. 
auth_type                    -- Authentication type
nonce_lifetime            -- Lifetime of a nonce associated with this authentication config.
md5_cred                    -- MD5 Hash used for authentication.
password                     -- PlainText password used for authentication.
realm                          -- SIP realm for endpointtype-- Must be 'auth'
username                    -- Username to use for account
Простой пример секции AUTH
[auth777]
type=auth
auth_type=userpass
password=password
username=777

с использованием MD5

[auth6001]
type=auth
auth_type=md5
md5_cred=5f4dcc3b5aa765d61d8327deb882cf99
username=777

AOR

Главная функция AoR (Address of Record) указать Asterisk, как связаться с ENDPOINT. Без соответствующей AORсекции, точка ENDPOINT будет недоступна для вызова. Здесь также задаются соответствия голосовой почте, MWI, продолжительность действия регистрации -expiration и настройки qualify (периодической отправки SIPсообщений OPTONS для мониторинга состояния устройств)

Когда Asterisk получает запрос на регистрацию от устройства, он в первую очередь ищет соответствующую SIPзаголовку To: «777»<sip:777@192.168.1.21;transport=UDP> запись в именах секций AOR– в нашем прмере [777]

config show help res_pjsip aor

config show help res_pjsip aor

localhost*CLI> config show help res_pjsip aor
aor: [category !~ /.?/] 
The configuration for a location of an endpoint 
 An AoR is what allows Asterisk to contact an endpoint via res_pjsip. If no
AoRs are specified, an endpoint will not be reachable by Asterisk. Beyond
that, an AoR has other uses within Asterisk, such as inbound registration. 
 An 'AoR' is a way to allow dialing a group of 'Contacts' that all use the
 same 'endpoint'for calls.
 This can be used as another way of grouping a list of contacts to dial
 rather than specifing them each directly when dialing via the dialplan. This
 must be used in conjuction with the 'PJSIP_DIAL_CONTACTS'.
 Registrations: For Asterisk to match an inbound registration to an endpoint,
 the AoR object name must match the user portion of the SIP URI in the "To:"
 header of the inbound SIP registration. That will usually be equivalent to
 the "user name"setin your hard or soft phones configuration. 
contact                   -- Permanent contacts assigned to AoR
default_expiration        -- Default expiration timein seconds for contacts that are dynamica
mailboxes                 -- Allow subscriptions for the specified mailbox(es)
maximum_expiration        -- Maximum time to keep an AoR
max_contacts              -- Maximum number of contacts that can bind to an AoR
minimum_expiration        -- Minimum keep alive timefor an AoR
remove_existing           -- Determines whether new contacts replace existing ones.type-- Must be of type'aor'.
qualify_frequency         -- Interval at which to qualify an AoR
authenticate_qualify      -- Authenticates a qualify request if needed
outbound_proxy            -- Outbound proxy used when sending OPTIONS request
support_path              -- Enables Path support for REGISTER requests and Route support for
Простейший пример секции AOR
[777]
type=aor
max_contacts=1

Опция max_contact=1 значит, что только один SIP User Agent может быть одновременно зарегистрирован через эту запись AOR. Можно указать и 10, если потребуется.

[777]
type=aor
contact=sip:777@192.168.1.21:5060

Во втором примере мы не ожидаем запроса на регистрацию от SIP UA,
а указываем вручную постоянный контакт для этой записи.
Можно не беспокоится о кол-ве подключений, адрес все равно один.

[siptrunk]
type=aor
contact=sip:123.123.1.1:5060

В последнем примере пропущен username, что позволяет использовать данную запись для исходящей связи,
определяя вызываемый номер при помощи диалплана «Dial(PJSIP/${EXTEN}@siptrunk)».

REGISTRATION

Секция регистраций отвечает за исходящие регистрации. Используется для регистрации в удаленных системах, будь то другой Asterisk или транк от провайдера.

config show help res_pjsip_outbound_registration registration

config show help res_pjsip_outbound_registration registration

localhost*CLI> config show help res_pjsip_outbound_registration  registration
registration: [category !~ /.?/] 
The configuration for outbound registration 
 Registration is *COMPLETELY* separate from the rest of 'pjsip.conf'. A minimal
configuration consists of setting a 'server_uri'        and a 'client_uri'. 
auth_rejection_permanent  -- Determines whether failed authentication challenges are treated a
client_uri                -- Client SIP URI used when attempting outbound registration
contact_user              -- Contact User to use in request
expiration                -- Expiration timefor registrations in seconds
max_retries               -- Maximum number of registration attempts.
outbound_auth             -- Authentication object to be used for outbound registrations.
outbound_proxy            -- Outbound Proxy used to send registrations
retry_interval            -- Interval in seconds between retries if outbound registration is u
forbidden_retry_interval  -- Interval used when receiving a 403 Forbidden response.
server_uri                -- SIP URI of the server to register against
transport                 -- Transport used for outbound authenticationtype-- Must be of type'registration'.
support_path              -- Enables Path support for outbound REGISTER requests  
Пример секции REGISTRATION
[siptrunk]
type=registration
transport=udp-transport
outbound_auth=siptrunk
server_uri=sip:123.123.1.1:5060
client_uri=sip:username@192.168.1.1:5060
retry_interval=60

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

[providertrunk]
type=registration
transport=udp-transport
outbound_auth=providertrunk
server_uri=sip:sip.example.com
client_uri=sip:1234567890@sip.example.com
retry_interval=60

Пример регистрации транка провайдера.

DOMAIN_ALIAS

Псевдоним домена. [Имя] данной секции является псевдонимом, а конфигурационная опция domain=, доменным именем, которому сопоставлен псевдоним.

config show help res_pjsip domain_alias

config show help res_pjsip domain_alias

localhost*CLI> config show help res_pjsip domain_alias
domain_alias: [category !~ /.?/] 
Domain Alias 
 Signifies that a domain is an alias. If the domain on a session is not found
to match an AoR then this object is used to see if we have an aliasfor the
AoR to which the endpoint is binding. This objects name as defined in
configuration should be the domain alias and a config option is provided to
specify the domain to be aliased. type-- Must be of type'domain_alias'.
domain                    -- Domain to be aliased
Пример секции DOMAIN_ALIAS
[example2.com]
type=domain_alias
domain=example.com

ACL

Модуль не привязан к какой-либо точке ENDPOINTs и управляет всеми входящими SIPкоммуникациями с использованием res_pjsip. Установки ACl (Access Control Lis) могут быть назначены в самой секции, или в файле acl.confна который будет ссылаться секция.

config show help res_pjsip_acl acl

config show help res_pjsip_acl acl

localhost*CLI> config show help res_pjsip_acl  acl
acl: [category !~ /.?/] 
Access Control List 
acl                       -- List of IP ACL section names in acl.conf
contact_acl               -- List of Contact ACL section names in acl.conf
contact_deny              -- List of Contact header addresses to deny
contact_permit            -- List of Contact header addresses to permit
deny                      -- List of IP addresses to deny access from
permit                    -- List of IP addresses to permit access fromtype-- Must be of type'acl'.
Простые примеры ACL

Asterisk res_pjsip_acl

Настройки берутся из файла acl.conf:

[acl]
type=acl
acl=example_named_acl1

Настройки непосредственно в секции:

[acl]
type=acl
deny=0.0.0.0/0.0.0.0
permit=123.12.123.0
permit=123.12.123.1

Конфиг разрешающий регистрацию на основе SIPзаголовка, а не IP адреса.

[acl]
type=acl
contactdeny=0.0.0.0/0.0.0.0
contactpermit=123.12.123.0
contactpermit=123.12.123.1

IDENTIFY

Определяет конечные точки с помощью IP-адреса источника.

config show help res_pjsip_endpoint_identifier_ip identify

config show help res_pjsip_endpoint_identifier_ip identify

localhost*CLI> config show help res_pjsip_endpoint_identifier_ip identify
identify: [category !~ /.?/]

Identifies endpoints via source IP address

endpoint                  -- Name of Endpoint
match                     -- IP addresses or networks to match against
type                      -- Must be of type 'identify'.
Пример identity
[777]
type=identify
endpoint=777
match=123.0.112.1

CONTACT

Контакты являются одним из способов не указывать явно SIPURIв плане набора (диалплане).

config show help res_pjsip contact

config show help res_pjsip contact

localhost*CLI> config show help res_pjsip contact
contact: [category !~ /.?/]

A way of creating an aliased name to a SIP URI

 Contacts are a way to hide SIP URIs from the dialplan directly. They are
also used to make a group of contactable parties when in use with 'AoR' lists.


type                      -- Must be of type 'contact'.
uri                       -- SIP URI to contact peer
expiration_time           -- Time to keep alive a contact
qualify_frequency         -- Interval at which to qualify a contact
outbound_proxy            -- Outbound proxy used when sending OPTIONS request
path                      -- Stored Path vector for use in Route headers on outgoing requests.

Отношения объектов конфигурации pjsip.conf

ENDPOINT

  • Множество ENDPOINTs связываются с множеством AORs
  • Ноль или больше ENDPOINTs связаны с ноль или одной AUTHs
  • Ноль или больше ENDPOINTs связаны с как минимум одним TRANSPORT
  • Ноль или одна ENDPOINTs связана с определенной IDENTIFY

REGISTRATION

  • Ноль или больше REGISTRATIONs связаны с ноль или одной AUTHs
  • Ноль или больше REGISTRATIONs связаны с как минимум одним TRANSPORT

AOR

  • Множество ENDPOINTs связываются с множеством AORs
  • Множество AORs связаны с множеством CONTACTs

CONTACT

  • Множество CONTACTs связываются с множеством AORs

IDENTIFY

  • Ноль или больше ENDPOINTs связаны с определенным IDENTIFY объектом.

ACL, DOMAIN_ALIAS

  • Эти объекты не имеют направленных связей с другими объектами.

Примеры диалплана для вызова PJSIP пиров и екстеншенов.

 exten => _6XXX,1,Dial(PJSIP/${EXTEN})
 exten => _9NXXNXXXXXX,1,Dial(PJSIP/mytrunk/sip:${EXTEN:1}@203.0.113.1:5060)
 exten => _9NXXNXXXXXX,1,Dial(PJSIP/${EXTEN:1}@mytrunk)

Примеры

Пример ENDPOINT для одного SIP телефона с регистрацией на Asterisk.
;===============TRANSPORT

[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0

;===============EXTENSION 777

[777]
type=endpoint
context=from-internal
disallow=all
allow=alaw
transport=udp-transport
auth=auth777
aors=777

[auth777]
type=auth
auth_type=userpass
password=777
username=777

[777]
type=aor
max_contacts=1
  • auth= используется для входящей аутентификации
  • max_contacts= установите кол-во регистраций, одну или более, разрешенных для этой учетной записи.
Пример SIP транка с исходящей регистрацией
;==============TRANSPORTS

[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0

;===============TRUNK

[siptrunk]
type=registration
transport=udp-transport
outbound_auth=siptrunk
server_uri=sip:sip.example.com
client_uri=sip:1234567890@sip.example.com
retry_interval=60

[siptrunk]
type=auth
auth_type=userpass
password=1234567890
username=1234567890

[siptrunk]
type=aor
contact=sip:123.0.112.1:5060

[siptrunk]
type=endpoint
transport=udp-transport
context=from-trunk
disallow=all
allow=alaw,ulaw
outbound_auth=siptrunk
aors=siptrunk

[siptrunk]
type=identify
endpoint=siptrunk
match=123.0.112.1
Пример регистрации множественных ENDPOINTs с использованием шаблонов
;===============TRANSPORT

[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0

;===============ENDPOINT TEMPLATES

[endpoint-basic](!)
type=endpoint
transport=udp-transport
context=from-internal
disallow=all
allow=alaw

[auth-userpass](!)
type=auth
auth_type=userpass

[aor-single-reg](!)
type=aor
max_contacts=1

;===============EXTENSION 777

[777](endpoint-basic)
auth=auth777
aors=777

[auth777](auth-userpass)
password=777
username=777

[777](aor-single-reg)

;===============EXTENSION 778

[778](endpoint-basic)
auth=auth778
aors=778

[auth778](auth-userpass)
password=778
username=778

[778](aor-single-reg)

;===============EXTENSION 779

[779](endpoint-basic)
auth=auth779
aors=779

[auth779](auth-userpass)
password=779
username=779

[779](aor-single-reg) 

От старого к новому - sip.conf к pjsip.conf сравнение примеров.

Сравнение конфигурации ENDPOINT

  • Два SIPтелефона должны звонить и принимать вызовы через Asterisk.
  • В обоих случаях для аутентификации используются username и password.
  • 777 регистрируется с динамического IP, 778 со статического IP адреса.

1

sip.confpjsip.conf
[general]
udpbindaddr=0.0.0.0

[777]
type=friend
host=dynamic
disallow=all
allow=alaw
context=from-internal
secret=1234

[778]
type=friend
host=192.168.1.2
disallow=all
allow=alaw
context=from-internal
secret=1234
[udp-transport]
type=transport
protocol=udp
bind=0.0.0.0

[777]
type = endpoint
transport = udp-transport
context = from-internal
disallow = all
allow = alaw
aors = 777
auth = auth777

[777]
type = aor
max_contacts = 1

[auth777]
type=auth
auth_type=userpass
password=1234
username=777

[778]
type = endpoint
transport = udp-transport
context = from-internal
disallow = all
allow = alaw
aors = 778
auth = auth778

[778]
type = aor
contact = sip:778@192.168.1.2:5060

[auth778]
type=auth
auth_type=userpass
password=1234
username=778

Сравнение конфигурации trunk

sip.confpjsip.conf
[general]
udpbindaddr=0.0.0.0

register => myname:1234@203.0.113.1:5060

[mytrunk]
type=friend
secret=1234
username=myname
host=123.0.112.1
disallow=all
allow=alaw
context=from-trunk
[simpletrans]
type=transport
protocol=udp
bind=0.0.0.0
[mytrunk]
type=registration
transport=simpletrans
outbound_auth=mytrunk
server_uri=sip:@123.0.112.1:5060
client_uri=sip:myname@123.0.112.1:5060

[mytrunk]
type=auth
auth_type=userpass
password=1234
username=myname

[mytrunk]
type=aor
contact=sip:123.0.112.1:5060

[mytrunk]
type=endpoint
transport=simpletrans
context=from-trunk
disallow=all
allow=alaw
outbound_auth=mytrunk
aors=mytrunk

[mytrunk]
type=identify
endpoint=mytrunk
match=123.0.112.1

PJSIP CLI

Connected to Asterisk 13.9.1 currently running on aster2 (pid = 17401)
asterisk*CLI> core show help pjsip
pjsip dump endpt               -- Dump the res_pjsip endpt internals
pjsip export config_wizard primitives [to] -- Export config wizard primitives
pjsip list aors                -- List PJSIP Aors
pjsip list auths               -- List PJSIP Auths
pjsip list channels            -- List PJSIP Channels
pjsip list ciphers             -- List available OpenSSL cipher names
pjsip list contacts            -- List PJSIP Contacts
pjsip list endpoints           -- List PJSIP Endpoints
pjsip list identifies          -- List PJSIP Identifies
pjsip list registrations       -- List PJSIP Registrations
pjsip list transports          -- List PJSIP Transports
pjsip qualify                  -- Send an OPTIONS request to a PJSIP endpoint
pjsip send register            -- Registers an outbound registration target
pjsip send unregister          -- Unregisters outbound registration target
pjsip set history {on|off|clear} -- Enable/Disable PJSIP History
pjsip set logger {on|off|host} -- Enable/Disable PJSIP Logger Output
pjsip show aors                -- Show PJSIP Aors
pjsip show aor                 -- Show PJSIP Aor
pjsip show auths               -- Show PJSIP Auths
pjsip show auth                -- Show PJSIP Auth
pjsip show channels            -- Show PJSIP Channels
pjsip show channel             -- Show PJSIP Channel
pjsip show channelstats        -- Show PJSIP Channel Stats
pjsip show contacts            -- Show PJSIP Contacts
pjsip show contact             -- Show PJSIP Contact
pjsip show endpoints           -- Show PJSIP Endpoints
pjsip show endpoint            -- Show PJSIP Endpoint
pjsip show history             -- Display PJSIP History
pjsip show identifiers         -- List registered endpoint identifiers
pjsip show identifies          -- Show PJSIP Identifies
pjsip show identify            -- Show PJSIP Identify
pjsip show registrations       -- Show PJSIP Registrations
pjsip show registration        -- Show PJSIP Registration
pjsip show settings            -- Show global and system configuration options
pjsip show transports          -- Show PJSIP Transports
pjsip show transport           -- Show PJSIP Transport
pjsip show version             -- Show the version of pjproject in use

Asterisk настройка

Asterisk коды абонентских функций - features.conf

$
0
0



Asterisk коды абонентских функций - features.conf

В файле features.conf назначаются пользовательские коды абонентских функций Asterisk и опции абонентских функций, такие как:
Переадресация вызова(transfer), перехват вызова (pickup), запись по требованию (record on demand), таймауты между набора и переадресации (digit timeout), паркинг (park) и др.

Features Configuration

[globals]

Общие параметры абонентских функций Asterisk.
CLI> config show help features globals

  • featuredigittimeout– Время в миллисекундах между вводом цифр кода абонентской функции. (Default: 1000)
  • courtesytone– Звук проигрываемый, когда активирована запись вызова (automon или automixmon). (Default: )
  • recordingfailsound– Звук проигрываемый в случае неудачной попытки активировать запись вызова. (Default: )
  • transferdigittimeout– Максимальное время в секундах между вводом цифр, при переводе вызова. (Default: 3)
  • atxfernoanswertimeout– Время ожидания ответа при сопровождаемом переводе вызова, прежде чем удерживаемый вызов вернется к инициатору перевода. (Default: 15)
  • atxferdropcall– Отбить входящий вызов, если переадресация не удалась. (Default: no)

Если данный параметр = 'no', тогда Asterisk в случае неудачи, пытается повторить перевод, через период заданный параметром atxferloopdelay, предпринимая кол-во попыток заданное параметром atxfercallbackretries. Если же установлено 'yes', то все каналы участвующие в переводе отключаются.

  • atxferloopdelay– Время в секундах между повторными попытками перевода.(Default: 10)
  • atxfercallbackretries– Кол-во попыток перевода.(Default: 2)
  • xfersound– Звук проигрываемый в случае успешной переадресации соединенным каналам. Этот же звук воспроизводится при выполнении команды Asterisk app: Bridge (Default: beep)
  • xferfailsound– Звук проигрываемый инициатору перевода, при неудаче.(Default: beeperr)
  • atxferabort– Код завершения перевода. (Default: *1). При сопровождаемом переводе набор данного кода прервет перевод и снова соединит исходные каналы.
  • atxfercomplete– Код завершения сопровождаемого перевода. (Default: *2)

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

  • atxferthreeway– Код создания трехсторонней конференции, вместо перевода (Default: *3)
  • atxferswap– Код переключения между двумя объектами переадресации. (Deafult *4) При сопровождаемом переводе инициатор переадресации может дождаться ответа номера на который он переводит вызов и переключаться между ним и переадресуемым вызовом при помощи данной функции. Если потребуется соединить вызовы, то можно использовать код atxfercomplete, создать трехсторонний вызов - код atxferthreeway, а код atxferabortвернет переадресуемый вызов к инициатору, завершив выполнение переадресации.
  • pickupexten – Digits used for picking up ringing calls
  • pickupsound – Sound to play to picker when a call is picked up
  • pickupfailsound – Sound to play to picker when a call cannot be picked up
  • transferdialattempts – Number of dial attempts allowed when attempting a transfer
  • transferretrysound – Sound that is played when an incorrect extension is dialed and th
  • transferinvalidsound – Sound that is played when an incorrect extension is dialed and th

featuremap

DTMF options that can be triggered during bridged calls

applicationmap

– Section for defining custom feature invocations during a call

featuregroup

asterisk.conf

$
0
0

asterisk.conf

/etc/asterisk/asterisk.conf

В файле конфигурации asterisk.conf Вы определяете следующее:

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

Пример конфигурации.

Директории

Директории используемые в Asterisk.

[directories](!)
astetcdir => /etc/asterisk
astmoddir => /usr/lib/asterisk/modules
astvarlibdir => /var/lib/asterisk
astdbdir => /var/lib/asterisk
astkeydir => /var/lib/asterisk
astdatadir => /var/lib/asterisk
astagidir => /var/lib/asterisk/agi-bin
astspooldir => /var/spool/asterisk
astrundir => /var/run/asterisk
astlogdir => /var/log/asterisk
astsbindir => /usr/sbin

astetcdir => /etc/asterisk

Конфигурационные .confфайлы.

ls -1 /etc/asterisk

ls -1 /etc/asterisk

asterisk.conf
ccss.conf
ccss_general_additional.conf
ccss_general_custom.conf
cdr_adaptive_odbc.conf
cdr.conf
cdr_mysql.conf
cdr_mysql.conf.bak
cel.conf
cel_custom_post.conf
cel_general_additional.conf
cel_general_custom.conf
cel_odbc.conf
cel_odbc_custom.conf
chan_dahdi_additional.conf
chan_dahdi.conf
chan_dahdi.conf.bk
chan_dahdi.conf.template
confbridge_additional.conf
confbridge.conf
confbridge_custom.conf
dahdi-channels.conf
dahdi-channels.conf.bak
enum.conf
extensions_additional.conf
extensions.conf
extensions_custom.conf
extensions_custom.conf.sample
extensions_override_freepbx.conf
features_applicationmap_additional.conf
features_applicationmap_custom.conf
features.conf
features_featuremap_additional.conf
features_featuremap_custom.conf
features_general_additional.conf
features_general_custom.conf
freepbx_featurecodes.conf.template
freepbx_menu.conf.template
freepbx_module_admin.conf
globals_custom.conf
http_additional.conf
http.conf
http_custom.conf
iax_additional.conf
iax.conf
iax_custom.conf
iax_custom_post.conf
iax_general_additional.conf
iax_general_custom.conf
iax_registrations.conf
iax_registrations_custom.conf
indications.conf
localprefixes.conf
logger.conf
logger_general_additional.conf
logger_general_custom.conf
logger_logfiles_additional.conf
logger_logfiles_custom.conf
manager_additional.conf
manager.conf
manager.conf.bak
manager_custom.conf
meetme_additional.conf
meetme.conf
modem.conf
modules.conf
musiconhold_additional.conf
musiconhold.conf
musiconhold_custom.conf
phone.conf
phpagi.conf
privacy.conf
queuerules_additional.conf
queuerules.conf
queuerules_custom.conf
queues_additional.conf
queues.conf
queues_custom.conf
queues_custom_general.conf
queues_general_additional.conf
queues_post_custom.conf
res_digium_phone_additional.conf
res_digium_phone_applications.conf
res_digium_phone.conf
res_digium_phone_devices.conf
res_digium_phone_firmware.conf
res_digium_phone_general.conf
res_fax.conf
res_fax_custom.conf
res_fax_digium.conf
res_fax_digium_custom.conf
res_odbc_additional.conf
res_odbc.conf
res_odbc_custom.conf
rtp_additional.conf
rtp.conf
rtp_custom.conf
sip_additional.conf
sip.conf
sip_custom.conf
sip_custom_post.conf
sip_general_additional.conf
sip_general_custom.conf
sip_nat.conf
sip_notify_additional.conf
sip_notify.conf
sip_notify_custom.conf
sip_registrations.conf
sip_registrations_custom.conf
udptl.conf
udptl_custom.conf
version
vm_email.inc
vm_general.inc
voicemail.conf
voicemail.conf.template
zapata.conf.template

astmoddir => /usr/lib(64)/asterisk/modules

Модули (applications, codec, functions)

modules

modules

app_adsiprog.so
app_alarmreceiver.so
app_amd.so
app_authenticate.so
app_cdr.so
app_celgenuserevent.so
app_chanisavail.so
app_channelredirect.so
app_chanspy.so
app_confbridge.so
app_controlplayback.so
app_dahdibarge.so
app_dahdiras.so
app_db.so
app_dial.so
app_dictate.so
app_directed_pickup.so
app_directory.so
app_disa.so
app_dumpchan.so
app_echo.so
app_exec.so
app_externalivr.so
app_festival.so
app_flash.so
app_followme.so
app_forkcdr.so
app_getcpeid.so
app_ices.so
app_image.so
app_jack.so
app_macro.so
app_meetme.so
app_milliwatt.so
app_minivm.so
app_mixmonitor.so
app_morsecode.so
app_mp3.so
app_mysql.so
app_nbscat.so
app_originate.so
app_page.so
app_parkandannounce.so
app_playback.so
app_playtones.so
app_privacy.so
app_queue.so
app_readexten.so
app_read.so
app_record.so
app_saycountpl.so
app_sayunixtime.so
app_senddtmf.so
app_sendtext.so
app_sms.so
app_softhangup.so
app_speech_utils.so
app_stack.so
app_system.so
app_talkdetect.so
app_test.so
app_transfer.so
app_url.so
app_userevent.so
app_verbose.so
app_voicemail.so
app_waitforring.so
app_waitforsilence.so
app_waituntil.so
app_while.so
app_zapateller.so
bridge_builtin_features.so
bridge_multiplexed.so
bridge_simple.so
bridge_softmix.so
cdr_adaptive_odbc.so
cdr_csv.so
cdr_custom.so
cdr_manager.so
cdr_mysql.so
cdr_odbc.so
cdr_radius.so
cdr_syslog.so
cel_custom.so
cel_manager.so
cel_odbc.so
cel_radius.so
chan_agent.so
chan_bridge.so
chan_console.so
chan_dahdi.so
chan_iax2.so
chan_local.so
chan_mgcp.so
chan_mobile.so
chan_motif.so
chan_multicast_rtp.so
chan_ooh323.so
chan_oss.so
chan_phone.so
chan_sip.so
chan_skinny.so
chan_unistim.so
codec_adpcm.so
codec_alaw.so
codec_a_mu.so
codec_dahdi.so
codec_g722.so
codec_g726.so
codec_gsm.so
codec_ilbc.so
codec_lpc10.so
codec_ulaw.so
format_g719.so
format_g723.so
format_g726.so
format_g729.so
format_gsm.so
format_h263.so
format_h264.so
format_ilbc.so
format_jpeg.so
format_mp3.so
format_pcm.so
format_siren14.so
format_siren7.so
format_sln.so
format_vox.so
format_wav_gsm.so
format_wav.so
func_aes.so
func_audiohookinherit.so
func_base64.so
func_blacklist.so
func_callcompletion.so
func_callerid.so
func_cdr.so
func_channel.so
func_config.so
func_curl.so
func_cut.so
func_db.so
func_devstate.so
func_dialgroup.so
func_dialplan.so
func_enum.so
func_env.so
func_extstate.so
func_frame_trace.so
func_global.so
func_groupcount.so
func_hangupcause.so
func_iconv.so
func_jitterbuffer.so
func_lock.so
func_logic.so
func_math.so
func_md5.so
func_module.so
func_odbc.so
func_pitchshift.so
func_presencestate.so
func_rand.so
func_realtime.so
func_sha1.so
func_shell.so
func_speex.so
func_sprintf.so
func_srv.so
func_strings.so
func_sysinfo.so
func_timeout.so
func_uri.so
func_version.so
func_vmcount.so
func_volume.so
pbx_ael.so
pbx_config.so
pbx_dundi.so
pbx_loopback.so
pbx_lua.so
pbx_realtime.so
pbx_spool.so
res_adsi.so
res_ael_share.so
res_agi.so
res_calendar_caldav.so
res_calendar_ews.so
res_calendar_exchange.so
res_calendar_icalendar.so
res_calendar.so
res_clialiases.so
res_clioriginate.so
res_config_curl.so
res_config_ldap.so
res_config_mysql.so
res_config_odbc.so
res_config_sqlite3.so
res_config_sqlite.so
res_convert.so
res_crypto.so
res_curl.so
res_digium_phone.so
res_fax.so
res_fax_spandsp.so
res_format_attr_celt.so
res_format_attr_h263.so
res_format_attr_h264.so
res_format_attr_silk.so
res_http_websocket.so
res_limit.so
res_monitor.so
res_musiconhold.so
res_mutestream.so
res_mwi_blf.so
res_odbc.so
res_phoneprov.so
res_pktccops.so
res_realtime.so
res_rtp_asterisk.so
res_rtp_multicast.so
res_security_log.so
res_smdi.so
res_speech.so
res_srtp.so
res_stun_monitor.so
res_timing_dahdi.so
res_timing_pthread.so
res_timing_timerfd.so
res_xmpp.so

astvarlibdir => /var/lib/asterisk

Скрипты, документация, звуковые файлы, изображения, лицензии,

ls -1 /var/lib/asterisk/

ls -1 /var/lib/asterisk/

/agi-bin
astdb.sqlite3
/bin
/documentation
/images
/keys
/licenses
/moh
/phoneprov
/sounds
/static-http

ls -1 /var/lib/asterisk/bin

ls -1 /var/lib/asterisk/bin

archive_recordings
audio-email.pl
backup.php
callback
callerid_updater.php
enc
endpoint_firmware.php
fax2mail.php
faxpro_background.php
faxpro_helper.php
freepbx-cron-scheduler.php
freepbx_engine
freepbx_engine_hook_dahdiconfig
freepbx_engine_hook_endpoint
freepbx_engine_hook_pagingpro
freepbx_engine_hook_restapps
freepbx_engine_hook_sysadmin
freepbx_engine_hook_xmpp
freepbx_setting
gen_amp_conf.php
generate_hints.php
generate_queue_hints.php
libfreepbx.confgen.php
module_admin
one_touch_record.php
opencnam-alert.php
pagepro-scheduler.php
pagepro-startup.php
queue_reset_stats.php
restore.php
retrieve_conf
retrieve_parse_amportal_conf.pl

schedtc.php
storage.php

astspooldir => /var/spool/asterisk

Директории для файлов создаваемых Asterisk в процессе работы. Например: Записи разговоров, принятые факсы, голосовая почта, call-файлы итд.

 ls -1  /var/spool/asterisk/
/fax
/meetme
/monitor
/outgoing
/sysadmin
/system
/tmp
/voicemail

astrundir => /var/run/asterisk

Место куда Asterisk записывает UNIX control socket файл (asterisk.ctl) и файл ID процесса (asterisk.pid)

ls -1  /var/run/asterisk/
asterisk.ctl
asterisk.pid

astlogdir => /var/log/asterisk

Файлы логов Asterisk. Настройки вывода логов производятся в файле Asterisk logger.conf

 ls -1  /var/log/asterisk
/cdr-csv ;директории CDR файлов
/cdr-custom

full
queue_log

а также могут быть:

 fail2ban   ;
 freepbx_debug
 freepbx.log

astsbindir => /usr/sbin

Исполняемые файлы Asterisk.

 ls /usr/sbin | grep asterisk
 asterisk
 rasterisk
 safe_asterisk

Раздел (секция) [options]

live_dangerously

Включить выполнение «опасных» функций из внешних источников (AMI, AGI и тд)
Некоторые функции и приложения (например, такие как SHELL)
опасны тем, что могут предоставлять дополнительные привилегии. По умолчанию = no.

Параметр Значение по умолчанию / ПримерОписание
verbose 0 Устанавливает уровень детализации (verbose) консоли и лога . Это значние также может быть установлено в консоли коммандой 'core set verbose <0-9> или off.
debug 0 Залает значение уровня отладки (debug). по умолчанию - 0
alwaysfork no всегда в фоновом режиме, даже с опциями -v или -d
nofork no Отключить фоновое выполнение.
quiet no Работать тихо (-q). Уменьшает выхлоп консоли.
timestamp no Временные отметки в выводе консоли(-T) CLI verbose output
execincludes no Разрешить #EXEC записи в файлах конфигурации
console no Всегда запускать в консольном режиме, с приглашением CLI.
highpriority no Запускать Asterisk c наивысшим приоритетом в режиме реального времени.
initcrypto noЗагружать ключи из ../astkeydir при старте.
nocolor no Цветная консоль.
dontwarn no Отключить предупреждения (warning messages).
dumpcore no Делать дамп (содержимое рабочей памяти процесса, ядра)при падении
languageprefix yes Как находится путь к звуковому файлу с языковым префиксом. По умолчанию, 'yes' - перфикс языка в пути к файлу перед подкаталогов, например ../ru/digits/1.gsm. Если 'no' то префикс после имени каталога, например: (digits/ru/1.gsm).
internal_timing yes Включить внутренний источник синхронизации для аудио
systemname not set Уникальное имя Asterisk. Используется как часть UNIQUEID в CDR. По умолчанию не задано
autosystemname no Автоматом задавать 'systemname' на основании имени хоста
maxcalls not set Максимальное кол-во одновременных входящих вызовов. По умолчанию не ограничено
maxload not set/0.9 Максимальная нагрузка на процессор, при которой Asterisk прекратит новые соединения.
minmemfree not set /256
cache_record_files yes / noКэшировать записи
record_cache_dir <dir> директория кэша записей
transmit_silence no Транслировать тишину, если нет другог источника звука
transcode_via_sln yes перекодировать кодеки через SLINEAR
runuser asterisk Владелец Asterisk.
rungroup asterisk Группа Asterisk.
documentation_language en / es / ru Язык документации
hideconnect no Не показывать сообщения о подключении удаленных консолей

asterisk.conf

asterisk.conf

[options]
;verbose = 3
;debug = 3
;alwaysfork = yes               ; Same as -F at startup.
;nofork = yes                   ; Same as -f at startup.
;quiet = yes                    ; Same as -q at startup.
;timestamp = yes                ; Same as -T at startup.
;execincludes = yes             ; Support #exec in config files.
;console = yes                  ; Run as console (same as -c at startup).
;highpriority = yes             ; Run realtime priority (same as -p at
                                ; startup).
;initcrypto = yes               ; Initialize crypto keys (same as -i at
                                ; startup).
;nocolor = yes                  ; Disable console colors.
;dontwarn = yes                 ; Disable some warnings.
;dumpcore = yes                 ; Dump core on crash (same as -g at startup).
;languageprefix = yes           ; Use the new sound prefix path syntax.
;internal_timing = yes
;systemname = my_system_name    ; Prefix uniqueid with a system name for
                                ; Global uniqueness issues.
;autosystemname = yes           ; Automatically set systemname to hostname,
                                ; uses 'localhost' on failure, or systemname if
                                ; set.
;mindtmfduration = 80           ; Set minimum DTMF duration in ms (default 80 ms)
                                ; If we get shorter DTMF messages, these will be
                                ; changed to the minimum duration
;maxcalls = 10                  ; Maximum amount of calls allowed.
;maxload = 0.9                  ; Asterisk stops accepting new calls if the
                                ; load average exceed this limit.
;maxfiles = 1000                ; Maximum amount of openfiles.
;minmemfree = 1                 ; In MBs, Asterisk stops accepting new calls if
                                ; the amount of free memory falls below this
                                ; watermark.
;cache_record_files = yes       ; Cache recorded sound files to another
                                ; directory during recording.
;record_cache_dir = /tmp        ; Specify cache directory (used in conjunction
                                ; with cache_record_files).
;transmit_silence = yes         ; Transmit silence while a channel is in a
                                ; waiting state, a recording only state, or
                                ; when DTMF is being generated.  Note that the
                                ; silence internally is generated in raw signed
                                ; linear format. This means that it must be
                                ; transcoded into the native format of the
                                ; channel before it can be sent to the device.
                                ; It is for this reason that this is optional,
                                ; as it may result in requiring a temporary
                                ; codec translation path for a channel that may
                                ; not otherwise require one.
;transcode_via_sln = yes        ; Build transcode paths via SLINEAR, instead of
                                ; directly.
;runuser = asterisk             ; The user to run as.
;rungroup = asterisk            ; The group to run as.
;lightbackground = yes          ; If your terminal is set for a light-colored
                                ; background.
;forceblackbackground = yes     ; Force the background of the terminal to be
                                ; black, in order for terminal colors to show
                                ; up properly.
;defaultlanguage = en           ; Default language
documentation_language = en_US  ; Set the language you want documentation
                                ; displayed in. Value is in the same format as
                                ; locale names.
;hideconnect = yes              ; Hide messages displayed when a remote console
                                ; connects and disconnects.
;lockconfdir = no               ; Protect the directory containing the
                                ; configuration files (/etc/asterisk) with a
                                ; lock.
;stdexten = gosub               ; How to invoke the extensions.conf stdexten.
                                ; macro - Invoke the stdexten using a macro as
                                ;         done by legacy Asterisk versions.
                                ; gosub - Invoke the stdexten using a gosub as
                                ;         documented in extensions.conf.sample.
                                ; Default gosub.
;live_dangerously = no          ; Enable the execution of 'dangerous' dialplan
                                ; functions from external sources (AMI,
                                ; etc.) These functions (such as SHELL) are
                                ; considered dangerous because they can allow
                                ; privilege escalation.
                                ; Default yes, for backward compatability.

; Changing the following lines may compromise your security.
;[files]
;astctlpermissions = 0660
;astctlowner = root
;astctlgroup = apache
;astctl = asterisk.ctl

[compat]
pbx_realtime=1.6
res_agi=1.6
app_set=1.6

Установка и первоначальная конфигурация OpenSIPS

$
0
0

Установка и первоначальная конфигурация OpenSIPS

Протестировано на CentOS 7.X with OpenSIPS 1.7.1

Подготовка инсталляции

Создадим пользователя 'opensips'

useradd -d /usr/local/etc/opensips -s /sbin/nologin opensips

Создание и конфигурация opensips.log

Создадим log файл

touch /var/log/opensips.log
chown opensips:opensips /var/log/opensips.log

Добавим log в rsyslog.conf

nano /etc/rsyslog.conf

Add this line to the file:

local0.*                                                /var/log/opensips.log

Перезагрузим rsyslog

systemctl restart rsyslog

Установим зависимости

yum install -y gcc-c++ bison lynx subversion flex curl-devel libxslt libxml2-devel
libxml2 pcre-devel  wget make
yum -y install mariadb-server mariadb mariadb-devel
 systemctl start mariadb.service
 systemctl enable mariadb.service
Скачаем и скомпилируем OpenSIPS 1.7.1

Скачаем исходники

cd /usr/src
wget http://opensips.org/pub/opensips/1.7.1/src/opensips-1.7.1_src.tar.gz
tar zxvf opensips-1.7.1_src.tar.gz
cd opensips-1.7.1-tls

Скомпилируем с поддержкой MySQL

make all include_modules="db_mysql"

Установим OpenSIPS

make include_modules="db_mysql" prefix="/usr/local" install
Конфигурация OpenSIPS

Создадим Базу Данных MySQL

Отредактируем opensipsctlrc файл

nano /usr/local/etc/opensips/opensipsctlrc

раскомментируйте следующие строки:

DBENGINE=MYSQL
DBHOST=localhost
DBNAME=opensips
DBRWUSER=opensips
DBRWPW="DBPASSWORD"

Запустим opensipsdbctl

Введите рутовый пароль MySQL если он задан.

opensipsdbctl create
MySQL password for root: 

Создайте стартовые скрипты

cp /usr/src/opensips-1.7.1-tls/packaging/rpm/opensips.init /etc/init.d/opensips &&
sed -i "s/\/usr\/sbin\/opensips/\/usr\/local\/sbin\/opensips/g" /etc/init.d/opensips &&
sed -i "s/\/etc\/opensips/\/usr\/local\/etc\/opensips/g" /etc/init.d/opensips &&
sed -i "s/\/etc\/default\/opensips/\/usr\/local\/etc\/opensips/g" /etc/init.d/opensips &&
sed -i "s/RUN_OPENSIPS=no/RUN_OPENSIPS=yes/g" /etc/init.d/opensips &&
chmod +x /etc/init.d/opensips &&
chkconfig opensips on

Редактируем opensips.cfg

Создадим новый конфиг opensips.cfg

mv /usr/local/etc/opensips/opensips.cfg /usr/local/etc/opensips/opensips.cfg.noload
nano /usr/local/etc/opensips/opensips.cfg

Скопипастим в новый файл opensips.cfg

Замените «ext.ip.addr» на публичный IP вашего OpenSIPS сервера.
«eth0» - на имя ethernet интерфейса вашего сервера.

modparam("dispatcher", "db_url", "mysql://opensips:DBPASSWORD@localhost/opensips") 

- отредактируйте в соответствии с вашими настройками MySQL.

Конфиг под спойлером

opensips.cfg

opensips.cfg

######################################################################
## Core Parameters
######################################################################
# chroot=
# group="opensips"
# user="opensips"
# dbversion_table=
disable_core_dump=no
max_while_loops=100
maxbuffer=262144
memdump=3
memlog=2
# open_files_limit=2048
server_signature=no
server_header="Server: OpenSIPS"
user_agent_header="User-Agent: OpenSIPS"

######################################################################
## Core Fork Parameters
######################################################################
fork=yes
children=8
tcp_children=8

######################################################################
## Core Logging Parameters
######################################################################
debug=3
sip_warning=0
log_stderror=no
log_facility=LOG_LOCAL0
log_name="opensips"

######################################################################
## Aliases
######################################################################
auto_aliases=yes
alias=localhost
alias=localhost.localdomain

######################################################################
## Connectivity
######################################################################
#listen=udp:eth0:5060
listen=udp:eth0:5060
listen=tcp:eth0:5060
listen=udp:eth0:7000
listen=tcp:eth0:7000
#listen=udp:eth0:7000
#listen=tcp:eth0:7000
# listen=udp:eth1:5060
tos=IPTOS_LOWDELAY
# advertised_address=174.129.131.38
# advertised_port=5060
mcast_loopback=no
mcast_ttl=1
mhomed=0
# tcp_accept_aliases
tcp_connect_timeout=3
tcp_connection_lifetime=120
tcp_max_connections=2048
# tcp_poll_method=select

######################################################################
## DNS
######################################################################
dns=no
dns_retr_time=1
dns_retr_no=3
# dns_servers_no=2
dns_try_ipv6=no
disable_dns_blacklist=yes
disable_dns_failover=no
dns_use_search_list=no
rev_dns=no

######################################################################
## SIP
######################################################################
check_via=0
#! disable_503_translation=no
disable_stateless_fwd=no
disable_tcp=no
# disable_tls=no
#! reply_to_via=1

######################################################################
## TLS
######################################################################
# disable_tls=no
# listen=tls:your_IP:5061
# tls_verify_server=1
# tls_verify_client=1
# tls_require_client_certificate=0
# tls_method=TLSv1
# tls_certificate="/usr/local/etc/opensips/tls/user/user-cert.pem"
# tls_private_key="/usr/local/etc/opensips/tls/user/user-privkey.pem"
# tls_ca_list="/usr/local/etc/opensips/tls/user/user-calist.pem"

######################################################################
## Destination Blacklist
######################################################################
# dst_blacklist=gw:{( tcp , 192.168.2.100 , 5060 , "" ),( any , 192.168.2.101 , 0 , "" )}
# dst_blacklist=net_filter2:{ !( any , 192.168.30.0/255.255.255.0 , 0 , "" )}

######################################################################
## Attribute Value Pairs
######################################################################
# avp_aliases="uuid=I:660;email=s:email_addr;fwd=i:753"

######################################################################
## Module Loading
######################################################################
mpath="/usr/local/lib64/opensips/modules/"

loadmodule "db_mysql.so"
loadmodule "localcache.so"
loadmodule "signaling.so"
loadmodule "sl.so"
loadmodule "tm.so"
loadmodule "dialog.so"
loadmodule "maxfwd.so"
loadmodule "rr.so"
loadmodule "path.so"
loadmodule "uri.so"
loadmodule "textops.so"
loadmodule "usrloc.so"
loadmodule "nathelper.so"
loadmodule "nat_traversal.so"
loadmodule "uac_redirect.so"
loadmodule "dispatcher.so"
loadmodule "mi_fifo.so"
# loadmodule "mi_datagram.so"

######################################################################
## Localcache Module Parameters
######################################################################
modparam("localcache", "cache_table_size", 10)
modparam("localcache", "cache_clean_period", 120)

######################################################################
## Stateless UA Module Parameters
######################################################################
modparam("sl", "enable_stats", 1)

######################################################################
## SIP Transaction UA Module Parameters
######################################################################
modparam("tm", "fr_timer", 2)
modparam("tm", "fr_inv_timer", 120)
# modparam("tm", "wt_timer", 5)
# modparam("tm", "delete_timer", 2)
# modparam("tm", "T1_timer", 500)
# modparam("tm", "T2_timer", 4000)
# modparam("tm", "ruri_matching", 1)
# modparam("tm", "via1_matching", 1)
# modparam("tm", "unix_tx_timeout", 2)
# modparam("tm", "restart_fr_on_each_reply", 1)
modparam("tm", "fr_timer_avp", "$avp(final_reply_timer)")
# modparam("tm", "fr_inv_timer_avp", "$avp(25)")
# modparam("tm", "tw_append",
#    "test: ua=$hdr(User-Agent) ;avp=$avp(i:10);$rb;time=$Ts")
modparam("tm", "pass_provisional_replies", 1)
# modparam("tm", "syn_branch", 1)
# modparam("tm", "onreply_avp_mode", 0)
# modparam("tm", "disable_6xx_block", 0)
# modparam("tm", "enable_stats", 1)
# modparam("tm", "minor_branch_flag", 3)

######################################################################
## Max Forward Module Parameters
######################################################################
modparam("maxfwd", "max_limit", 30)

######################################################################
## Record Route Module Parameters
######################################################################
#modparam("rr", "enable_full_lr", 1)
modparam("rr", "append_fromtag", 1)
modparam("rr", "enable_double_rr", 0)
modparam("rr", "add_username", 0)

######################################################################
## Path Module Parameters
######################################################################
modparam("path", "use_received", 1)

######################################################################
## URI Module Parameters
######################################################################
# modparam("uri", "aaa_url", "radius:/etc/radiusclient-ng/radiusclient.conf")
modparam("uri", "use_sip_uri_host", 0)
modparam("uri", "use_uri_table", 0)
modparam("uri", "service_type", 10)
modparam("uri", "use_domain", 1)
modparam("uri", "use_uri_table", 0)
# modparam("uri", "db_url", "mysql://username:password@localhost/opensips")
# modparam("uri", "db_table", "uri")
# modparam("uri", "user_column", "username")
# modparam("uri", "domain_column", "domain")
# modparam("uri", "uriuser_column", "uri_user")

######################################################################
## User Location Module Parameters
######################################################################
modparam("usrloc", "nat_bflag", 6)
modparam("usrloc", "use_domain", 1)
modparam("usrloc", "desc_time_order", 0)
modparam("usrloc", "timer_interval", 60)
modparam("usrloc", "matching_mode", 0)
modparam("usrloc", "cseq_delay", 20)
modparam("usrloc", "hash_size", 9)
modparam("usrloc", "db_mode", 0)
# modparam("usrloc", "db_url", "dbdriver://username:password@dbhost/dbname")
#modparam("usrloc", "fetch_rows", 2000)
modparam("usrloc", "user_column", "username")
modparam("usrloc", "domain_column", "domain")
modparam("usrloc", "contact_column", "contact")
modparam("usrloc", "expires_column", "expires")
modparam("usrloc", "q_column", "q")
modparam("usrloc", "callid_column", "callid")
modparam("usrloc", "cseq_column", "cseq")
modparam("usrloc", "methods_column", "methods")
modparam("usrloc", "flags_column", "flags")
modparam("usrloc", "cflags_column", "cflags")
modparam("usrloc", "user_agent_column", "user_agent")
modparam("usrloc", "received_column", "received")
modparam("usrloc", "socket_column", "socket")
modparam("usrloc", "path_column", "path")

######################################################################
## Nathelper Module Parameters
######################################################################
# modparam("nathelper", "rtpproxy_sock", "udp:127.0.0.1:7890")
# modparam("nathelper", "natping_interval", 30)
# modparam("nathelper", "ping_nated_only", 1)
# modparam("nathelper", "natping_processes", 3)
# modparam("nathelper", "sipping_bflag", 7)
# modparam("nathelper", "sipping_from", "sip:sipcheck@184.106.157.174")
# modparam("nathelper", "sipping_method", "INFO")

######################################################################
## NAT Traversal Module Parameters
######################################################################
modparam("nat_traversal", "keepalive_interval", 60)
modparam("nat_traversal", "keepalive_method", "OPTIONS")
modparam("nat_traversal", "keepalive_from", "sip:keepalive@ext.ip.addr:5060")
modparam("nat_traversal", "keepalive_state_file", "/tmp/opensips_keepalive_state")

######################################################################
## UAC Redirect Module Parameters
######################################################################
modparam("uac_redirect", "default_filter", "accept")
# modparam("uac_redirect", "deny_filter", NULL)
# modparam("uac_redirect", "accept_filter", NULL)
# modparam("uac_redirect", "acc_function", "acc_log_request")
# modparam("uac_redirect", "acc_db_table", "acc")

######################################################################
## Dispatcher Module Parameters
######################################################################
#modparam("dispatcher", "list_file", "/etc/opensips/dispatcher.list")
modparam("dispatcher", "db_url", "mysql://opensips:DBPASSWORD@localhost/opensips")
modparam("dispatcher", "flags", 2)
modparam("dispatcher", "use_default", 0)
modparam("dispatcher", "force_dst", 1)
modparam("dispatcher", "dst_avp", "$avp(271)")
modparam("dispatcher", "attrs_avp", "$avp(272)")
modparam("dispatcher", "grp_avp", "$avp(273)")
modparam("dispatcher", "cnt_avp", "$avp(274)")
modparam("dispatcher", "hash_pvar", "$avp(273)")
# modparam("dispatcher", "setid_pvar", "$var(setid)")
modparam("dispatcher", "ds_ping_method", "OPTIONS")
modparam("dispatcher", "ds_ping_from", "sip:sipcheck@ext.ip.addr:5060")
modparam("dispatcher", "ds_ping_interval", 10)
# modparam("dispatcher", "ds_ping_sock", "udp:ext.ip.addr:5060")
modparam("dispatcher", "ds_probing_threshhold", 3)
modparam("dispatcher", "ds_probing_mode", 1)
modparam("dispatcher", "options_reply_codes", "501,403,404,400,200")

######################################################################
## MI-FIFO Module Parameters
######################################################################
modparam("mi_fifo", "fifo_name", "/tmp/opensips_fifo")

######################################################################
## MI-Datagram Module Parameters
######################################################################
# modparam("mi_datagram", "socket_name", "udp:127.0.0.1:8889")
# modparam("mi_datagram", "children_count", 1)
# modparam("mi_datagram", "unix_socket_mode", 0600)
# modparam("mi_datagram", "unix_socket_group", "root")
# modparam("mi_datagram", "unix_socket_user", "root")
# modparam("mi_datagram", "socket_timeout", 2000)
# modparam("mi_datagram", "reply_indent", "\t")

######################################################################
## XLog Module Parameters
######################################################################
# modparam("xlog", "buf_size", 4096)
# modparam("xlog", "force_color", 0)

######################################################################
## Multiple Module Parameters
######################################################################

######################################################################
## Main Request Routing
######################################################################
route
{
    # log the basic info regarding this call
    xlog("L_INFO", "$ci|start|recieved $oP request $rm $ou");
    xlog("L_INFO", "$ci|log|source $si:$sp");
    xlog("L_INFO", "$ci|log|from $fu");
    xlog("L_INFO", "$ci|log|to $tu");

    # check that hop cound for this request and make sure it is under 10
    # to prevent endless loops
    if (!mf_process_maxfwd_header("10"))
    {
        xlog("L_WARN", "$ci|end|to many hops");

        sl_send_reply("483", "We refuse to process this endless imbroglio");

        exit;
    }

    # this check detemines if the opensips has routed the request to itself,
    # this happens because the server is the destination of the request but
    # we mangle it to send it else where. When that mangeling fails and we
    # still relay it then it just comes right back to us...
    if (src_ip==myself)
    {
        xlog("L_WARN", "$ci|end|sourced from this server");

        exit;
    }

    # currently we dont support subscribe so to keep the noise down
    # just end the request here. For options just end the request here as well.
    if (is_method("OPTIONS"))
    {
        xlog("L_NOTICE", "$ci|end|unsupported method");

        sl_send_reply("503", "Rawr!!");

        exit;
    }

    # if the source IP/port are in one of the server dispatch lists
    # then this request originated from one of our media servers, mark it
    # as such by setting flag 26
    if (ds_is_in_list("$si", "", "1"))
    {
        xlog("L_INFO", "$ci|log|originated from internal sources");

        # Flag 26 marks the source as a on-net server
        setflag(26);

        setbflag(26);
    }
    # if the request source IP/port was not in any dispatcher lists
    # this this originated outside our equipment (carrier, client, ect)
    else
    {
        xlog("L_INFO", "$ci|log|originated from external sources");
    }

    # if the to header has a tag attached then it implies this request
    # has been processed by us before (IE: a media server has added
    # its tag on the to header in prior messages)
    if (has_totag())
    {
        # sequential request within a dialog should
        # take the path determined by record-routing
        if (loose_route())
        {
            append_hf("P-hint: rr-enforced\r\n");

            # if we have locked this call to a media server then
            # maintain that association
            if (cache_fetch("local", "$ci", $avp(55)))
            {
                if (is_method("BYE"))
                {
                    # remove the association between the call-id and the media server (if one)
                    # but leave the contact user and server to support transfers
                    cache_remove("local", "$ci");

                    xlog("L_INFO", "$ci|log|cleaned up call id from cache");
                }
                else if (isflagset(26))
                {
                    cache_store("local", "$tU", "$avp(55)", 3600);

                    xlog("L_INFO", "$ci|log|maintaining associated $tU with media server $avp(55)");
                }
                else if ($ct.fields(uri))
                {
                    cache_store("local", "$(ct.fields(uri){uri.user})", "$avp(55)", 3600);

                    xlog("L_INFO", "$ci|log|maintaining associated $(ct.fields(uri){uri.user}) with media server $avp(55)");
                }

                cache_store("local", "$ci", "$avp(55)", 3600);
            }

            xlog("L_INFO", "$ci|log|forwarding based on the route set");

            if (isflagset(26))
            {
                route(internal_to_external_relay);
            }
            else
            {
                route(external_to_internal_relay);
            }

            exit();
        }
        else if ( is_method("ACK") )
        {
            if ( t_check_trans() )
            {
                # non loose-route, but stateful ACK; must be an ACK after
                # a 487 or e.g. 404 from upstream server
                xlog("L_INFO", "$ci|log|in dialog request belongs to a known transaction");

                route(logged_relay);
            }
            else
            {
                # ACK without matching transaction ->
                # ignore and discard
                xlog("L_NOTICE", "$ci|end|no matching transaction");
            }

            exit();
        }
        else if ( is_method("NOTIFY") )
        {
            route(logged_relay);

            exit();
        }

        # request with a to tag that cant be routed loosly and is not an ACK
        # ignor eand discard
        xlog("L_WARN", "$ci|end|could not route in dialog");

        sl_send_reply("486", "PC Load Letter");

        exit();
    }

    # if the request is to cancel a transaction process it now
    if (is_method("CANCEL"))
    {
        # If this cancel is part of a transaction
        # then pass it along to concerned parties
        if (t_check_trans())
        {
            xlog("L_INFO", "$ci|log|request belogs to a known transaction");

            route(logged_relay);
        }
        # if the cancel does not belong to a known transaction or a
        # request that has not progressed outside this server dont relay it
        else
        {
            xlog("L_NOTICE", "$ci|end|no matching transaction");
        }

        # remove the association between the call-id and the media server (if one)
        # but leave the contact user and server to support transfers
        cache_remove("local", "$ci");

        xlog("L_INFO", "$ci|log|cleaned up call id from cache");

        exit;
    }

    # If this is a retransmission it will break/stop the script
    # and do standard processing of the message
    t_check_trans();

    # Except for an ACK no request should have a route set with no to tag, this would
    # indicate that the intial request has the Route headers and is likely someone trying
    # to get us to send the request were they want
    if (loose_route())
    {
        if (!is_method("ACK"))
        {
            xlog("L_WARN", "$ci|end|initial request contained a preloaded route set");

            sl_send_reply("403", "The only winning move it not to play");

            exit;
        }
    }

    # If the request is a register we will pass it along but we need
    # to add the path header (along with the received IP/port info)
    if (is_method("REGISTER"))
    {
        # if we fail to add the path header then dont let it
        # register because it will cause issues later...
        if (!add_path_received())
        {
            xlog("L_ERR", "$ci|log|unable to add path");

            sl_send_reply("503", "Internal path befuddlement");

            # remove the association between the call-id and the media server (if one)
            # but leave the contact user and server to support transfers
            cache_remove("local", "$ci");

            xlog("L_INFO", "$ci|end|cleaned up call id from cache");

            exit;
        }

        xlog("L_INFO", "$ci|log|added path");
    }

    # for all initial request (not having been processed above in the has_totag)
    # that are not a register or message add this sever to the route set on the
    # request so subsequent messages come through this server
    if (!is_method("REGISTER|MESSAGE"))
    {
        # Record the route that this request has taken
        # so we remain in the signaling path
        record_route();

        xlog("L_INFO", "$ci|log|added this server to the route set");
    }

    # if the request is from a media server send it out
    if (isflagset(26))
    {
        route(internal_to_external_relay);

        exit();
    }

    # if the request is not from a media server it must be for one,
    # there is much work to do!

    # load a list of currently active media servers
    # if no media server could be set with ds_select_domain then there are no
    # active servers, no need to conitnue
    if (!ds_select_domain("1", "4"))
    {
        xlog("L_ERR", "$ci|end|no servers avaliable");

        sl_send_reply("480", "The cake is a lie!");

        exit;
    }

    if (cache_fetch("local", "$ou", $avp(55)))
    {
        xlog("L_INFO", "$ci|log|request $ou is associated with media server $avp(55)");

        cache_remove("local", "$ou");

        cache_store("local", "$ci", "$avp(55)", 3600);
    }
    # if the request is not from our media severs but has a call-id in localcache
    # then change the routing to go to the server previously associated with it.
    else if (cache_fetch("local", "$ci", $avp(55)))
    {
        cache_store("local", "$ci", "$avp(55)", 3600);

        xlog("L_INFO", "$ci|log|call-id is associated with media server $avp(55)");
    }
    # if the request is not from our media severs but has a contact uri in localcache
    # then change the routing to go to the server previously associated with it.
    else if ($ct.fields(uri) && cache_fetch("local", "$(ct.fields(uri){uri.user})", $avp(55)))
    {
        cache_store("local", "$(ct.fields(uri){uri.user})", "$avp(55)", 3600);

        xlog("L_INFO", "$ci|log|contact $(ct.fields(uri){uri.user}) is associated with media server $avp(55)");
    }
    # if the request is not from our media servers and no associations in localcache
    # then use the distribute list as is
    else
    {
        xlog("L_INFO", "$ci|log|routing call to arbitrary media server $rd:$rp");
    }

    # if the dispatcher list (in 271) does not start with
    # the request domain/port that we are sending this call
    # to, re-order the list so that it does
    if($avp(55) && $(avp(271)[0]) != $avp(55))
    {
        # create a index var for our loop (arrays are start at 0 and this is a count)
        $var(i) = $avp(274) - 1;

        # loop over the dispatcher list
        while($var(i) > 0)
        {
            # if this element in the dispatch list is the same
            # as the call destination
            if($(avp(271)[$var(i)]) == $avp(55))
            {
                # replace it with the first element of the list
                $(avp(271)[$(var(i))]) = $(avp(271)[0]);

                # break out of the loop
                $var(i) = -1;
            }

            $var(i) = $var(i) - 1;
        }

        # handles the case were we only have two servers
        # and the one that we are locked to has failed
        if ($var(i) >= 0)
        {

            xlog("L_INFO", "$ci|log|associated media server is inactive, moving to $rd");

            if ($ct.fields(uri) && cache_fetch("local", "$ci", $avp(56)))
            {
                cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600);

                xlog("L_INFO", "$ci|log|associated contact $(ct.fields(uri){uri.user}) with media server sip:$rd:$rp");
            }

            # update the callid cache
            cache_store("local", "$ci", "sip:$rd:$rp", 3600);
        }
        # the server we are locked to is in the active server list from then
        # dispatcher so re-arrange the list to try it first
        else
        {
            xlog("L_INFO", "$ci|log|re-ordering the dispatcher list to keep associated server first");

            # set the first element of the list to the destination
            $(avp(271)[0]) = $avp(55);

            # set the domain for this request (server IP to route to)
            $rd = $(avp(55){uri.host});

            # set the port for this request (server IP to route to)
            $rp = $(avp(55){uri.port});
        }
    }

    route(external_to_internal_relay);
}

route[external_to_internal_relay]
{
    # 1. correct any nat issues
    # 2. remove any X-AUTH-IP headers so we will be the only one to set it
    # 3. set the X-AUTH-IP header for freeswitch ACLs
    # 4. set the final reply timer to two seconds, so we failover faster
    # 5. arm a logging branch for replies
    # 6. arm a failure branch that will try another one of our media servers when possible

    route("nat_test_and_correct");

    remove_hf("X-AUTH-IP");

    append_hf("X-AUTH-IP: $si\r\n");

    xlog("L_INFO", "$ci|log|X-AUTH-IP: $si");

    $avp(final_reply_timer) = 2;

    t_on_reply("internal_reply");

    t_on_failure("internal_fault");

    route("logged_relay");

    exit;
}

route[internal_to_external_relay]
{
    # if the request is from a media server then assume it is going somewhere
    # outside our control and give that equipment longer to respond.
    # Also arm a branch to log the replies

    $avp(final_reply_timer) = 6;

    t_on_reply("external_reply");

    route("logged_relay");

    exit;
}

route[logged_relay]
{
    # try to send the request on its way, if it fails send back a
    # stateless error to the requestor
    if (t_relay())
    {
        xlog("L_INFO", "$ci|pass|$rd:$rp");
    }
    else
    {
        xlog("L_ERR", "$ci|end|unable to relay message");

        sl_reply_error();
    }
}

route[nat_test_and_correct]
{
    # 1. Contact header field is searched for occurrence of RFC1918 addresses
# if (nat_uac_test("1"))
# {
# xlog("L_INFO", "$ci|log|contact header field contains a RFC1918 address");
#
# fix_contact();
# }

    # 2 - the "received" test is used: address in Via is compared against source IP address of signaling
    if (nat_uac_test("2"))
    {
        xlog("L_INFO", "$ci|log|address in Via differs from source IP");

        # adds the rport parameter to the first Via header
        force_rport();

        fix_contact();
    }

    # if the request has a body see if it needs NAT corrections as well,
    # this check looks at:
    # 8. SDP is searched for occurrence of RFC1918 addresses
    if (has_body("application/sdp") && nat_uac_test("8"))
    {
        xlog("L_INFO", "$ci|log|SDP contains a RFC1918 address");

        # alters the SDP information in order to facilitate NAT traversal.
        # 2. rewrite media IP address (c=) with source IP
        # 8. rewrite IP from origin description (o=) with source IP
        fix_nated_sdp("10");
    }
}

onreply_route[external_reply]
{
    # this branch handles replies that are comming from equipment
    # outside our control

    xlog("L_INFO", "$ci|start|recieved external reply $rs $rr");
    xlog("L_INFO", "$ci|log|source $si:$sp");

    # This ensures that if a endpoint recieves a call they can properly
    # transfer that call
    # TODO: this will track calls made to carriers when we start sending carrier
    # traffic through opensips
    # Target: A endpoint answering a call made from one of our media
    # servers should lock that endpoint to the server
    if (t_check_status("200") && is_method("INVITE") && $(fd{ip.isip}) && ds_is_in_list("$fd", "", "1"))
    {
        $var(d) = $(fu{uri.host});

        if ($(fu{uri.port}) == 0)
        {
            $var(p) = 5060;
        }
        else
        {
            $var(p) = $(fu{uri.port});
        }

        if ($ct.fields(uri))
        {
            cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$var(d):$var(p)", 3600);

            xlog("L_INFO", "$ci|log|associated $(ct.fields(uri){uri.user}) with media server sip:$var(d):$var(p)");
        }

        cache_store("local", "$ci", "sip:$var(d):$var(p)", 3600);

        xlog("L_INFO", "$ci|log|associated call-id with media server sip:$var(d):$var(p)");
    }

    if (is_method("BYE"))
    {
        # remove the association between the call-id and the media server (if one)
        # but leave the contact user and server to support transfers
        cache_remove("local", "$ci");

        xlog("L_INFO", "$ci|log|cleaned up call id from cache");
    }

    route("nat_test_and_correct");

    xlog("L_INFO", "$ci|pass|$(<request>si):$(<request>sp)");

    # if the reply is not dropped (only provisional replies can be),
    # it will be injected and processed by the transaction engine.
}

onreply_route[internal_reply]
{
    # this branch handles replies that are comming from our media server
    if(t_local_replied("last"))
    {
        xlog("L_INFO", "$ci|start|recieved local internal reply $T_reply_code $rr");
    }
    else
    {
        xlog("L_INFO", "$ci|start|recieved internal reply $T_reply_code $rr");
        xlog("L_INFO", "$ci|log|source $si:$sp");
    }

    # Ensure that if we challenge an endpoint its response is not round-robin'd
    # We have to do it in the reply so we have the correct call id
    # Target: Endpoint intiated a request that was challenged, lock that
    # call id to the challenging server so it recieves the reply
    if (t_check_status("(407)|(401)") && $(si{ip.isip}) && ds_is_in_list("$si", "", "1"))
    {
        cache_store("local", "$ci", "sip:$si:$sp", 3600);

        xlog("L_INFO", "$ci|log|associated call-id with media server sip:$si:$sp");
    }

    if (is_method("BYE"))
    {
        # remove the association between the call-id and the media server (if one)
        # but leave the contact user and server to support transfers
        cache_store("local", "$ci", "sip:$si:$sp", 360);

        xlog("L_INFO", "$ci|log|cleaned up call id from cache");
    }

    if ($rs < 300)
    {
        xlog("L_INFO", "$ci|pass|$(<request>si):$(<request>sp)");
    }

    # if the reply is not dropped (only provisional replies can be),
    # it will be injected and processed by the transaction engine.
}

failure_route[internal_fault]
{
    # this branch handles failures (>=300) to our media servers,
    # which we can sometimes overcome by routing to another server

    # if the failure cause was due to the transaction being
    # cancelled then we are complete
    if (t_was_cancelled())
    {
        xlog("L_INFO", "$ci|log|transaction was cancelled");

        # remove the association between the call-id and the media server (if one)
        # but leave the contact user and server to support transfers
        cache_remove("local", "$ci");

        xlog("L_INFO", "$ci|end|cleaned up call id from cache");

        exit;
    }

    # if the failure case was soemthing that we should recover
    # from then try to find a new media server
    if (t_check_status("(401)|(407)|(403)"))
    {
        xlog("L_INFO", "$ci|log|failure route ignoring auth reply $T_reply_code $rr");
    }
    else if (t_check_status("402"))
    {
        send_reply("486", "More money please");

        exit();
    }
    else if (t_check_status("(4[0-9][0-9])|(5[0-9][0-9])"))
    {
        xlog("L_INFO", "$ci|start|received failure reply $T_reply_code $rr");

        if (cache_fetch("local", "$ci-failure", $avp(55)))
        {
            $avp(55) = $(avp(55){s.int});
        }
        else
        {
            $avp(55) = 0;
        }

        xlog("L_INFO", "$ci|log|attempting retry $avp(55) of failed request");

        # try to find a new media server to send the call to
        if($avp(55) < 3 && ds_next_domain())
        {
            xlog("L_INFO", "$ci|log|routing call to next media server $rd:$rp");

            # store the new callid association
            cache_store("local", "$ci", "sip:$rd:$rp", 3600);

            # if the request has a contact and is an INVITE then store the new
            # association
            if ($ct.fields(uri) && is_method("INVITE"))
            {
                cache_store("local", "$(ct.fields(uri){uri.user})", "sip:$rd:$rp", 3600);

                xlog("L_INFO", "$ci|log|associated contact $(ct.fields(uri){uri.user}) with media server sip:$rd:$rp");
            }

            # reset the final reply timer
            $avp(final_reply_timer) = 2;

            t_on_reply("internal_reply");

            t_on_failure("internal_fault");

            xlog("L_INFO", "$ci|pass|$rd:$rp");

            # relay the request to the new media server
            t_relay();

            $avp(55) = $avp(55) + 1;

            cache_store("local", "$ci-failure", "$avp(55)", 60);

            exit();
        }
        else
        {
            cache_remove("local", "$ci-failure");

            xlog("L_ERR", "$ci|log|no other media servers avaliable");
        }
    }
    else if (t_check_status("302"))
    {
        if( $(<reply>hdr(X-Redirect-Server)) && $(<reply>ct.fields(uri)) )
        {
            $var(redirect_host) = $(<reply>hdr(X-Redirect-Server){uri.host});

            $var(redirect_port) = $(<reply>hdr(X-Redirect-Server){uri.port});

            cache_store("local", "$(<reply>ct.fields(uri))", "sip:$var(redirect_host):$var(redirect_port)", 60);

            xlog("L_INFO", "$ci|log|stored redirect mapping for $(<reply>ct.fields(uri)) to sip:$var(redirect_host):$var(redirect_port)");
            xlog("L_INFO", "$ci|log|stored redirect mapping for $(<reply>ct.fields(uri)) to sip:$var(redirect_host):$var(redirect_port)");

            remove_hf("X-Redirect-Server");
        }
    }
    else
    {
        xlog("L_INFO", "$ci|log|failure route ignoring reply $T_reply_code $rr");
    }

    if (!t_check_status("(407)|(401)|(302)"))
    {
        # remove the association between the call-id and the media server (if one)
        # but leave the contact user and server to support transfers
        cache_remove("local", "$ci");

        xlog("L_INFO", "$ci|log|cleaned up call id from cache");
    }

    xlog("L_INFO", "$ci|pass|$(<request>si):$(<request>sp)");

    # if no new branch is generated or no reply is forced over, by default,
    # the winning reply will be sent back to UAC.
}

Запустим OpenSIPS
/etc/init.d/opensips start

Добавление SIP серверов в OpenSIPS dispatcher

Замените fs1.ext.ip.addrи fs2.ext.ip.addrна IP адреса ваших серверов:

opensipsctl dispatcher addgw 1 sip:fs1.ext.ip.addr:5060 0 'fs1'
opensipsctl dispatcher addgw 1 sip:fs2.ext.ip.addr:5060 0 'fs2'

Дебаг

Asterisk: followme.conf

$
0
0

asterisk followme

Asterisk: followme.conf

Follow Me - настройка предустановленной переадресации вызова - Следуй За Мной.

Asterisk Follow Me

Конфигурационный файл /etc/asterisk/followme.confиспользуется для назначения глобальных параметров generalи уникальных адресатов followmeid, которые могут выполняться из диалплана приложением Follow Me

Приоритет может быть использован только один раз, т.е. в одной строке, но не в разных (для одного пользователя).
Отдельные строки с одинаковым приоритетом будут игнорироваться.
Параллельные вызовы на разные номера (два и больше), должны описываться в одной строке при помощи оператора '&'.

[имя или номер] используется для вызова приложением FollowMe
context ⇒ <context name> - контекст, из которого будут вызываться заданные номера folowme
number ⇒ <number>,[<timeout>],[<priority>] - адресат, время посылки вызова, приоритет

Простое распределение по порядку строк.
[followmeid_simple]
context=from-internal
number => 9981138,15
number => 1234,20
number => 3216111,45

Сперва вызывается номер 9981138 в течении 15-ти секунд, затем номер -1234 в течении 20 секунд и после номер 3216111 в течении 45 секунд.

Сортировка по приоритетам.
[followmeid_sorted]
context=from-internal
number => 9981138,35,2
number => 1234,20,1
number => 3216111,50,3

Сначала вызывается номер 1234 (приоритет 1), затем 9981138 (2) и последним 3216111 (3) .

Параллельные вызовы
[followmeid_parallel]
context=full_outbound_access
number => 1234&9981138,35,1
number => 3216111,50,2

Сперва вызываются номера 1234 и 9981138 одновременно, затем 3216111.

Конфигурационный файл followme.conf

Убедитесь, что app_followme.so загружен.

*CLI> module load app_followme.so
Loaded app_followme.so
  == Parsing '/etc/asterisk/followme.conf': Found followme.conf
  == Registered application 'FollowMe'
 Loaded app_followme.so => (Find-Me/Follow-Me Application)
[general]

Глобальные параметры folowme

 featuredigittimeout=>5000

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

 enable_callee_prompt=>true

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

  takecall=>1

Общее, по умолчанию '1', значение DTMFкода, подтверждения приема вызова.
Может состоять из одной или нескольких цифр.

  declinecall=>2

Общее, по умолчанию '2', значение DTMFкода, отказа от ответа на вызов.

'Incoming call from'
 call_from_prompt=>followme/call-from

Общее, по умолчанию, сообщение «Входящий вызов от».

'You have an incoming call'
 norecording_prompt=>followme/no-recording

Общее, по умолчанию, сообщение «Входящий вызов», если вызывающий выбрал опцию, не записывать свое имя.

'Press 1 to accept this call or press 2 to decline it'
 options_prompt=>followme/options

Общее, по умолчанию, сообщение - «Нажмите 1 чтобы принять вызов или 2 чтобы отказаться».

'Please hold while we try and connect your call'
 pls_hold_prompt=>followme/pls-hold-while-try

Общее сообщение: «Оставайтесь на линии, мы вас соединяем».

'The party you're calling isn't at their desk'
 status_prompt=>followme/status

Общее сообщение: «Вызываемый абонент не на рабочем месте»

'I'm sorry, but we were unable to locate your party'
 sorry_prompt=>followme/sorry

Общее сообщение: «Местонахождение абонента не установлено»

[followme_id_test]

Конфигурация уникального идентификатора для вызова приложением FollowME

 musicclass=>default

Класс Музыки на Удержании для воспроизведения ожидающему абоненту.

 context=>default

Контекст для вызова адресатов followme

  number=>01233456,25

Адресат followme. Формат:

number⇒ <number to call[&2nd #[&…]]>[,<таймаут в секундахs>[,<порядок выбора адресатов>]]

 enable_callee_prompt=>true

Включить приглашение вызывающему абоненту активировать followme.
По умолчанию действует глобальная установка из раздела [general].

 takecall=>1

Общее, по умолчанию '1', значение DTMFкода, подтверждения приема вызова.
Может состоять из одной или нескольких цифр. По умолчанию действует глобальная установка из раздела [general].

 declinecall=>2

Общее, по умолчанию '2', значение DTMFкода, отказа от ответа на вызов. По умолчанию, как задано в [general].

Назначить сообщения отличные от заданных по умолчанию в [general]

 call_from_prompt=>followme/call-from
 norecording_prompt=>followme/no-recording
 options_prompt=>followme/options
 pls_hold_prompt=>followme/pls-hold-while-try
 status_prompt=>followme/status
 sorry_prompt=>followme/sorry
Asterisk app: FollowMe

Приложение диалплана Asterisk для «умной» предустановленной переадресации вызова.

Описание

Данное приложение позволяет перевести вызывающего абонента на указанные номера. Команда ссылается на профили <followmeid> заданные в followme.conf. Если указанный <followmeid> не найден, приложение возвращает вызов и диалплан выполняется со следующего приоритета.

Возвращает '-1' при отбое.

синтаксис

FollowMe(followmeid[,options])

Аргументы
  • options
    • a: Записать имя вызывающего абонента для объявления вызываемой стороне.
    • B([[context^]exten^]priority[(arg1[^...][^argN])]): Перед выполнением исходящего вызова выполнить GoSub по указанному контексту, используя текущий канал.
    • b([[context^]exten^]priority[(arg1[^...][^argN])]): Перед выполнением исходящего вызова выполнить GoSub по указанному контексту, в новом канале.
    • d: Выключить объявление 'Please hold while we try and connect your call'
    • I: Игнорировать любые запросы на изменение текущего вызова.
    • l: Отключить оптимизацию локального вызова. Видимо равносильно действию опции '/n' канала Local (Local/${EXTEN}@from-internal/n).
    • N: Не отвечать на входящий вызов, пока мы не готовы соединить вызывающего абонента. Игнорируется если вызов уже отвечен (например командой Answer). Если вызов не отвечен опции 'a' и 's' игнорируется, в то время как опция 'd' считается включенной, даже если не задана явно.
    • n: Проиграть сообщение о недоступности абонента, если он отказался принимать вызов.
    • s: Проиграть 'The party you're calling isn't at their desk'до начала переадресации.
примеры

пример 1

extensions.conf:

exten => _4411,1,Answer
exten => _4411,2,Dial(SIP/${EXTEN},12,t)
exten => _4411,3,GotoIf($["${DIALSTATUS}" = "NOANSWER"]?:4:5)
exten => _4411,4,Followme(${EXTEN})
exten => _4411,5,VoiceMail(u${EXTEN})
exten => _4411,6,Hangup

followme.conf:

[4411]
context => default
number => 4410,30
number => 4420,30

пример 2:

extensions.conf:

exten => 1111,1,Dial(PJSIP/1111,15,tr)
exten => 1111,n,FollowMe(4444)
exten => 1111,n,Wait(1)
exten => 1111,n,Playback(beep)
exten => 1111,n,Goto(1)

exten => 2222,1,Dial(PJSIP/2222},15,tr)
exten => 2222,n,FollowMe(UserTest,san)
exten => 2222,n,Goto(4444,1)

exten => 4444,1,Dial(PJSIP/4444,15,tr)
exten => 4444,n,FollowMe(${EXTEN},s)
exten => 4444,n,Voicemail(UserTest)
exten => 4444,n,Hangup

followme.conf:

[4444]
music => default
context => default
number => 1965751234,5
number => 17182025678,20
number => 1234
number => 5678

[UserTest]
number => 09876&210,40,2 ; вызываются одновременно 09876 и 210 в течении 40-ка секунд.
number => 543,30,1 ; но сначала вызывается 543 в течении 30 секунд.

Пример 3: Follow-me без использования приложения app_followme

[incoming]
exten => 300,1,Answer()
exten => 300,2,Dial(DAHDI/1,30,grM(call-screening^${CALLERIDNUM}^${CONTEXT}^${EXTEN}^${PRIORITY}))
exten => 300,3,Hangup()
exten => 300,103,NoOp(${EXTEN}::${PRIORITY})
exten => 300,104,VoiceMail(u${EXTEN}@default)
exten => 300,105,Hangup()
exten => t,1,Playback(connection-timed-out)
exten => t,2,Playback(goodbye)
exten => t,3,Hangup()
[macro-call-screening]
exten => s,1,NoOp(${ARG2}::${ARG3}::${ARG4}::)
exten => s,2,Playback(vm-youhave)
exten => s,3,Playback(letters/a)
exten => s,4,Playback(call)
exten => s,5,Playback(from)
exten => s,6,SayDigits(${ARG1})
exten => s,7,Read(ACCEPTCALL|1-yes-2-no|1) ; (repeatoptions)
exten => s,8,GotoIf($["${ACCEPTCALL}" = ""] ?t,1)
exten => s,9,GotoIf($[${ACCEPTCALL} = 2] ?s,11)
exten => s,10,GotoIf($[${ACCEPTCALL} = 1] ?s,14:s,2)
exten => s,11,Set(NEWPRIORITY=$[${ARG4} + 101])
exten => s,12,Set(MACRO_RESULT=GOTO:${ARG2}^${ARG3}^${NEWPRIORITY})
exten => s,13,Goto(s,16);
exten => s,14,Playback(auth-thankyou)
exten => s,15,Set(MACRO_RESULT=)
exten => s,16,NoOp(End of macro)
exten => t,1,Playback(connection-timed-out)
exten => t,2,Goto(s,2)

см. также

Asterisk: followme.conf

 

FreePBX Follow Me

$
0
0

FreePBX Follow Me

Следуй за мной. Предустановленный переход вызова на местный или внешний номер.

Edit Follow Me

  • Disable - Выключить Follow Me
  • Initial Ring Time - Время через которое будет вызван номер из списка Follow Me.
  • Ring Strategy - стратегия наведения вызова на несколько номеров.
    • ringallV2: Звонит первый в списке телефон в течении Initial Ring Time, по истечении этого времени звонят все телефоны из списка.
    • ringall - Звонят, одновременно, все телефоны из списка.
    • hunt - Звонит 1-й телефон из списка, если нет ответа в течении Ring Time, звонит следующий и так далее до конца списка.
    • memoryhunt - Звонит 1-й телефон из списка, затем 1-й и 2-й, затем 1-й, 2-й и 3-й и тд.
    • firstavaialbleЗвонит первый доступный из списка номер и Destination If No Answerпо неответу.
    • firstnotonphoneЗвонит первый доступный из списка номер и только он.
  • Ring Time - Время в течении которого будут вызываться номера из списка Follow Me.
  • Follow-Me List - список номеров для переадресации. Могут быть указаны как внутренние номера системы, так и внешние. Внешний номер должен заканчиваться #.

Пример списка:

2201 - Основной номер.
4001 - Другой внутренний номер.
1234567890# - Внешний номер. Решетка символ конца номера. Используйте, также, префикс выхода на внешнюю линию.
  • Announcement - Здесь можно указать системное сообщение, которое прозвучит перед тем, как будут вызваны номера из списка Follow Me.
  • Play Music on Hold - Здесь можно выбрать музыку на удержании MOH, которая будет проигрываться вызывающему абоненту. Если указано Ring, абонент услышит КПВ.
  • CID Name Prefix - Здесь можно указать префикс CallerID отображаемого на местных телефонах, для указания что поступает переадресованный вызов. Т.к. префикс передается как CallerID NAME, на внешний номер, вероятнее всего, передаваться не будет.

Call Confirmation Configuration

  • Confirm Calls - Эта опция включает голосовое предупреждение о переадресации на внешний номер (отмеченный #). Для подтверждения надо нажать «1».
  • Remote Announce - Голосовое сообщение внешнему абоненту с запросом подтверждения о приеме вызова (нажмите 1)
  • To-Late Announce - Голосовое сообщение внешнему абоненту.

Change External CID Configuration

Модификация внешнего CallerID

  • Mode
    • Default - В этом режиме предается CallerID вызывающего абонента без изменений.
    • Fixed CID Value - Если вы выбрали этот режим будет передано CID назначенное в поле Fix CID Option
    • Outside Fixed CID Value - Тоже само, за исключением вызовов с внутренних номеров.
    • Use Dialed Number - Устанавливает в качестве CID входящий номер, на который пришел вызов.
    • Force Dialed Number - Тоже самое, только игнорирует опцию “Block Foreign Caller ID”, если таковая задана на транке, через который идет вызов.
  • Fixed CID Value - задайте CID если выбран режим Fixed CID Valueили Outside Fixed CID Value.

Destination if no answer

  • Destination if no answer - назначение вызова, если никто из списка Follow Me не ответил по истечении Ring Timeв соответствии со стратегией вызова. По умолчанию выполняется «Normal Extension Behavior» - нормальные условия для екстеншена, как если бы Follow Me не было задано.

см. также

FreePBX


Asterisk: PauseQueueMember

$
0
0

Asterisk: PauseQueueMember

Приложение Asterisk: Поставить агента очереди на паузу (временно вывести из обслуживания очереди).

Описание

Не направлять вызовы из очереди статическому или динамическому агенту. Устанавливает паузу на указаном интерфейсе, в указанной очереди.
Если очередь не определена, устанавливает паузу для указанного интерфейса во всех очередях, которые он обслуживает.
Приложение не выполняется, если интерфейс агента не найден.
Следующие текстовын значения возвращаются в переменную ${PQMSTATUS} по выполнению:

  • PAUSED
  • NOTFOUND
пример:
 PauseQueueMember(,SIP/3000)
Синтаксис

PauseQueueMember([queuename],interface[,options[,reason]])

Аргументы
  • queuename - имя очереди
  • queuename - интерфейс агента
  • options - ?
  • reason - если назначено, дополнительная информация добавляется в лог очередии в события AMI.

Пример

exten => _[1234]02,1,Noop(agent pause)
   same => n,Set(queueN=q${EXTEN:0:1})
   same => n,PauseQueueMember(${queueN},SIP/${CALLERID(num)})
   same => n,PlayBack(ru/agent-loggedoff)

CLI> queue show <queue_name>

   SIP/4887 (ringinuse disabled) (dynamic) (paused) (Not in use) has taken no calls yet
См. также

Asterisk Phonebook - телефонная книга

$
0
0

Asterisk Phonebook - телефонная книга

Общая телефонная книга, основанная на CMS/LAMP и используемая Asterisk PBX, имя и номер заносятся в базу MySQL и выводятся, например, в XML-браузере IP телефона или браузере. Click to Dial из браузера.

phonebook

Установка Asterisk Phonebook

Требуются следующие приложения

  • Apache Webserver 2.x +
  • php 4.2 - 5.3 (в 5.4 без register_globals = On не работает) php 5.4 register_globals

register_globals fix

register_globals fix

foreach (array('_GET', '_POST', '_COOKIE', '_SERVER') as $_SG) {
    foreach ($$_SG as $_SGK => $_SGV) {
        $$_SGK = $_SGV;
    }
}

Добавить в начала исполняемого php скрипта.


  • Asterisk 1.4 - Asterisk 12
  • MySQL 4.1 +
  • FreePBX (опционально)
  # cd /var/www/html

Скачайте исходник с помощью wget.

  # wget https://asterisk-pbx.ru/downloads/phonebook_asterisk.tar.gz

Распакуйте архив

  # tar -xzvf phonebook_asterisk.tar.gz

Создайте директорию ~/phonebook/upload и установите права на неё rwxrwxrwx

  # mkdir phonebook_asterisk/upload \\
  # chmod 777 /var/www/html/phonebook_asterisk/upload

Отредактируйте php.ini

  register_globals = On

Создание базы данных MySQL

CREATE DATABASE IF NOT EXISTS `asterisk` ;

CREATE TABLE `pbook` (
  `id` int(11) NOT NULL auto_increment,
  `calld` varchar(50) NOT NULL,
  `name` varchar(50) NOT NULL,
  `bemerkung` text NOT NULL,
  `Diverses` int(1) NOT NULL default '0',
  KEY `id` (`id`),
  KEY `calld` (`calld`),
  KEY `name` (`name`)
)  ;


CREATE TABLE `pbook_directory` (
  `id` int(9) NOT NULL,
  `tel` varchar(20) NOT NULL,
  `name` varchar(50) NOT NULL,
  `strasse` varchar(50) NOT NULL,
  `ort` varchar(50) NOT NULL,
  KEY `tel` (`tel`),
  KEY `name` (`name`)
) ;


CREATE TABLE IF NOT EXISTS `users` (
  `extension` varchar(20) NOT NULL default '',
  `password` varchar(20) default NULL,
  `name` varchar(50) default NULL,
  `voicemail` varchar(50) default NULL,
  `ringtimer` int(3) default NULL,
  `noanswer` varchar(100) default NULL,
  `recording` varchar(50) default NULL,
  `outboundcid` varchar(50) default NULL,
  `directdid` varchar(50) default NULL,
  `didalert` varchar(50) default NULL,
  `faxexten` varchar(20) default NULL,
  `faxemail` varchar(50) default NULL,
  `answer` tinyint(1) default NULL,
  `wait` int(2) default NULL,
  `privacyman` tinyint(1) default NULL
) ;


CREATE TABLE IF NOT EXISTS `events` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `timestamp` datetime NOT NULL default '0000-00-00 00:00:00',
  `event` longtext,
  `uxtime` int(11) NOT NULL,
  `DEST` varchar(20) NOT NULL,
  `SRC` varchar(20) NOT NULL,
  `UID` varchar(20) NOT NULL,
  `CID` varchar(20) NOT NULL,
  `CIDNAME` varchar(50) NOT NULL,
  `IDdest` varchar(20) NOT NULL,
  `IDsrc` varchar(20) NOT NULL,
  `EVNT` varchar(20) NOT NULL,
  PRIMARY KEY  (`id`)
);


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

CREATE DATABASE IF NOT EXISTS `asteriskcdrdb` ;


CREATE TABLE IF NOT EXISTS `cdr` (
  `calldate` datetime NOT NULL default '0000-00-00 00:00:00',
  `clid` varchar(80) NOT NULL default '',
  `src` varchar(80) NOT NULL default '',
  `dst` varchar(80) NOT NULL default '',
  `dcontext` varchar(80) NOT NULL default '',
  `channel` varchar(80) NOT NULL default '',
  `dstchannel` varchar(80) NOT NULL default '',
  `lastapp` varchar(80) NOT NULL default '',
  `lastdata` varchar(80) NOT NULL default '',
  `duration` int(11) NOT NULL default '0',
  `billsec` int(11) NOT NULL default '0',
  `disposition` varchar(45) NOT NULL default '',
  `amaflags` int(11) NOT NULL default '0',
  `accountcode` varchar(20) NOT NULL default '',
  `uniqueid` varchar(32) NOT NULL default '',
  `userfield` varchar(255) NOT NULL default ''
) ;

Смотри также Команды mysql

Настройки Phonebook

Внесите изменения в файл config.php
Для MySQL

$mysql_host="localhost"; // eg, localhost - хост MySQL
$mysql_user="root";  // пользователь базы данных mysql
$mysql_password="********";  // пароль к базе данных mysql
$mysql_db_book="asterisk";

// mysql settings DB asteriskcdrdb for cdr tables
$cdr_mysql_host="localhost"; // eg, localhost - should not be empty for productive servers
$cdr_mysql_user="root";  // mysql db user, if you not shure prefer root
$cdr_mysql_password="********";  // insert your password
$cdr_mysql_db_book="asteriskcdrdb"; // should be well

Общие настройки

// Language
$language="en";

// A-Z register
$anz_numbers=40; // количество записей

// диапазон внутенних номеров asterisk:
$local_from=1;  // range begin
$local_to=1000; // range end
$local_list="100,209"; // дополнительные номера через запятую
$local_freepbx=1; // внутренние номера freepbx, если freepbx нет:  $local_freepbx=0 ;

// отображаемая длина номера
$clidlen=25;

// мониторинг событий
// пример : $sip_monitoring="100,101,111,112,113";  //     100 = ваш номер
$sip_monitoring="100,101,111,112,113";

// 1 = show all report entries | 0 = only the local phone number
$report_show_all=1;

Для Asterisk

/// Asterisk ////////////////////////////////////
// Location of Asterisk LOGFILE
$logfile = "/var/log/asterisk/cdr-csv/Master.csv";

// Настройки для Asterisk API в 'manager.conf'

// [phonebook]
// secret = 1234
// deny=0.0.0.0/0.0.0.0
// permit=127.0.0.1/255.255.255.0
// read = system,call,log,verbose,command,agent,user
// write = system,call,log,verbose,command,agent,user

$UserName="phonebook";
$Secret="1234";

// контекст из которого будет производится набор в extensions.conf
$context="from-internal";

//// end of config.php //////////////////////////

Включить поиск по CID для FreePBX

Отредактируйте /etc/asterisk/extensions.conf

# ;; найдите следующий контекст
[macro-user-callerid]
;;;; вместо этой строки
exten => s,1,Noop(user-callerid: ${CALLERID(name)} ${CALLERID(number)})

;;;; вставьте следующие две
exten => s,n,DBGet(name=cidname/${CALLERIDNUM})
exten => s,n,SetCIDName(${name})

;;;; дальше отставить код
exten => s,n,GotoIf($["${CHANNEL:0:5}" = "Local"]?report)
exten => s,n,GotoIf($["${REALCALLERIDNUM:1:2}" != ""]?start)
exten => s,n,Set(REALCALLERIDNUM=${CALLERID(number)})

Перезапустите Asterisk

 CLI>core reload

Использование Phonebook

Откройте в браузере http://your_pbx/phonebook_asterisk/book.php
Укажите в настройках номер своего екстеншена и префикс выхода на внешние линии (если требуется) и сохраните ссылку. phonebook setup

Уже существующие телефоны отображаются справа. Кликните на требуемый номер.

phonebook call

Дополнительно

Если вам требуется ограничить доступ к телефонной книге используйте .htaccess.

<Limit GET>
        Order deny,allow
        Allow from localhost
        Allow from 192.168.1.
        Deny from all
        Satisfy any</Limit>

troubleshooting

При попытке набора в консоли Asterisk CLIвозникает ошибка:

ERROR[]: utils.c: ast_careful_fwrite: fwrite() returned error: Broken pipe

Отредактируйте файл, добавив sleep(1);

nano ../phonebook_asterisk/manager.php

$timeout = 10;
 $asterisk_ip = "127.0.0.1";
 $socket = fsockopen($asterisk_ip,"5038", $errno, $errstr, $timeout);
 fputs($socket, "Action: Login\r\n");
 fputs($socket, "UserName: $UserName\r\n");
 fputs($socket, "Secret: $Secret\r\n\r\n");
 fputs($socket, "Action: Originate\r\n" );
 fputs($socket, "Channel: SIP/$ext\r\n" );
 fputs($socket, "Exten: $num\r\n" );
 fputs($socket, "Callerid: $ext to $call <$ext>\r\n");
 fputs($socket, "Timeout: 15000\r\n" );
 fputs($socket, "Context: $context\r\n" );
 fputs($socket, "Priority: 1\r\n" );
 fputs($socket, "Async: yes\r\n\r\n" );
 fputs($socket, "Action: Logoff\r\n\r\n");
 sleep (1);
 $wrets=fgets($socket,128);

http://highsecurity.blogspot.ru/2011/03/cisco-sip-ip-phone-corporate-directory.html

FreeSWITCH > Telegram Notifications

$
0
0

telegram botfather

FreeSWITCH > Telegram Notifications

FS: Уведомления о пропущенных вызовах в Telegram.

@BotFather: /newbot

Сперва создадим бота, который будет уведомлять нас о пропущенных вызовах (или любых других данных поступающих от FreeSwitch, на ваше усмотрение). Для этого найдем в поиске @botfatherи дадим ему команду /newbot.
В ответ он предложит выбрать имя бота. После того, как имя задано, будет предложено задать username. В отличии от имени, usernameдолжно быть уникальным, т.к. служит для идентификации бота.
Usernameдолжно заканчиваться словом bot. Например myname_botили mynamebot.
Когда уникальный usernameзадан, папа бот сообщит токен:

Use this token to access the HTTP API:
xxxx:yyyy

Теперь наш бот создан, увидеть список ботов можно при помощи команды /mybots.
Найдите бота по заданному usernameи пошлите ему команду /start.

Осталось, только, получить chat_id, уникальный для каждого пользователя Telegram, который обращается к боту: https://api.telegram.org/bot<token>/getupdates, где <token>полученное ранее значение xxxx:yyyy.
Сделать это можно из командной строки linux при помощи curl, или из адресной строки браузера:

 # curl https://api.telegram.org/bot<xxxx:yyyy>/getupdates

в ответ мы получим 8-ми значный уникальный idнашего пользователя Telegram для данного чата:

 ..."chat":{"id":XXXXXXXX,"first_name":"<telegram first name>","last_name":"<telegram last name>"...

Если в ответ приходит только: {«ok»:true,«result»:[]}, пошлите повторно боту команду /start и попробуйте еще раз.

Отправим тестовое сообщение в чат:

 curl -X POST  "https://api.telegram.org/bot<xxxx:yyyy>/SendMessage" -d "chat_id=<XXXXXXXX>&text=test text"

FreeSwitch cURL > Telegram

Теперь настроим FS для отправки уведомлений о пропущенных вызовах.

В данном примере используется приложение диалплана FreeSwitch - mod_curl, но вы можете обращаться к боту любым удобным для вас способом, подходящим для решения ваших задач. Например вызывать bash script приложением диалплана systemили написать приложение на lua.

Конфигурация FS сводится к вызову из диалплана приложения cURL с требуемыми параметрами.
Простейший пример вызова абонента c уведомлением:

<extension name="local.2XXX"><condition field="destination_number" expression="^(2\d{3})$"><action application="set" data="call_timeout=15"/><action application="set" data="continue_on_fail=NO_ANSWER"/><action application="bridge" data="user/$1@${domain_name}"/><action application="set" data="chatid=${user_data($1@${domain_name} var chat_id)}"/><action application="curl" data="https://api.telegram.org/bot<token>/sendMessage?chat_id=${chatid}&text=${effective_caller_id_number}-${effective_caller_id_name}"/></condition></extension>
  • call_timeout=15 - вызывать абонента в течении 15 секунд.
  • continue_on_fail=NO_ANSWER - продолжить выполнение диалплана, если на вызов не ответили в течении 15 секунд.
  • chatid=${user_data($1@${domain_name} var chat_id)} - получить telegram chat_idабонента, заданный в directory и сохранить его в переменную chatid.
  • <action application=«curl»…> - передать номер и имя вызывающегоабонента в чат вызываемогоабонента.

Пример настроек directoryс заданной переменной chat_id:

<include><user id="2666"><params><param name="password" value="$${default_password}"/><param name="vm-password" value="2666"/></params><variables><variable name="accountcode" value="2666"/><variable name="user_context" value="default"/><variable name="effective_caller_id_name" value="IT Dwarf"/><variable name="effective_caller_id_number" value="2666"/><variable name="chat_id" value="XXXXXXXX"/></variables></user></include>

где <variable name=«chat_id» value=«XXXXXXXX»/> - уникальный Telegram chat_idабонента.

Ссылки по теме

FreeSwitch: простейшая настройка SIP gateway и Диалплана

$
0
0

FreeSwitch: простейшая настройка SIP gateway и Диалплана

Настройка Sip profiles (транспорта) и gateways (транков). Входящая и исходящая маршрутизация. Примеры и комментарии.

 +---------------------+          +-----------------------+
 |    Extensions       |          |       Profiles        |
 |  ../conf/directory  |          |  ../conf/sip_profiles |
 +---------------------+          +-----------------------+
            |                                 |
            +----------+          +-----------+
                       |          |
                       V          V
                  +---------------------+
                  |      Contexts       |
                  |  ../conf/dialplan   |
                  +---------------------+

Подробнее о конфигурации sip_profiles и directory

Значения использованные в примерах: данные шлюзов.

IP/domainGateway Name
192.168.0.252samsung
sip.itsp.comitsp
SIP транк (gateway) частной сети АТС.

conf/sip_profiles/internal/samsung.xml

<include><gateway name="samsung"><param name="username" value="samsung"/><param name="password" value="register:false"/><param name="proxy" value="192.168.0.252"/><param name="expire-seconds" value="800"/><param name="register" value="false"/><param name="register-transport" value="udp"/><param name="retry-seconds" value="60"/><param name="context" value="default"/><param name="caller-id-in-from" value="true"/></gateway></include>

Если в параметре <param name="proxy" value="192.168.0.252"/>порт не задан, то используется 5060, по умолчанию.
Чтобы задать специфический порт SIPсигнализации, используйте форму записи: <param name="proxy" value="192.168.0.252:5077"/>

Так как gateway создан в sip_profileinternal, входящие вызовы из корпоративной АТСбудут попадать непосредственно в контекст defaultи если пользователь с вызываемым номером существует, он будет вызван. Дополнительные правила входящей маршрутизации не требуются. Таким образом вы можете создать корпоративную телефонную сеть со сквозной нумерацией.

Поле <param name="caller-id-in-from" value="true"/>обеспечит передачу внутреннего номера из поля From:в качестве CallerID.

SIP gateway провайдера ( ITSP )

conf/sip_profiles/external/itsp.xml

<include><gateway name="itsp"><param name="username" value="itsp"/><param name="password" value="12345"/><param name="realm" value="sip.itsp.com"/><param name="from-user" value="itsp_user"/><param name="from-domain" value="sip.itsp.com"/><param name="proxy" value="sip.itsp.com:5060"/><param name="expire-seconds" value="800"/><param name="register" value="true"/><param name="retry-seconds" value="60"/><param name="context" value="public"/><param name="caller-id-in-from" value="false"/></gateway></include>
Входящая маршрутизация из контекста Public

conf/dialplan/public/00_inbound_did.xml

<include><extension name="public_did"><condition field="destination_number" expression="^(7771000)$"><!--
	  $${domain} это домен FreeSwitch по умолчанию, назначенный в vars.xml.**
      --><action application="set" data="domain_name=$${domain}"/><!-- этот пример направляет вызовы по  DID 7771000 на внутренний номер 1000 в контексте default --><action application="transfer" data="1000 XML default"/></condition></extension></include>

<X-PRE-PROCESS cmd=«set» data=«domain=$${local_ip_v4}»/>
<X-PRE-PROCESS cmd=«set» data=«domain_name=$${domain}»/>

Устанавливает домен по умолчанию используемый FreeSWITCH, если другое не задано.
По умолчанию $${local_ip_v4}

Исходящая маршрутизация через gateway's

вводные данные маршрутизации

Набор Четырехзначных номеров в частную сеть АТС
цифрыexpressionextension name
2XXX^(2\d{3})$local.samsung

conf/dialplan/default/01_samsung.xml

<include><extension name="local.samsung"><condition field="destination_number" expression="^(2\d{3})$"><action application="set" data="effective_caller_id_name=${user_data(${username}@${domain_name} var effective_caller_id_name)}"/><action application="set" data="effective_caller_id_number=${user_data(${username}@${domain_name} var effective_caller_id_number)}"/><action application="bridge" data="sofia/gateway/samsung/$1"/></condition></extension></include>
Внешние вызовы через провайдера без префикса
цифрыextension name
XXXXXXXlocal.itsp
89XXXXXXXXXdomestic.itsp
810XXXXXXXXXXinternational.itsp

conf/dialplan/default/01_itsp.xml

<include><extension name="local.itsp"><condition field="destination_number" expression="^(\d{7})$"><action application="set" data="outbound_caller_id_number=${user_data(${username}@$${domain} var outbound_caller_id_number)}"/><action application="set" data="outbound_caller_id_name=${user_data(${username}@$${domain} var outbound_caller_id_name)}"/><action application="bridge" data="sofia/gateway/itsp/$1"/></condition></extension><extension name="domestic.itsp"><condition field="destination_number" expression="^(89\d{9})$"><action application="set" data="outbound_caller_id_number=${user_data(${username}@$${domain} var outbound_caller_id_number)}"/><action application="set" data="outbound_caller_id_name=${user_data(${username}@$${domain} var outbound_caller_id_name)}"/><action application="bridge" data="sofia/gateway/itsp/$1"/></condition></extension><extension name="international.itsp"><condition field="destination_number" expression="^(810\d+)$"><action application="set" data="outbound_caller_id_number=${user_data(${username}@$${domain} var outbound_caller_id_number)}"/><action application="set" data="outbound_caller_id_name=${user_data(${username}@$${domain} var outbound_caller_id_name)}"/><action application="bridge" data="sofia/gateway/itsp/$1"/></condition></extension></include>

Глобальная переменная ${outbound_caller_id_number}задается в файле vars.xml:

<X-PRE-PROCESS cmd="set" data="outbound_caller_id_name=fs"/><X-PRE-PROCESS cmd="set" data="outbound_caller_id_number=777777"/>

обычно требуется передать провайдеру callerID из вашего пула номеров, это можно сделать для каждого маршрута:

<action application="set" data="effective_caller_id_number=8129981138"/><action application="set" data="effective_caller_id_name=8129981138"/>

Переменная ${effective_caller_id_number}указывает непосредственно на поле From: из SIPзаголовка вызывающего устройства.

Её можно заменить переменной заданной в настройках юзера — ../directory/default/user.xml<variable name="effective_caller_id_number" value="8129981138"/>,

получается при помощи команды ${user_data(${username}@${domain_name} var effective_caller_id_number)}

Внешние вызовы через провайдера через префикс "9".
префиксцифрыextension name
9XXXXXXXlocal.itsp
98[09]XXXXXXXXXmobile.itsp
98X.international.itsp
<include><extension name="local.itsp"><condition field="caller_id_number" expression="^(397\d)$"/><condition field="destination_number" expression="^9(\d{7})$"><action application="set" data="effective_caller_id_number=8129981138"/><action application="set" data="effective_caller_id_name=8129981138"/><action application="bridge" data="sofia/gateway/itsp/$1"/></condition></extension><extension name="mobile.itsp"><condition field="caller_id_number" expression="^(397\d)$"/><condition field="destination_number" expression="^9(8[09]\d{9})$"><action application="set" data="effective_caller_id_number=8129981138"/><action application="set" data="effective_caller_id_name=8129981138"/><action application="bridge" data="sofia/gateway/itsp/$1"/></condition></extension><extension name="international.itsp"><condition field="caller_id_number" expression="^(397\d)$"/><condition field="destination_number" expression="^9(8\d+)$"><action application="set" data="effective_caller_id_number=8129981138"/><action application="set" data="effective_caller_id_name=8129981138"/><action application="bridge" data="sofia/gateway/itsp/$1"/></condition></extension></include>

Условие

<condition field="caller_id_number" expression="^(397\d)$"/>

можно использовать для ограничения доступа к gateway.
В примере через данный gateway смогут звонить только номера 3970-3979.

sc qc FreeSWITCH

FreeSWITCH

Asterisk + SugarCRM

$
0
0

Asterisk + SugarCRM

CentOS 6, Asterisk 1.8, SugarCRM 6.5 Callinize

Сделаем update

 yum -y update

Выключим Selinux

 sed -i s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
 reboot

Установим базовые пакеты сервера

 yum -y groupinstall core
 yum -y groupinstall base

Установим зависимости для SugarCRM

 yum -y install php php-pear php-mbstring mysql-server php-mysql php-imap httpd nano

Включим автозагрузку MySQL и Apache

chkconfig httpd on
chkconfig mysqld on
service httpd start
service mysqld start

Проверим версию PHP 5.2+

php -v

PHP 5.3.3 (cli) (built: Oct 30 2014 19:56:14)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

Зададим timezone для php

(В примере Europe/Moscow, измените, если требуется)

 sed -ie 's/\;date\.timezone\ \=/date\.timezone\ \=\ "Europe\/Moscow"/g' /etc/php.ini

Запретим подключаться к MySQL с других IP

nano /etc/my.cnf
[mysqld]
...
bind-address = 127.0.0.1

Установите Asterisk 1.8

Нажмите, чтобы отобразить

Нажмите, чтобы скрыть

 cd /usr/src &&
 wget http://downloads.asterisk.org/pub/telephony/asterisk/asterisk-1.8-current.tar.gz
cd /usr/src &&
tar xvfz asterisk-1.8-current.tar.gz* &&
cd asterisk-1.8.* &&
./configure &&
contrib/scripts/get_mp3_source.sh &&
make &&
make install &&
make config &&
make samples

Установим SugarCRM

проверим настройки php

проверим настройки php

nano +457 /etc/php.ini

memory_limit = 128M
(Ctl-x > y > ENTER)
nano +878 /etc/php.ini

upload_max_filesize = 20M
(Ctl-x > y > ENTER)
RHEL 6
nano +338 /etc/httpd/conf/httpd.conf

AllowOverride All
(Ctl-x > y > ENTER)

Скачаем SugarCRM

(проверьте текущую версию: http://sourceforge.net/projects/sugarcrm/files/)

 cd /var/www/html
 wget http://downloads.sourceforge.net/project/sugarcrm/1%20-%20SugarCRM%206.5.X/SugarCommunityEdition-6.5.X/SugarCE-6.5.20.zip

Распакуем скачанный архив

 unzip SugarCE-*.zip

Переименуем извлеченную директорию

 mv SugarCE-*/ crm

Зададим права пользователя

Проверим:

  nano -v +242 /etc/httpd/conf/httpd.conf

Если владелец apache,

  User apache
  Group apache

то, соответственно:

  chown -R apache:apache /var/www/html/crm

Перезапустим веб сервер

 service httpd restart

Дальнейшая установка должна быть продолжена через веб интерфейс.

  http://ServerIP/crm/install.php

Откройте установочный скрипт в вашем любимом браузере.

По умолчанию в CentOS включен файервол. Отключите его если требуется:

 service iptables stop

Или откройте доступ к 80-му порту:

 iptables -A INPUT -p tcp --dport 80 -j ACCEPT
 service iptables save

Оставьте имя БД MySQL по умолчанию

 Database Name = sugarcrm

Данная инструкция предполагает, что БД находится на этом же сервере:

 Host Name = localhost

Измените пароль в соответствии с вашими настройками MySQL

По умолчанию пароль пользователя 'root' MySQL не задан.
Задайте его, если требуется:
mysqladmin -u root password 'SOMEPASSWORD'.
Если пароль был задан, используйте его вместо 'somepassword' в примере

  Database Administrator Username = root
  Database Administrator password = somepassword

sugarcrm database conf

Настройте администратора системы

sugarcrm install admin

Авторизуйтесь с заданными значениями

Установка модуля CallInize

Скачайте модуль:

http://www.sugarforge.org/frs/?group_id=773

Модуль устанавливается в панели администратора SugarCRM:

Admin → Module Loader

Затем добавим поля модуля, для этого перейдем в:

Admin → Studio

А там:

Users > Layouts > Edit View

sugarcrm layouts edit view

Перетаскиваем сперва слева-на-право New Panelи New Row.
На них сверху накладываем Personal Extensinon, Magic Dial Buttons, Call notification.
Сохраняем вид: Save & Deploy.

Callinize - Asterisk SugarCRM Integration

Настроим связь между Asterisk и SugarCRM:

Admin > Module Configuration

Зададим данные для авторизации в Asterisk AMI:

sugarcrm callinize

Раздел Asterisk Server Settings Данные Asterisk Manager Login, должны совпадать с пользователем, заданным в файле:

/etc/asterisk/manager.conf
В нашем примере это test/test111

[test]
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0

secret = test111
deny=0.0.0.0/0.0.0.0
permit=127.0.0.1/255.255.255.0
read = all
write = all

Раздел Call Configuration

Dial Context - Контекст плана набора, в котором будут отслеживаться входящие и исходящие вызовы.
Dialpattern for inbound/outbound matching - ^(SIP\/[1-9][0-9][0-9]?[0-9]?-|Local) - Регулярное выражение для отслеживание входящих/исходящих вызовов.

Проверим подключение к Asterisk

 php  /var/www/html/crm/custom/modules/Asterisk/asteriskLogger.php

<spoiler|Asterisk Logger Starting>

******** Asterisk Logger Starting [2015-01-01 00:01:02]**************
[Config Settings]
 Sugar root set to [/var/www/html/crm/custom/modules/Asterisk/../../../]
PHP Notice:  Undefined index: asterisk_log_file in /var/www/html/crm/custom/modules/Asterisk/asteriskLogger.php on line 133
 Main Log is logging to:
PHP Notice:  Undefined index: asterisk_event_log_file in /var/www/html/crm/custom/modules/Asterisk/asteriskLogger.php on line 134
 Found Language file for en_us
 Callout prefix is []
 Callin prefix is []
 Match Internal Regex = /^(SIP\/[1-9][0-9][0-9]?[0-9]?-|Local)/i
[Database Connection]
 Selecting DB Name: sugarcrm
[SOAP Connection]
 Trying SOAP login endpoint=[http://192.168.0.52/crm/soap.php] user=[admin] password=[21232f297a57a5a743894a0e4a801fc3]
PHP Warning:  Attempt to modify property of non-object in /var/www/html/crm/include/nusoap/nusoap.php on line 6166
PHP Warning:  Attempt to modify property of non-object in /var/www/html/crm/include/nusoap/nusoap.php on line 6166
PHP Warning:  Attempt to modify property of non-object in /var/www/html/crm/include/nusoap/nusoap.php on line 6166
PHP Warning:  Attempt to modify property of non-object in /var/www/html/crm/include/nusoap/nusoap.php on line 6166
 Successfully logged into Sugar via SOAP! SessionId=mji6fj230a4cm7v2j3n77u4hh4 user=admin GUID=1
[Asterisk Manager Interface (AMI) Connection]
 Successfully opened socket connection to 127.0.0.1:5038
 AMI Version Info:
 ```
 Asterisk Call Manager/1.1
 ```
 Supported AMI version: 1.1 Detected
 AMI Login action raw response:
 ```
 Response: Success
 Message: Authentication accepted
 ```
 AMI Login was a *success!*
Waiting for call events...

</spoiler>

Обратите внимание на версию Asterisk Call Manager/1.1 . Использование Asterisk 1.8 обусловлено именно этим.
Например в Asterisk 12 используется Asterisk Call Manager/2.5и всплывающее окно (pop up) не появляется, т.к. формат отображение событий в AMIотличается.

<spoiler| Входящий вызов Asterisk Call Manager/1.1>SIP/1234567 - SIPтранк, по которому поступает вызов
SIP/1111 - вызываемый SIPекстеншен asterisk
4957777 - номер вызывающего абонента

------------------
 Phone                : 4957777

Cleaning up Failed Calls part1, asterisk_id = 1419854331.2
[2014-12-29 12:00:00] Patiently Waiting...! (mem_used: 3713148)
[2014-12-29 12:01:00] Patiently Waiting...! (mem_used: 3713148)
[2014-12-29 12:01:22]
! --- Event -----------------------------------------------------------
!                Event --> Newchannel
!            Privilege --> call,all
!              Channel --> SIP/1234567-00000004
!         ChannelState --> 0
!     ChannelStateDesc --> Down
!          CallerIDNum --> 2776
!         CallerIDName -->
!          AccountCode -->
!                Exten --> 1111
!              Context --> test
!             Uniqueid --> 1419854482.4
! ---------------------------------------------------------------------
! AMI Event 'Newstate suppressed.
[2014-12-29 12:01:22]
! --- Event -----------------------------------------------------------
!                Event --> NewCallerid
!            Privilege --> call,all
!              Channel --> SIP/1234567-00000004
!          CallerIDNum --> 4957777
!         CallerIDName -->
!             Uniqueid --> 1419854482.4
!      CID-CallingPres --> 0 (Presentation Allowed, Not Screened)
! ---------------------------------------------------------------------
 CallerID Changed to: 4957777
[2014-12-29 12:01:22]
! --- Event -----------------------------------------------------------
!                Event --> NewCallerid
!            Privilege --> call,all
!              Channel --> SIP/1234567-00000004
!          CallerIDNum --> 4957777
!         CallerIDName --> 4957777
!             Uniqueid --> 1419854482.4
!      CID-CallingPres --> 0 (Presentation Allowed, Not Screened)
! ---------------------------------------------------------------------
 CallerID Changed to: 4957777
[2014-12-29 12:01:22]
! --- Event -----------------------------------------------------------
!                Event --> Newchannel
!            Privilege --> call,all
!              Channel --> SIP/1111-00000005
!         ChannelState --> 0
!     ChannelStateDesc --> Down
!          CallerIDNum --> 1111
!         CallerIDName --> 1111
!          AccountCode -->
!                Exten -->
!              Context --> test
!             Uniqueid --> 1419854482.5
! ---------------------------------------------------------------------
[2014-12-29 12:01:22]
! --- Event -----------------------------------------------------------
!                Event --> Dial
!            Privilege --> call,all
!             SubEvent --> Begin
!              Channel --> SIP/1234567-00000004
!          Destination --> SIP/1111-00000005
!          CallerIDNum --> 4957777
!         CallerIDName --> 4957777
!     ConnectedLineNum --> <unknown>
!    ConnectedLineName --> <unknown>
!             UniqueID --> 1419854482.4
!         DestUniqueID --> 1419854482.5
!           Dialstring --> 1111
! ---------------------------------------------------------------------
! Dial Event src=SIP/1234567-00000004 dest=SIP/1111-00000005
PHP Notice:  Undefined index: event in /var/www/html/crm/custom/modules/Asterisk/asteriskLogger.php on line 439
! Successfully created CALL record with id=4521eed1-42ba-093a-4c51-54a1427e1ccb
 Stripping callout prefix:
 Stripping callin prefix:
 CallerID is: 4957777
Looking for user extension number in: SIP/1111-00000005
Channel Matched SIP/### style regex. Ext is:1111
Looking for user extension number in: SIP/1111-00000005
Channel Matched SIP/### style regex. Ext is:1111
  inbound_extension = 1111
Inbound state detected... /^(SIP\/[1-9][0-9][0-9]?[0-9]?-|Local)/i is astMatchInternal eChannel= SIP/1234567-00000004 eDestination=SIP/1111-00000005
PHP Notice:  Undefined index: event in /var/www/html/crm/custom/modules/Asterisk/asteriskLogger.php on line 613
! AMI Event 'Newstate suppressed.
! AMI Event 'Newstate suppressed.
! AMI Event 'Newstate suppressed.
[2014-12-29 12:01:25]
! --- Event -----------------------------------------------------------
!                Event --> NewAccountCode
!            Privilege --> call,all
!              Channel --> SIP/1111-00000005
!             Uniqueid --> 1419854482.5
!          AccountCode -->
!       OldAccountCode -->
! ---------------------------------------------------------------------
[2014-12-29 12:01:25]
! --- Event -----------------------------------------------------------
!                Event --> Bridge
!            Privilege --> call,all
!          Bridgestate --> Link
!           Bridgetype --> core
!             Channel1 --> SIP/1234567-00000004
!             Channel2 --> SIP/1111-00000005
!            Uniqueid1 --> 1419854482.4
!            Uniqueid2 --> 1419854482.5
!            CallerID1 --> 4957777
!            CallerID2 --> 1111
! ---------------------------------------------------------------------
DEBUG: Entered Bridge
Bridge isn't internal to internal
Internal Queue Event Detected
Internal Queue: SELECT id FROM asterisk_log WHERE remote_channel like 'SIP/1234567-00000004' and direction='I' and (channel = '' OR channel is NULL)
DEBUG: NO Queue BRIDGE ROWS found
[2014-12-29 12:01:27]
! --- Event -----------------------------------------------------------
!                Event --> Unlink
!            Privilege --> call,all
!             Channel1 --> SIP/1234567-00000004
!             Channel2 --> SIP/1111-00000005
!            Uniqueid1 --> 1419854482.4
!            Uniqueid2 --> 1419854482.5
!            CallerID1 --> 4957777
!            CallerID2 --> 1111
! ---------------------------------------------------------------------
[2014-12-29 12:01:27]
! --- Event -----------------------------------------------------------
!                Event --> Hangup
!            Privilege --> call,all
!              Channel --> SIP/1111-00000005
!             Uniqueid --> 1419854482.5
!          CallerIDNum --> 1111
!         CallerIDName --> 1111
!     ConnectedLineNum --> 4957777
!    ConnectedLineName --> 4957777
!                Cause --> 16
!            Cause-txt --> Normal Clearing

</spoiler>

Настроим автозагрузку asteriskLogger.php

  wget https://raw.github.com/blak3r/yaai/master/misc/asterisk_logger
  mv asterisk_logger /etc/init.d/

  chmod 755 /etc/init.d/asterisk_logger

  chmod 755 /etc/init.d/functions

Отредактируем asterisk_logger

 nano +34  /etc/init.d/asterisk_logger

заменим: . /lib/lsb/init-functions

на: /etc/init.d/functions

проверим:

 /etc/init.d/asterisk_logger start

Если нет ошибок, включим автозагрузку:

 chkconfig --add asterisk_logger
 chkconfig asterisk_logger on

Всплывающее окно SugarCRM

Viewing all 1132 articles
Browse latest View live




Latest Images