
Алексей
17.12.2017
09:14:03
Для макроса можно задавать внешнюю переменную
согласен!
можно использовать SHARED, GLOBAL, вывод внешней переменной в return(и то либо массивом либо всего одну), можно использовать astdb или mysql. но зачем сложнгости...... если в gosub ты просто можешь ее назначить

Saint
17.12.2017
09:23:14

Алексей
17.12.2017
09:24:52

Saint
17.12.2017
09:25:22

Google

SilverJoe
17.12.2017
09:31:31

Saint
17.12.2017
09:33:50
Логи смотрел при звонке, вообще вызова макроса этого нет

Алексей
17.12.2017
09:36:54
вызова макроса нет.....
попробуй в extensions_custom.conf вместо инклуда вызвать так
exten => _X.,1,macro(dialout-one-predial-hook)

Saint
17.12.2017
09:38:59

Алексей
17.12.2017
09:39:05
шу шаблон номера под свои внутренние поправь только
убрать
include => macro-dialout-one-predial-hook
добавить
exten => _X.,1,macro(dialout-one-predial-hook)

Saint
17.12.2017
09:43:06

Алексей
17.12.2017
09:45:36
инклудить макрос в контекст..... прям новое что то.....
exten же в совпадение не попадет......
макрос надо вызвать

Saint
17.12.2017
09:50:16
Чисто вот как инструкция

Алексей
17.12.2017
09:51:20
не может работать...... ты почитай комменты под статьей

Google

Saint
17.12.2017
09:53:25

Ivan
17.12.2017
10:02:19
https://github.com/FreePBX/core/blob/release/13.0/etc/extensions.conf
1. include, разумеется, не нужен.
2. Нет MacroExit

Saint
17.12.2017
10:06:35

Ivan
17.12.2017
10:06:54
Можете показать логи звонков?

Saint
17.12.2017
10:07:05
Секунду


Ivan
17.12.2017
10:15:10
-- Executing [s@macro-dial:20] GotoIf("SIP/1102-0002584f", "0?ndloopbegin") in new stack
-- Executing [s@macro-dial:21] Macro("SIP/1102-0002584f", "dial-ringall-predial-hook,") in new stack
-- Executing [s@macro-dial-ringall-predial-hook:1] MacroExit("SIP/1102-0002584f", "") in new stack
-- Executing [s@macro-dial:22] Dial("SIP/1102-0002584f", "SIP/1113,30,TtrIM(auto-blkvm)b(func-apply-sipheaders^s^1),") in new stack
Я не разбираюсь в FreePBX, но тут используется macro-dial, а не macro-dial-one, и поэтому хук macro-dialout-one-predial-hook не вызывается. Либо что-то не так в настройках, и надо менять их, чтобы был dial-one вместо dial, либо можно использовать macro-dial-ringall-predial-hook вместо macro-dialout-one-predial-hook. И добавить в конец MacroExit.
То есть можно попробовать
[macro-dial-ringall-predial-hook]
exten => s,1,Noop(HINT STATUS - ${EXTENSION_STATE(${DEXTEN})})
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "INUSE"]?Playback(/var/lib/asterisk/sounds/ru/custom/busytest))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "INUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "RINGINUSE"]?Playback(/var/lib/asterisk/sounds/ru/custom/busytest))
exten => s,n,ExecIf($["${EXTENSION_STATE(${DEXTEN})}" = "RINGINUSE"]?Set(D_OPTIONS=Ttm))
exten => s,n,MacroExit
По крайней мере этот код будет вызываться в данном конкретном сценарии, а будет ли от этого желаемый эффект - не факт.


Saint
17.12.2017
10:18:43
Завтра буду пробовать ) спасибо за помощь

Ivan
17.12.2017
10:23:04
Судя по исходникам, выбор между dial и dial-one зависит от некоей глобальной настройки:
if ($amp_conf['AST_FUNC_EXTENSION_STATE']) {
$ext->add($mcontext,$exten,'macrodial', new ext_macro('dial-one','${RT},${DIAL_OPTIONS},${EXTTOCALL}'));
} else {
$ext->add($mcontext,$exten,'macrodial', new ext_macro('dial','${RT},${DIAL_OPTIONS},${EXTTOCALL}'));
}

Iker
17.12.2017
10:44:35

Алексей
17.12.2017
10:48:30
Подскажите, плиз:)
Не совсем понял задачу....
При переводе ты ставишь клиента в park звонишь абоненту.... если не дозвонился то........
Что должно быть у тебя а что у клиента?

Iker
17.12.2017
10:53:25
если не дозвонился через *2 - сейчас он возвращается на линию к клиенту, выйдя из hold transfer, "А" - перестает слышать moh. А нужно следующее : "А" звонит, "Б" - принимает звонок, затем "Б" делает сопровождаемый трансфер на "В", но не дозванивается или "В" отказывается принимать звонок, Тогда "Б" пробует перевести этот звонок на "Г" и т.д. И в моменты, когда "Б" завершает звонок с {ВГДЕ} - "А" перестает слышать moh, т.к. Б возвращается к нему на линию

Алексей
17.12.2017
10:54:20
И сразу вопрос..... у вас всегда оператор первой линии ждет когда ответит вторая линия?
Или перевели и положили трубку?
Потом ждут когда звонок им вернется?

Iker
17.12.2017
10:56:43
Т.к. это не слепой трансфер - Б ждет пока ответит {ВГДЕ} и перестает ждать, только если слишком долго идет дозвон и завершает звонок с второй линией
Это всегда attended transfer

Алексей
17.12.2017
10:58:57
Могу тогда предложить простой вариант.
после dial проверяй dialstatus и если он !=Answer
Пускай его в disa
Там он набирает следующие номера
Или еще вариант.... сделай ринг-группу.... и пусть оператор переводит на нее

Iker
17.12.2017
11:03:11
вот только оператор всегда сам выбирает куда ему перевести, это динамический список без какого-либо порядка

Google

Iker
17.12.2017
11:03:48
я просто думал, что можно каким-то кодом вызывать hold и выходить из него. аналогично как это сделано на телефонах

Алексей
17.12.2017
11:05:11
Можно отправлять в ячейку парка.....
звонить кому надо и говорить "в такой то ячейке вас ждут"
После этого абонент сам вытащит звонок из парка
Но как по мне..... обучать этому пользователей муторно

Iker
17.12.2017
11:06:26
а автоматом вытаскивать из парка нельзя?
если допустить, что в парке всегда будет только 1 звонок

Алексей
17.12.2017
11:07:53
Правда сложность - выполнить диалплан при завершении канала.....
можно попробовать channel redirect использовать.... но как он из паркинга вытащит я не уверен

Iker
17.12.2017
11:11:03
т.е. А звонит Б, Б паркует звонок, я сохраняю ячейку, Б пытается позвонить на {ВГДЕ} - кому успешно позвонил, перед hangout - соединять с паркованым каналом

Алексей
17.12.2017
11:14:53
Ну да.....
Только теоритически А
может вобще забыть за припаркованного и пойти на обед ;)
и в таком случае......

Iker
17.12.2017
11:17:50
хах, ну, насколько я понимаю можно же установить таймаут и тогда звонок вернется...хотя тут проблема может возникнуть в том, что оператор может припарковать один звонок и пока он будет думать, кому его перевесить - ему позвонит другой...

Алексей
17.12.2017
11:18:30
Есть еще кстати вариант.....
при трансфере А вводит что то типа 101*103*102#
И при трансфере набирать их поочередно....
Таким образом оператор сам формирует ринггруппу
И если никому не дозвонились абонент вернется к А

Iker
17.12.2017
11:21:19
хм, вот это уже поинтереснее. это стандартная логика при attended трансфере? т.е. можно например набрать *2 101*103*102 и пойдет поочередный вызов этим абонентам?

Алексей
17.12.2017
11:22:03
разобрать набраный номер по разделителям и в цикле идти по всем.... условие выхода dialstatus=answer
либо если мы прошли полный цикл

Iker
17.12.2017
11:26:31
ну в этом случае в ряде 101*103*102, answer он может получить и у первого(101), но тот не захочет говорить с звонившим.

Алексей
17.12.2017
11:28:34

Iker
17.12.2017
11:29:17
ну вероятно, да. типа он ответил, что ппц как занят и вообще он выходной)
хочется придумать какую-нибудь относительно простую схему для первой линии, чтобы заменить ныне существующий вариант с установкой в hold, переключением на другую линию, дозвоном до второй линией и клацанием кнопки transfer для обьединения этих звонков между собой

Google

Алексей
17.12.2017
11:31:07
тогда можно убрать условие answer
Только если я правильно помню там в диал опция какая то должна быть... для продолжения прогулок по диалплану

Дмитрий
17.12.2017
11:33:45
Надоело уже искать и пробовать...
астер 15. Подскажите как определить канал или пир, который вызвал фичу? Например, аттендидтрансфёр
много всяких переменных перебрал.. все пусто возвращают
Последняя была BRIDGEPEER. Пусто :(

Алексей
17.12.2017
11:35:14
А dumpchan() пробовал вставить и посмотреть?

Дмитрий
17.12.2017
11:36:04
не зря ж спросил.. спасибо за дельное предложение

Ivan
17.12.2017
11:38:19

Дмитрий
17.12.2017
11:38:43
а при слепой.. иное? очень удобно :(
дамп подтвердил:
ATTENDEDTRANSFER=PJSIP/10228-000000c4
TRANSFERERNAME=PJSIP/10228-000000c4
не смотря на название "name".. там всё равно канал

Ivan
17.12.2017
11:41:14
да, BLINDTRANSFER при слепом

Дмитрий
17.12.2017
11:41:24
попробую слепую.. вдруг TRANSFERERNAME выдаст тоже канал

Алексей
17.12.2017
11:43:04
Удачи :)

Дмитрий
17.12.2017
11:44:56
"фигушки".
BLINDTRANSFER=PJSIP/10228-000000d4
DIALEDPEERNUMBER=10228
DIALEDPEERNAME=PJSIP/10228-000000d4

Ivan
17.12.2017
11:46:08
TRANSFERERNAME - только в attended и только через features

Алексей
17.12.2017
11:46:56
В слепой допиши
Set(TRANFERNAME=${BLINDTRANFER})

Ivan
17.12.2017
11:47:10
есть ещё FORWARDERNAME при 3xx-редиректе (call forward либо SIP-трансфер до ответа на звонок)

Алексей
17.12.2017
11:47:19
И будет везде трансфернам
Блин как неудобно с телефона такие вещи писать
Не хватает подсветки синтаксиса нано ;)

Дмитрий
17.12.2017
11:51:07
самое забавное что в слепой не теряются значения переменных.. из-за чего я и хочу получать имя канала.

Google

Дмитрий
17.12.2017
11:56:28
уф.. сделал таки 3way transfer

Алексей
17.12.2017
12:01:17
Тогда вопрос. Умеет ли астер сохранять сессию звонка в бд? Для последующей работы с ней на другом сервере..... как fs?
Приятно же выстроить ha с астером так чтоб звонки не обрывались при переключении между серверами

Victor_sc120
17.12.2017
12:02:54
exten => s,n,ExecIf($[${LEN(${DB(RECORD/${CHANNEL(linkedid)}/ZCALLFILENAME1)})} != 0]?Goto(horosh1))
никто писать не запрещает - пишу в базу

Дмитрий
17.12.2017
12:13:15
не прерывались? А RTP ходит напрямую?

Алексей
17.12.2017
12:14:30
нет..... есть сервер регистрации он же форвардит rtp на медиасервера....
sofia такое умеет давно......
надеялся на pjsip - но пока не нашел ничего подобного

Дмитрий
17.12.2017
12:19:51
Похоже беда в том, что мы пытаемся использовать астериск там, где он не воин..
у меня вот он падает раз 6-8 на дню... точнее сейчас уже не падает, а просто зависает, а срубает его мой скрипт.
грустно... но я пока не готов уйти с астериска. Всё жду когда же исправят зависания при релоде конфигов

Алексей
17.12.2017
12:21:37

Дмитрий
17.12.2017
12:23:11
кстати... подскажите.
У меня сейчас всё хранится в БД и выгружается в текстовые конфиги. После делается "pjsip reload", отчего и зависает всё нафих..
если я переделаю на realtime, то:
- нужно ли там релодить после внесения изменений?
- а если и нужно... не будет ли лучше в части зависаний? :)

Алексей
17.12.2017
12:23:57
на то он и реалтайм

Дмитрий
17.12.2017
12:29:00
похоже.. придётся двигаться в его сторону.
Вот только проблема нахождения всех трёх наборов таблиц в одной базе не решена... там пишется альбемик в одну таблицу... вроде

Алексей
17.12.2017
12:56:49

Ivan
17.12.2017
13:00:15
Не всё обязательно держать в БД, впрочем
pjsip не работает с движком realtime напрямую, а использует sorcery. Тот уже отвечает за то, откуда брать данные и куда сохранять - конфиги ли это, astdb или realtime.

Дмитрий
17.12.2017
13:23:28
Надеюсь шаблоны там поддерживаются