LINUX.ORG.RU
решено ФорумAdmin

Asterisk, продолжительность диалогов

 


0

1

Всем привет!

Сейчас пишутся логи в CDR, а далее они передаются в Postgresql.

С входящими звонками ловлю нежелательное для меня поведение:
Если на входящий exten стоит голосовое приветствие - ну там, например, играет Background(), то я уже не могу понять реальное время звонка по billsec и duration в CDR. Это все оттого, что Background (Playback c опцией noanswer не подходит, мой канал такое не поддерживает) поднимает трубку и в нее играет свое аудио.

Поля duration и billsec в CDR оказались только на чтение, и их изменить нельзя. Как же определить общее время звонка и время диалога в таком случае?



Последнее исправление: Aborigen1020 (всего исправлений: 1)

Везде рекомендуется использование queue_log. Там есть, действительно, нужные мне события, однако какие переменные отвечают, например, за время всего диалога? Тут - 18

1570092374|1570092356.356|testqueue|NONE|ABANDON|1|1|18

Я бы их тогда писал в свое поле, и подставлял в CDR. Правда, я слабо себе это представляю, без умножения строк на одно событие. Искать строку по uniqid, и в ней обновлять свое поле? Что будет с postgresql через 10000 звонков? а через 100000? Поиск может занимать много времени в этом случае.

Aborigen1020
() автор топика

Можно прямо в диалплане запомнинать ${EPOCH} в контрольных точках, и в конце звонка писать их разницу в отдельное поле CDR через Set(CDR(myfield)=...)

paganmind
()
Ответ на: комментарий от paganmind

Я может чего неправильно делаю?

exten => 9999999999,n,NoOp(Logging time)
exten => 9999999999,n,Set(START_DIALOG=${EPOCH})
exten => 9999999999,n,Queue(testqueue,ct,,,20)
exten => 9999999999,n,Set(END_DIALOG=${EPOCH})
exten => 9999999999,n,Set(TOTAL_TIME=$[${END_DIALOG}-${START_DIALOG}])
exten => 9999999999,n,Set(CDR(userfield)=$[${TOTAL_TIME}])
И получаю в CDR две строки
dialplan | SIP/channel-00000076 |  | Set     | CDR(userfield)=28             0 |       0 | ANSWERED    |        3 |        
dialplan | SIP/channel-00000076 | SIP/2072-00000077 | Queue  | testqueue,ct,,,20    36 |      36 | ANSWERED  |  3 |             
Как вставлять мое поле в текущую запись, а не создавать новую? Типа QueueMacro(testqueue,ct,,,20,Macroname) ?

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

Да и срабатывает это все, если оператор первый положил трубку, если абонент положил трубку, то ничего уже не происходит

Aborigen1020
() автор топика
Ответ на: комментарий от paganmind

Спасибо!
До этого так и не понимал, как его использовать.

Только я не очень понимаю, почему это распространяется и на другие контексты?

Это же получается, общий контекст, как его ограничить к определенному экстеншену?

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

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

ограничить - выделить в отдельный контекст.

paganmind
()
Последнее исправление: paganmind (всего исправлений: 1)
Ответ на: комментарий от Aborigen1020

Получаю ошибку в логах

WARNING[11107][C-00000001]: ast_expr2.fl:470 ast_yyerror: ast_yyerror():  syntax error: syntax error, unexpected $end, expecting '-' or '!' or '(' or '<token>'; Input:
1570104917-
Интересненько

Aborigen1020
() автор топика
Ответ на: комментарий от paganmind

У меня вот почему-то по-другому.

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

[ Context 'Big_dialplan' created by 'pbx_config' ]
  Include =>        'Incoming_Local'                         [pbx_config]
  Include =>        'Outgoing_Local'                         [pbx_config]
  Include =>        'Incoming_Gsm'                           [pbx_config]
  Include =>        'Outgoing_Gsm'                           [pbx_config]
  Include =>        'Incoming_Iax'                           [pbx_config]
  Include =>        'Outgoing_Iax'                           [pbx_config]
  Include =>        'test_ext'                               [pbx_config]

Вот например сделал

[ Context 'Incoming_Gsm' created by 'pbx_config' ]
 '99999999999' =>   1. NoOp()                                      [extensions_name.conf:99]
                    2. Playback(audiofile)                         [extensions_name.conf:100]
                    3. NoOp(Logging time)                          [extensions_name.conf:101]
                    4. Set(START_DIALOG=${EPOCH})                  [extensions_name.conf:102]
                    5. Queue(testqueue,ct,,,20)                    [extensions_name.conf:103]
'h' =>              1. Set(TOTAL_TIME=$[${EPOCH}-${START_DIALOG}]) [extensions_name.conf:104]
                    2. Set(CDR(userfield)=$[${TOTAL_TIME}])        [extensions_name.conf:105]
                    3. Set(CDR(queue_stat)=${QUEUESTATUS})         [extensions_name.conf:106]

При этом звонки в Incoming_Local делаются с этой же проверкой.

Aborigen1020
() автор топика
Ответ на: комментарий от paganmind

Все, понял, у меня клиенты звонят в контексте

Big_dialplan
, а он уже включил в себя контекст h

Aborigen1020
() автор топика
Ответ на: комментарий от paganmind

А не могли бы вы подсказать самое интересное - как отловить событие, когда агент поднимает трубку?
Это для того, чтобы определить время этого события. Я в DumpChan глянул, там нельзя понять время, в которое агент поднял трубку. При этом все переменные для информации по очереди включил:

setinterfacevar=yes
setqueuevar=yes
setqueueentryvar=yes

Aborigen1020
() автор топика
Ответ на: комментарий от paganmind

Все-таки в контексте или в макросе?
Полагаю, что это макрос-контекст, однако у меня в нем событие h не отрабатывает, только s. Просто не идет по тем шагам в макросе, при отбое с любой стороны

Aborigen1020
() автор топика
Последнее исправление: Aborigen1020 (всего исправлений: 1)
Ответ на: комментарий от paganmind

Разве нельзя обработать эти два события в одном макросе?

exten => 9999999999,n,Queue(testqueue,ct,,,20,,test_ext,,s,1)

[macro-test_ext]
exten => s,1,Set(START_DIALOG=${EPOCH})
exten => h,1,Set(TOTAL_TIME=$[${EPOCH}-${START_DIALOG}])
        same => n,Set(CDR(userfield)=$[${TOTAL_TIME}])
        same => n,Set(CDR(ea_queue_stat)=${QUEUESTATUS})

Выход из очереди получается молчаливым

Aborigen1020
() автор топика
Ответ на: комментарий от Aborigen1020

Короче, победил.

exten => 99999999999,n,Queue(testqueue,ct,,,20,,queueanswer,s,1)
[macro-queueanswer]
exten => s,1,Set(__START_DIALOG=${EPOCH})
        same => n,Set(CHANNEL(hangup_handler_push)=math_dial,s,1)       ; Если ответили в очереди, то конец диалога обрабатывается hangup_handler с переходом в math_dial
;
[math_dial]
exten => s,1,Set(TOTAL_TIME=$[${EPOCH}-${START_DIALOG}])
        same => n,Set(CDR(some_columns)=$[${TOTAL_TIME}])
        same => n,Set(CHANNEL(hangup_handler_wipe)=)
        same => n,Return
        same => n,Hangup()

Теперь могу смотреть в CDR, сколько был диалог с момента ответа оператором и до конца диалога (с любой из сторон делает завершение звонка). Ну и конечно Playback() играет, и с помощью ResetCDR(w) в CDR не учитывается время Playback. Спасибо, paganmind

Aborigen1020
() автор топика
Последнее исправление: Aborigen1020 (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.