По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
Channel event logging (события на канале) – система, созданная для детального логирования телефонных событий. Система CEL позволяет пошагово отслеживать сложные сценарии вызовов, последовательно записывая их в таблицу данных. Сегодня расскажем о типах событий CEL и о содержимом таблицы ‘cel’
?
Как и обычно, подключаемся к базе данных asteriskcdrdb:
[root@asterisk]# mysql // подключаемся к MySQL
mysql> use asteriskcdrdb;
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
Смотрим содержимое таблица cel, видим поля и типы данных:
mysql> show columns from cel;
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| eventtype | varchar(30) | NO | | NULL | |
| eventtime | datetime | NO | | NULL | |
| cid_name | varchar(80) | NO | | NULL | |
| cid_num | varchar(80) | NO | | NULL | |
| cid_ani | varchar(80) | NO | | NULL | |
| cid_rdnis | varchar(80) | NO | | NULL | |
| cid_dnid | varchar(80) | NO | | NULL | |
| exten | varchar(80) | NO | | NULL | |
| context | varchar(80) | NO | MUL | NULL | |
| channame | varchar(80) | NO | | NULL | |
| appname | varchar(80) | NO | | NULL | |
| appdata | varchar(80) | NO | | NULL | |
| amaflags | int(11) | NO | | NULL | |
| accountcode | varchar(20) | NO | | NULL | |
| uniqueid | varchar(32) | NO | MUL | NULL | |
| linkedid | varchar(32) | NO | MUL | NULL | |
| peer | varchar(80) | NO | | NULL | |
| userdeftype | varchar(255) | NO | | NULL | |
| extra | varchar(512) | NO | | NULL | |
+-------------+--------------+------+-----+---------+----------------+
20 rows in set (0.00 sec)
К описанию таблицы CEL мы вернемся чуть позже, а сейчас давайте разберем возможные события в рамках системы Channel Event Logging :
Событие
Описание
CHAN_START
Канал связи был создан
CHAN_END
Канал связи был разорван
LINKEDID_END
Канал связи с указанным ID был разорван
ANSWER
На созданном канале связи ответили на звонок. При звонке в город, данное событие генерируется когда удаленный (вызываемый абонент) поднимет трубку
HANGUP
Была повешена трубка. Как правило, это событие сразу же сопровождается событием CHAN_END. Разница в том, что HANGUP происходит когда трубка положена, а CHAN_END, когда Asterisk освободил все ресурсы, занимаемые этим каналом
APP_START
Определенное приложение было запущено для этого канала. Например, это может быть Dial, Busy или Congestion
APP_END
Указанное приложение в событие APP_START завершило свое выполнение
PARK_START
Была произведена «Парковка» вызова. Функция парковки, представляет собой определенный номер, в который помещается вызов, работу с которым, могут продолжить другие сотрудники.
PARK_END
Вызов был снят с «Парковки»
BRIDGE_START
Между двумя каналами образовалось соединение (мост). Данное событие сопровождает такие приложения, как Dial() или Queue()
BRIDGE_END
Мост между каналами был разрушен
BRIDGE_UPDATE
В соединении между каналами произошло обновление. Это события появляется тогда, например, если изменится имя или прочая канальная информация
BLINDTRANSFER
Был выполнен «слепой» (без предварительной консультации) трансфер
ATTENDEDTRANSFER
На канале был выполнен трансфер с предварительной консультацией
USER_DEFINED
Кастомное событие, которое определяется в приложении CELGenUserEvent()
В таблице выше мы перечислили основные события в рамках системы CEL. Теперь перейдем к описанию таблицы ‘cel’ в рамках базы asteriskcdrdb:
Столбец
Пример значения
Описание
eventtype
CHAN_START
Имя произошедшего события (все события описаны в таблице выше)
eventtime
2016-04-01 14:53:54
Время, в которое произошло указанное выше событие
cidname
Oleg Ivanov
Имя, передаваемое в рамках CallerID (CID), закрепленное за данным каналом
cidnum
84991111111
Номер, передаваемый в рамках CallerID (CID), закрепленный за данным каналом в рамках соответствующего события
cidani
84991111111
Automatic Number Identification (ANI), или другими словами – автоматическое определение номера на данном канале в рамках соответствующего события
cidrdnis
84991111234
Номер перенаправления на данном канале в рамках соответствующего события
ciddnid
84993456458
Набранный номер на канале в рамках соответствующего события
exten
7057
Добавочный номер, который был набран, в рамках плана нумерации
context
Local
Контекст для добавочного номера, который был набран
channame
SIP/0007B3060EB4-00000010
Имя установленного канала
appname
Dial
Название приложения, которое было выполнено
appdata
SIP/0007B3060EB4
Параметры, которые были переданы в приложении согласно плана нумерации
amaflags
DOCUMENTATION
Метка Automatic Message Accounting (AMA) – автоматический учет стоимости вызова.
accountcode
6473
Идентификатор аккаунта. Данное значение пустое по умолчанию, и определяется параметрами конкретного пользователя.
uniqueid
6547653456.18332
Уникальный идентификатор для канала
userfield
Chto ugodno
Пользовательское поле
linkedid
6547653456.18332
Данный идентификатор, позволяет связать воедино звонок по частям. Например, если одна часть звонка была входящей из города, следом был трансфер, потом еще один – у все этих вызовов будет разный uniqueid, но одинаковый linkedid
peer
SIP/0007B306054F-00000020
Название канала, к которому, который соединен (bridge) с каналом с идентификатором channame
Теперь, давайте рассмотрим как выглядит запись в таблице ‘cel’. Для этого выполним нижеследующий запрос к базе данных asteriskcdrdb:
mysql> SELECT * FROM `cel` WHERE `uniqueid` = '1459503113.15';
+------+------------+---------------------+-------------+-------------+-------------+-----------+----------+-------------+------------------+--------------------------------------------+------------+----------------------------------------------------------------------------------+----------+-------------+---------------+---------------+------+-------------+----------------------------------------------------------------------------+
| id | eventtype | eventtime | cid_name | cid_num | cid_ani | cid_rdnis | cid_dnid | exten | context | channame | appname | appdata | amaflags | accountcode | uniqueid | linkedid | peer | userdeftype | extra |
+------+------------+---------------------+-------------+-------------+-------------+-----------+----------+-------------+------------------+--------------------------------------------+------------+----------------------------------------------------------------------------------+----------+-------------+---------------+---------------+------+-------------+----------------------------------------------------------------------------+
| 2339 | CHAN_START | 2016-04-01 12:31:53 | | | | | | 89641111111 | from-internal | Local/89641111111@from-internal-00000004;2 | | | 3 | | 1459503113.15 | 1459503090.11 | | | |
| 2346 | APP_START | 2016-04-01 12:31:53 | 79252222222 | 79252222222 | 79252222222 | | | recordcheck | sub-record-check | Local/89641111111@from-internal-00000004;2 | MixMonitor | 2016/04/01/out-89641111111-79252222222-20160401-123153-1459503113.15.wav,ai(LOCA | 3 | | 1459503113.15 | 1459503090.11 | | | |
| 2347 | APP_END | 2016-04-01 12:31:53 | 79252222222 | 79252222222 | 79252222222 | | | recordcheck | sub-record-check | Local/89641111111@from-internal-00000004;2 | MixMonitor | 2016/04/01/out-89641111111-79252222222-20160401-123153-1459503113.15.wav,ai(LOCA | 3 | | 1459503113.15 | 1459503090.11 | | | |
| 2364 | HANGUP | 2016-04-01 12:32:10 | | 79252222222 | 79252222222 | | | h | from-internal | Local/89641111111@from-internal-00000004;2 | | | 3 | | 1459503113.15 | 1459503090.11 | | | {"dialstatus":"CANCEL","hangupcause":16,"hangupsource":"dialplan/builtin"} |
| 2365 | CHAN_END | 2016-04-01 12:32:10 | | 79252222222 | 79252222222 | | | h | from-internal | Local/89641111111@from-internal-00000004;2 | | | 3 | | 1459503113.15 | 1459503090.11 | | | |
+------+------------+---------------------+-------------+-------------+-------------+-----------+----------+-------------+------------------+--------------------------------------------+------------+----------------------------------------------------------------------------------+----------+-------------+---------------+---------------+------+-------------+----------------------------------------------------------------------------+
5 rows in set (0.00 sec)
В указанном выше запросе мы извлекли все содержимое таблицы ‘cel’, где поле uniqueid = 1459503113.15. Полученные данные можно обрабатывать и использовать для глубокой аналитики
Мы продолжаем постигать основы важнейшего протокола, использующегося в IP телефонии и в сегодняшней статье рассмотрим основные сценарии установления соединения, а также работу основных компонентов протокола SIP. Протокол SIP имеет 3 стандартных сценария установления соединения, которые отличаются наличием и участием тех или и иных устройств.
Пример №1
Установление соединения между User Agent’ами, когда в сети отсутствуют всякого рода серверы. Простейшим примером является сеанс связи, в котором принимают участие только два пользователя. Терминальное оконечное оборудование называется UA (User Agent), когда одновременно совмещает в себе функции UAС (User Agent Client) - клиента и UAS (User Agent Server) - сервера. В данном случае сценарий установления соединения будет выглядеть так: .
Абонент A снимает телефонную трубку и набирает номер Абонента B, тем самым генерируя запрос INVITE , который содержит описание сеанса связи.
Устройство абонента B отвечает сообщением 100 Trying , которое означает, что запрос находится в обработке.
После обработки запроса устройство абонента B уведомляет его о входящем вызове, а в сторону абонента A отвечает сообщением 180 Ringing, что соответствует контролю посылки вызова.
Абонент B снимает телефонную трубку, отвечая сообщением 200 OK, означающее успешную обработку запроса.
Устройство абонента A прекращает прием контроля посылки вызова и посылает подтверждение ACK, означающее прием ответа на запрос INVITE.
Между абонентами устанавливается разговорная фаза. Происходит передача голосового трафика по протоколу RTP (Real-Time Transfer Protocol).
Важно отметить, что SIP не участвует в непосредственной передаче голоса, а лишь предоставляет условия и способы согласования открытия неких каналов обмена на основе других протоколов, в данном случае - RTP.
Абонент A кладет телефонную трубку, тем самым инициируя завершение передачи голосового потока. Устройство абонента A генерирует запрос Bye, в сторону устройства абонента B.
Устройство абонента B отвечает сообщением 200 OK, означающем успешную обработку запроса Bye.
Терминальное оконечное оборудование абонентов A и B возвращается в исходное состояние.
Однако, данный сценарий установления соединения является самым примитивным, можно даже сказать частным. Обычно в сети присутствует SIP прокси сервер, который принимает и обрабатывает запросы от пользователей и выполняет, соответствующие этим запросам, действия.
Пример №2
Рассмотрим сценарий установления соединения между двумя пользователями.
В данном случае задачу поиска и приглашения абонента выполняет Прокси сервер, вызывающему пользователю необходимо знать только постоянный номер вызываемого абонента. Отметим, что функции прокси сервера выполняет офисная телефонная станция
Как видно из рисунка, процесс установления и разъединения соединения происходит аналогично первому сценарию, только в качестве посредника при передаче сообщений протокола SIP выступает SIP Proxy.
Пример №3
Допустим, что в сети имеется множество пользователей, число которых постоянно пополняется. Они могут менять свое фактическое положение, ставить переадресацию (redirection) на другой номер, проводить конференц – звонки и др. Для предоставления подобных сервисов требуется наличие в сети соответствующих серверов, поддерживающих ту или иную функцию.
Сервер регистрации (Registration Server) для аутентификации и авторизации пользователей.
Сервер определения местоположения (Allocation Server) для определения реального местонахождения пользователей.
Сервер переадресации (Redirect Server) для перенаправления звонков на другие номера, в случае если пользователь настроил данную функцию.
Сервер регистрации это логический элемент и обычно его функции выполняет SIP Proxy, такие совмещенные сервера называют Registar. SIP Proxy может также выполнять функции серверов определения местоположения и переадресации, такое совмещение полезно в плане масштабируемости сети.
Приведем пример, когда сеть содержит некий комбинированный SIP Proxy, который поддерживает все функции, описанные выше. Допустим, что новый, еще не зарегистрированный пользователь A,вызывает пользователя B, который уже прошел процедуру авторизации.
Новый User Agent A посылает серверу сообщение REGISTER , которое инициирует процесс регистрации.
Т.к User Agent A ещё не зарегистрирован, то сервер Registar отвечает сообщением 401 Unauthorized
Тогда User Agent A посылает серверу сообщение REGISTER + login, содержащее логин и пароль.
Сервер Registar отвечает сообщением 200 OK, на этом процесс регистрации закончен. Теперь пользователь А авторизован на сервере и может совершать звонки.
User Agent A инициирует установление связи с пользователем B сообщением INVITE.
На данном этапе включаются функции серверов определения местоположения и переадресации, сервер отвечает сообщением 302 Moved Temporarily, означающее, что вызываемый абонент временно сменил местоположение и содержащее его новые данные для установления соединения.
User Agent A отвечает сообщением ACK, которое означает прием ответа от Redirect сервера на запрос INVITE.
Далее User Agent A инициирует новое установление соединения напрямую к пользователю B, в соответствии с полученными данными.
Как видно из рисунка дальнейший процесс соединения происходит аналогично сценарию 1.
В следующей статье мы подробно рассмотрим основные модификации протокола SIP для взаимодействия с традиционными телефонными сетями, использующими сигнализацию ОКС-7.
В этой статье я расскажу как за 5 минут сделать простой AUTODIAL для FreeSWITCH.
Нам потребуется текстовый файл с номерами, которые должны быть записаны построчно;
Простенький Lua-скрипт.
Начнем. Создаем текстовый файл Test.txt. В него для теста пишем внутренние номера абонентов FS:
1000
1001
1002
Сохраняем его в папку по адресу, к примеру /usr/local/freeswitch/scripts/Test.txt. Далее нужно написать Lua-скрипт с названием autodial.lua с примерно таким содержанием:
local file = io.open("/usr/local/freeswitch/scripts/Test.txt", "r");
local legB = "loopback/9174";
local timeout = "25";
for line in file:lines() do
print(line);
session1 = freeswitch.Session("{origination_caller_id_name=Call 9174, origination_caller_id_number=9174, call_timeout=".. timeout .."}user/".. line .."");
session2 = freeswitch.Session("{origination_caller_id_number=".. line .."}".. legB .."");
freeswitch.msleep(1000);
freeswitch.bridge(session1, session2);
end
На номере 9174 у нас играет музыка "Европа +" :) Вы же можете маршрутизировать куда угодно. Заходим в CLI FS командой: fs_cli -rRS и запускаем наш Lua-скрипт командой:
luarun autodial.lua
Радуемся. Автообзвон на FreeSWITCH начал прозванивать номера по списку из файла и соединять с нужным номером :)