On Thu, 26 Oct 2006 11:17:17 +0400
"Oleg Shumsky" <CGatePro@mx.ru> wrote:
> Здравствуйте.
>
>>> У меня модифицирован gatewaycaller и ip pstn шлюза он берет исходя из >>> ответа httpcall, на который уже потом и формируется инвайт. Вот >>> только никак не могу понять вашу фразу, что нужно сделать. Я не >>> использую callerLeg.sppi, он не вызывается из gatewaycaller. Там >>> используются startcall и acceptcall и из external функций только >>> playNumber и все. >> >> >> Тогда вместо StartCall надо использовать (в 5.1.х!) >> StartBridgedCall(), а вместо AcceptCall - StartBridge().
а в чем, собственно, проблема? В том, что при бриджевании звонков не передаются 180/183 из одного лега B2BUA в другой? Так они и не должны передаваться. у операции StartBridge() нет такого понятия, как "установление звонка" и она НИКАКИМ образом в передаче чего-то там не участвует.
Прочитайте внимательно описание - бриджевание при помощи StarrBridge/AcceptBridge делается ТОЛЬКО для уже установленных звонков. И картинки в описании есть. Движущиеся даже. И ничего там про "установление звонка" нету.
Реально все эти B2BUA (gatewayincoming, gatewaycaller) работают/работали
так:
по звонку рожалась задача (Task), которая разбиралась с параметрами и
сеттингами. И рожала себе вторую задачу. Вторая задача начинала звонить,
куда ей сказли (это всё упаковано нынче в callerLeg.sppi). Если звонок
установился, то эти задачи начинали делать StartBridge/AcceptBridge. Заметим
- ТОЛЬКО когда звонок уже установился. И передать медиа с одной ноги
(задачи) в другую до установки звонка никак нельзя - они не связаны.
Вторая задача, по получении provisioning event (а что это - 180, 183 или еще
что-то - не разбиралась она), отсылала событие первой задаче, так что она
тоже выдавала своему пиру (звонящему) provisionCall() - так что у него МОГЛИ
начаться длинные гудки в трубе. Могла и сама их ему сэмулировать, проигрывая
какой-то звук в этот "ранний диалог" - хотя наши программы этого не делали.
А после установления звонка шел StartBridge/AcceptBridge который виделся как re-INVITE с обеих сторон - и только тогда обе стороны становились связанными по медиа. Посмотрите на картинки внимательно еще раз.
В 5.1 появился StartBridgedCall() - он ОПИСАН в мануале.
Теперь разрешено выдавать StartBridge когда звонок еще не установлен (при ждущем входном звонке). Что новые B2BUA программы и делают (опционально). Порождают вторую таску B2BUA и дают ей StartBridge(). Та его хватает и делает StartBridgedCall() с параметрами звонка (куда, почём) и с этим StartBridge Event в качестве второго параметра.
Тогда звонок, уходяший со второй ноги будет иметь медиа (SDP) исходного
звонящего (этот sdp пришел вместе с startBridge event), и "полурабочий"
бридж между двумя ногами устанавливается сразу. Теперь, если тот, кому
звоним, присылает 18x то -
а) этот 180 в виде provisionEvent попадает во второй таск (как обычно).
б) этот 18x уходит в первый таск в виде специального события. Которое
обрабатывается системой (первый таск висит в StartBridge вызове) и приводит
к выдаче 18x звонящему.
в) так как звонимый (хм. кому звонят) уже поимел настоящий sdp звонящего, то
он свои длинные мелодичные гудки может действительно ему поиграть, а тот их
даже, может, и услышит.
г) когда приходит 200 - то есть звонок принят, то он пробегает тот же путь,
что и 18x и диалог меж двумя конечными точками устанавливается полностью.
Никаких ре-инвайтов тут уже не нужно.
Вторая задача получает FinalCall event, а первая задача успешно выходит из
StartBridge.
Более того. При этом ни одна задача не создает (до этого момента) каналов
Media Server-а. В исходном варианте с StartBridge/AcceptBridge:
а) вторая задача создает MediaServer channel чтобы позвонить (она может им и
воспользоваться, например проведя диалог с юзером - "слышь, тебе этот
звонит! Хочешь отвечать - нажми 1")
б) первая задача создает MediaServer channl чтобы принять звонок
AcceptCall() - и она тоже может им воспользоваться ("Эта, в натуре.
Дозвонилась я, наконец. Говори быстрее, у тебя 50 копеек на счету").
Обычно этими медиа-каналами не пользуются (stock applications их не используют) и после StartBridge они живут совершенно ненасыщенной жизнью, сильно откушивая от ресурсов сервера.
Поэтому ОБЫЧНО лучше использовать вот этот вот StartBridgedCall. А еще лучше - stock library, такую как callLeg.sppi - которая умеет звонить, используя оба метода.
Старый метод все равно нужен, например в PBX. Там, где Вы сначала узнали (в уже установившемся звонке) куда надо звонить, а потом стали звонить. Тут можно использовать StartBridgedCall, но у вас не будет длинных гудков - когда вторая задача начнет передавать в первую 18x та будет только глупо улыбаться и бросать их на пол - потому что ей некуда их передать - её нога не в состоянии "входяшего звонка". А используя старый метод, можно просто играть эти длинные гудки самой (первой задаче), пока вторая трудится над установлением звонка.
Опять же - всё это есть в мануале, только несколько менее лирично, и поэтому сильно короче.
> Было бы неплохо ссылку на документацию и на
>описание передаваемых параметров в эти функции. Если я просто контекстной
>заменой заменю в скрипте эти команды, то скорее всего ничего не заработает ?
Гарантированно не заработает, потому что тут совершенно разная логика работы.
Если Вы не совсем уверенно себя чувствуете с этими всеми операциями, то совет - использовать готорые "библиотеки" типа callerLeg.sppi - они дают гораздо более высокоуровневый интерфейс ко всем этим делам.
> Oleg V. Shumsky
> Corbina Telecom NOC, VoIP Dept. Ph.: +7 495 7284000, ext. 2174, ICQ:
Sincerely,
Vladimir
Получено Thu Oct 26 11:23:29 2006
Этот архив был сгенерирован hypermail 2.1.8 : Thu 26 Oct 2006 - 16:14:23 MSD