Страница 1 из 1

SIP BYE direction. Определить кто первым повесил трубку.

СообщениеДобавлено: 27 июн 2022, 19:34
Devel0per
Добрый день, уважаемый All.
Вопрос в том, как из Астериска получить хотя-бы направление пакета SIP BYE, я уже не говорю о полях этого пакета.
Нам нужно для проекта 100% знать кто первым положил трубку оператор или пользователь.
Я долго-долго смотрел Гугл на тему Hangupcause переменной канала, хорошо, обработчик по этому вызову я сделал, он простой (если код 16, то продолжаем анализ Hangup инцидента, если другой код, то выполняем альтернативный тред диалплана\конфига).

Но вот что сделать с пакетом SIP BYE я так и не нашёл, у меня приходит идея сделать sngrep, просто вынуть из исходников тред, который отвечает за пакет sip bye и привязать SIP Line ID, сделать отдельный тредик уже внутри исходников Астериск. Неужели это по-другому не решается?

С уважением и заранее благодарю за ответы!!!!!!!

Re: SIP BYE direction. Определить кто первым повесил трубку.

СообщениеДобавлено: 27 июн 2022, 22:56
gosha
Добавить в Dial ключик g

Следом за Dial ставить переменную, например WhoTerm=DST

Re: SIP BYE direction. Определить кто первым повесил трубку.

СообщениеДобавлено: 28 июн 2022, 02:22
ded
g: Proceed with dialplan execution at the next priority in the current extension if the destination channel hangs up.

exten => _X.,1,Dial(SIP/trunk/${EXTEN},,g)
same => n,Set(WhoTerm=DST)
same => n,Hangup(16)
А если трубку вешает оригинатор (source channel hangs up) то переход на следующий приоритет где WhoTerm=DST не произойдёт.
Добавить обработку - заполнение переменной на
exten => h,1,Set(WhoTerm=SRC)
exten => h,n,Hangup(16)
в том же контексте.

Re: SIP BYE direction. Определить кто первым повесил трубку.

СообщениеДобавлено: 28 июн 2022, 12:54
Zavr2008
Еще есть вариант слушать AMI событие Hangup: https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+ManagerAction_Hangup
Но это уже кому как удобнее.

Re: SIP BYE direction. Определить кто первым повесил трубку.

СообщениеДобавлено: 29 июн 2022, 01:27
Devel0per
Благодарю Вас за ответы!
Мне понравилось решение с этой странички: https://vk.com/@mindsellers-kto-povesil-trubku
Отредактируем файл /etc/asterisk/extensions_override_freepbx.conf и внесем в него следующий контекст:

[macro-hangupcall]
include => macro-hangupcall-custom
exten => s,1(start),GotoIf($["${USE_CONFIRMATION}"="" | "${RINGGROUP_INDEX}"="" | "${CHANNEL}"!="${UNIQCHAN}"]?theend)
exten => s,n,Noop([TRACE](3) Cleaning Up Confirmation Flag: RG/${RINGGROUP_INDEX}/${CHANNEL})
exten => s,n(delrgi),Noop(Deleting: RG/${RINGGROUP_INDEX}/${CHANNEL} ${DB_DELETE(RG/${RINGGROUP_INDEX}/${CHANNEL})})
exten => s,n(theend),ExecIf($["${ONETOUCH_RECFILE}"!="" & "${CDR(recordingfile)}"=""]?Set(CDR(recordingfile)=${ONETOUCH_RECFILE}))
exten => s,n,ExecIf($[${CHANNEL} = ${CHANNEL(hangupsource)}]?Set(HANGUPSOURCE=caller):Set(HANGUPSOURCE=called))
exten => s,n,Set(CDR(hangupsource)=${HANGUPSOURCE})
exten => s,n,Hangup
exten => s,n,MacroExit()

Тем самым мы переопределили макрос, выполняемый при завершении любого звонка. Добавлено две строки:

exten => s,n,ExecIf($[${CHANNEL} = ${CHANNEL(hangupsource)}]?Set(HANGUPSOURCE=caller):Set(HANGUPSOURCE=called))
exten => s,n,Set(CDR(hangupsource)=${HANGUPSOURCE})

В первой мы сравниваем имя канала-инициатора вызова с именем канала, который инициировал разрыв связи и первым попрощался. Во второй - заносим эти данные в CDR. Естественно, перед тем, как писать таблицу значения, было бы неплохо сначала создать этот столбец:

mysql> ALTER TABLE asteriskcdrdb.cdr ADD hangupsource VARCHAR(10) NULL;
На этом все!

Re: SIP BYE direction. Определить кто первым повесил трубку.

СообщениеДобавлено: 29 июн 2022, 11:35
Devel0per
У меня заработала корректно только такая строчка:
exten => s,n,ExecIf($["${CHANNEL}" = "${CHANNEL(hangupsource)}"]?Set(HANGUPSOURCE=caller):Set(HANGUPSOURCE=called))

Иначе ...

[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1495 op_div: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1375 op_negate: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1375 op_negate: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1353 op_minus: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1353 op_minus: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.fl:470 ast_yyerror: ast_yyerror(): syntax error: syntax error, unexpected $end, expecting '-' or '!' or '(' or '<token>'; Input:
PJSIP/***PBX---PJSIP---**PBX-0000059e =
^
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.fl:474 ast_yyerror: If you have questions, please refer to https://wiki.asterisk.org/wiki/display/ ... +Variables
-- Executing [s@macro-hangupcall:11] ExecIf("PJSIP/***PBX---PJSIP---CC-PBX-0000059e", "0?Set(HANGUPSOURCE=caller):Set(HANGUPSOURCE=called)") in new stack
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1495 op_div: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1375 op_negate: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1375 op_negate: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1353 op_minus: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.y:1353 op_minus: non-numeric argument
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.fl:470 ast_yyerror: ast_yyerror(): syntax error: syntax error, unexpected $end, expecting '-' or '!' or '(' or '<token>'; Input:
PJSIP/***PBX---PJSIP---CC-PBX-0000059e =
^
[2022-06-29 00:30:33] WARNING[18171][C-000005f6]: ast_expr2.fl:474 ast_yyerror: If you have questions, please refer to https://wiki.asterisk.org/wiki/display/ ... +Variables