2012-06-24 2 views
2

У меня есть собственная база данных для регистрации вызовов в astreisk. Мне нужно вставить длительность вызова каждого вызова в таблицу. Как я могу это сделать? Могу ли я сделать это в своем диалплане?Как вставить длительность звонка Asterisk в мою собственную базу данных?

ответ

7

Вы не даете много информации о том, какой бэкэнд db вы хотели бы использовать, а также если вы спрашиваете, как написать себе продолжительность звонка или как настроить звездочку для записи рассматриваемого cdr.

Итак, обычно говоря, у вас есть 3 возможных варианта этого (см. Ниже). Для опций и вам необходимо открыть соединение с базой данных самостоятельно, написать запросы, необходимые для вставки/обновления любых строк (строк), обработки ошибок и т. Д. Хотя для опции вам просто нужно для настройки звездочки для выполнения задания.

1) Asterisk может сделать это по умолчанию самостоятельно, путем записи CDR (Call Detail Record) каждого вызова на бэкэнд. Этот бэкэнд может быть csv, mysql, pgsql, sqlite и другими базами данных через модуль cdr_odbc. Вы должны настроить ваш cdr.conf (и в зависимости от внутреннего интерфейса, который вы выбрали, cdr_mysql.conf, cdr_odbc.conf, cdr_pgsql.conf с вашей информацией бэкэнд, как учетные данные, имена таблиц и т.д.).

ЦХД будет записана по умолчанию с некоторыми содержимым, которые являются CDR переменные (взятые из the predefined asterisk variable list)

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

Те интересные для вас в этот момент будет:

${CDR(duration)}  Duration of the call. 
${CDR(billsec)} Duration of the call once it was answered. 
${CDR(disposition)} ANSWERED, NO ANSWER, BUSY 

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

2) Если, с другой стороны, если вы не спрашиваете о корде, но хотите, чтобы написать продолжительность вызова, вы можете иметь AGI скрипт, который после выдачи dial(), считывающего CDR (billsec) переменная или ANSWEREDTIME (устанавливается командой Dial()):

${DIALEDTIME} * Time for the call (seconds) 
${ANSWEREDTIME} * Time from dial to answer (seconds) 

3) Вы также можете достичь того же результата, имеющего AMI клиент для прослушивания события Varset для переменной ANSWE REDTIME. Соответствующее событие будет содержать канал, для которого эта переменная установлена.

Итак, варианты 2 и 3, безусловно, более полезны, если у вас уже есть сценарий AGI или клиент AMI ваших собственных контрольных/обрабатывающих вызовов, а вариант 1 более общий, но, возможно, немного менее гибкий.

Надеюсь, это поможет!

+0

Прошу прощения за то, что я не дал достаточно информации. Вариант 2 и 3 - это то, что мне нужно. Но у меня есть вопрос: возможно ли получить доступ к ANSWEREDTIME в диалплане? – Karadous

+0

@ Karadous Конечно. См .: http://www.voip-info.org/wiki/view/Asterisk+variables. Поэтому просто используйте $ {ANSWEREDTIME} и (возможно) используйте параметр g команды набора. – marcelog

+0

Очень хороший ответ. Для полноты использования, для опции (1), вы можете указать cdr_adaptive_odbc вместо cdr_odbc, что более гибко для пользовательских данных. –

Смежные вопросы