У меня проблема, уже 20 часов по теме, а решить не могу. Дело в том, что я не могу выставить счет за звонок, потому что не могу получить точный CLID отвеченного номера при одновременной переадресации в Asterisk. ${CDR(src)}, ${CDR(dst)} здесь не помогают.
Я звоню с PSTN +79000000000 на DID +78120000000 и звонок поступает на нашу Астериск. На астериске через тот же транк звонок переадресовывается на другую ТфОП +74950000000 и там отвечает. По завершению вызова в CDR мы видим:
src: 79000000000
dst: 78120000000
и нет информации о последнем звонке 78120000000 -> 74950000000
Я могу использовать переменную CDR для хранения 74950000000 перед вызовом приложения Dial:
Set(CDR(fwd)=74950000000);
Dial(SIP/78120000000/74950000000);
то в CDR при завершении вызова мы можем увидеть:
src: 79000000000
dst: 78120000000
fwd: 74950000000
и это нормально, потому что я могу ограничить максимальную продолжительность звонка до набора номера и выставить счет за звонок после завершения разговора. Все благодаря известному fwd.
sip.conf
[78120000000]
name=78120000000
type=peer
host=sip.provider.com
extensions.ael
context sequential {
_.=> {
Set(CDR(fwd)=74950000000);
Dial(SIP/78120000000/74950000000);
Hangup();
}
h => {
Set(BILL_THE_CALL=${ODBC_BILL_THE_CALL()});
// billing is easily executed thanks to logged fwd in CDR
}
}
Но при одновременной переадресации это невозможно:
context simultaneous {
_.=> {
// can't set fwd before call completion, because don't know
// if my_cell_phone or softphone will answer
// my_cell_phone costs 5 cents/min, softfone is free of charge
Dial(SIP/78120000000/74950000000&SIP/softphone);
Hangup();
}
h => {
Set(BILL_THE_CALL=${ODBC_BILL_THE_CALL()});
// billing is impossible because fwd is not logged to CDR
}
}
При завершении вызова в CDR мы видим то же самое, что и для последовательного случая, без fwd:
src: 79000000000
dst: 78120000000
и нет информации о последнем 78120000000 -> 74950000000 или на софтфон
Итак, знаете ли вы какой-либо способ получить это имя пользователя, на который был дан ответ, номер, на который был дан ответ, CLID или что-то еще, чтобы иметь возможность выставить счет за звонок?
http://www.voip-info.org/wiki/view/Asterisk+variables
http://www.voip-info.org/wiki/view/Asterisk+func+channel
и т.д. ссылки не содержат ничего полезного для меня.
По звонку также могу подать заявку
sip show channel faf7767642
и увидеть имя пользователя канала, исходный uri и т. д., которые содержат мой номер переадресации, но я не могу получить их оттуда с помощью диалплана. Но когда я звоню:
NoOp(${CHANNEL(username)});
просто ничего не показывает. Есть идеи? Не могу поверить, что я пропустил что-то очевидное. Спасибо!
Dial(SIP/client1&IAX2/client2,,M(giveme-answered-clid));
и макросыcontext macro-giveme-answered-clid { _. => { Set(CDR(fwd)=${CHANNEL(peername)}); }
на самом деле устанавливают CDR(fwd) на допустимое имя пользователя, на который был дан ответ (т.е. на client1 или client2 - в зависимости от имени пользователя, на которое ответила сторона! Но переменная CDR(fwd) не передается обратно в контекст, где был вызван Dial, и это не работает. .Может стоит использовать глобальную переменную Set(CDR(fwd)=${CHANNEL(peername)},g); - и она будет доступна через любой контекст в любое время? - person Alexey Che   schedule 31.12.2013