ВидеоКонф(ВКС)  ::   Чат  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

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

Проблемы и их решения Asterisk как такового

Модератор: april22

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

Сообщение Devel0per » 27 июн 2022, 19:34

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

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

С уважением и заранее благодарю за ответы!!!!!!!
Devel0per
 
Сообщений: 4
Зарегистрирован: 27 июн 2022, 19:27

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

Сообщение gosha » 27 июн 2022, 22:56

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

Следом за Dial ставить переменную, например WhoTerm=DST
gosha
 
Сообщений: 367
Зарегистрирован: 06 сен 2010, 17:41

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

Сообщение ded » 28 июн 2022, 02:22

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)
в том же контексте.
ded
 
Сообщений: 15312
Зарегистрирован: 26 авг 2010, 19:00

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

Сообщение Zavr2008 » 28 июн 2022, 12:54

Еще есть вариант слушать AMI событие Hangup: https://wiki.asterisk.org/wiki/display/AST/Asterisk+11+ManagerAction_Hangup
Но это уже кому как удобнее.
Российские шлюзы E1 Alvis-GW. Voip-Модернизация УПАТС, FreePBX, CRM. Продолжаем работать, импортозамещаем!
Аватар пользователя
Zavr2008
 
Сообщений: 1969
Зарегистрирован: 27 янв 2011, 01:35

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

Сообщение Devel0per » 29 июн 2022, 01:27

Благодарю Вас за ответы!
Мне понравилось решение с этой странички: 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
 
Сообщений: 4
Зарегистрирован: 27 июн 2022, 19:27

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

Сообщение Devel0per » 29 июн 2022, 11:35

У меня заработала корректно только такая строчка:
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
Devel0per
 
Сообщений: 4
Зарегистрирован: 27 июн 2022, 19:27


Вернуться в Конфигурация и настройка Asterisk

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

cron
© 2008 — 2022 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH