Как сохранить ID удаленной стороны в CDR в Asterisk?

Я новичок в Asterisk, поэтому любая помощь будет принята с благодарностью.

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

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

Вот как проходит передача:

  1. A звонит B (A разговаривает с B)
  2. B держит A и звонит C (B разговаривает с C)
  3. B переводит A в C (A разговаривает с C)

Теперь в таблице CDR я получаю две записи. Один для первого вызова (A‹->B), а другой для двух вторых вызовов (B‹->C и A‹->C). Дело в том, что во втором CDR я потерял любую ссылку на A.

Я хочу сохранить идентификатор удаленной стороны (A) во втором CDR. Я уже добавил пользовательское поле в таблицу CDR (connectedID).

Я читаю о редактировании некоторых файлов конфигурации, добавляя такие предложения:

"exten => s,1,set(CDR(connectedID)=${CONNECTEDLINE})"

Однако я совсем запутался. Я не знаю, какой файл мне нужно отредактировать, даже в какую часть файла я должен поместить эти строки кода.

Может ли кто-нибудь указать мне в правильном направлении?


person ejuanillo    schedule 15.01.2015    source источник


Ответы (2)


Вы можете использовать Func_SHARED, сохранить cid в общих переменных и выполнить поиск по имени мостового канала.

Однако все это требует отладки и ваших собственных усилий.

http://www.voip-info.org/wiki/view/Asterisk+func+shared

Другой вариант — собирать события и запоминать все переводы.

person arheops    schedule 15.01.2015
comment
В сопровождаемых передачах у меня нет значения перекрестной ссылки, которое я мог бы использовать для отслеживания двух частей звонка (у меня есть 4 разных канала, по 2 для каждого сегмента звонка). Возможно, так работают мои телефоны. Однако я думаю, что Func_SHARED - правильный подход для достижения того, о чем я просил (в надлежащей среде). - person ejuanillo; 19.01.2015
comment
Вы можете читать события через AMI, события будут связываться/отсоединяться (более 1 для переноса участников), которые можно использовать для определения результата. - person arheops; 19.01.2015
comment
Спасибо @arheops, я попробую подход к событиям AMI. - person ejuanillo; 19.01.2015

Чтение событий вызовов через AMI (спасибо @arheops) мне удалось сохранить идентификатор удаленной стороны в CDR.

В событии hangup мы видим ID удаленной стороны в поле ConnectedLineNum.

Для переадресованного вызова, подобного этому:

  • 401 звонок 208
  • 208 звонков 308 (401 на удержании)
  • 208 переводит исходный вызов на 308 (401 разговаривает с 308)

это образец события hangup для последнего сегмента звонка.

Event Hangup Privilege: call,all Channel: SIP/308-00000665 Uniqueid: 1421757614.1658 CallerIDNum: 208 CallerIDName: Juan Ruiz ConnectedLineNum: 401 ConnectedLineName: Test1 Cause: 16 Cause-txt: Normal Clearing

Исходный вызывающий абонент хранится в переменной ConnectedLineNum.

Поэтому я добавляю эту строку в раздел зависания:

exten => s,1,Set(CDR(connectedid)=${CONNECTEDLINE(number)})

Я использую Elastix 2.4.0, поэтому я добавил эту строку в начало макроса [macro-hangupcall] в файле extensions_override_elastix.conf.

В других дистрибутивах на основе Asterisk он должен быть в другом файле.

person ejuanillo    schedule 20.01.2015