VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Проблемы Asterisk без вэб-оболочек и их решения

Модераторы: april22, Zavr2008

Ответить
Devel0per
Сообщения: 6
Зарегистрирован: 27 июн 2022, 18:27

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

Сообщение Devel0per »

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

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

С уважением и заранее благодарю за ответы!!!!!!!
gosha
Сообщения: 375
Зарегистрирован: 06 сен 2010, 17:41
Контактная информация:

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

Сообщение gosha »

Добавить в Dial ключик g

Следом за Dial ставить переменную, например WhoTerm=DST
ded
Сообщения: 15622
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение 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)
в том же контексте.
Аватара пользователя
Zavr2008
Сообщения: 2211
Зарегистрирован: 27 янв 2011, 00:35
Контактная информация:

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

Сообщение Zavr2008 »

Еще есть вариант слушать AMI событие Hangup: https://wiki.asterisk.org/wiki/display/ ... ion_Hangup
Но это уже кому как удобнее.
Российские E1 шлюзы Alvis. Модернизация УПАТС с E1,Подключение к ИС "Антифрод" E1 PRI/SS#7 УВР Телестор, Грифин и др..
Devel0per
Сообщения: 6
Зарегистрирован: 27 июн 2022, 18:27

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

Сообщение 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;
На этом все!
Devel0per
Сообщения: 6
Зарегистрирован: 27 июн 2022, 18:27

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

Сообщение 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
Ответить
© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH