On Tue, 8 Nov 2005 15:23:22 +0300 (MSK)
"Dmitry Valdov" <CGatePro@mx.ru> wrote:
> Hi!
>
> А почему в CDR нет длительности соединения?..
А потому что это SIP, а не PSTN. Вообще-то, в идеальном мире, сервер вообще
не должен видеть концов: и media, и диалоги должны идти мимо него.
Если же они не идут мимо (например, вы, будучи человеком не любящим
идеально, взяли да и приказали ему Relay Dialogs - это он Record-Route будет
всегда вставлять), или серверу самому пришлось это сделать из-за
неидельности мира (всякие NAT и MS signers), то все равно это еще не
означает, что сервер должен что-то знать о всех установленных через него
диалогах и звонках.
Поэтому, в общем случае:
а) о конце разговора сервер вообще может не узнать
б) даже если он узнает о всех концах (релеит через себя все диалоги), то для
него все запросы - в общем случае - независимы.
Поэтому это уже задача обработчика CDR хранить "state" - то есть сканировать
лог на предмет 200-INVITE и запоминать его DialogID (который там для этого и
записан). И при чтении BYE - считать время от 200-INVITE с тем же DialogID.
Кстати, тут же встаёт вопрос обработки тех звонков, для который BYE вообще
нету. Ну, упал телефон у меня, а у него - firewall упал, и ни с одной
стороны не пришли BYE, а Вы им - счёт за разговор длиною в месяц
выставляете.
Последнее, кстати, решается при помощи Session-Expire который пока не
поддерживается в CgatePro - но он и не во всех телефонах поддерживается - а
в них важнее. Самое главное - чтобы он в Ваших платных gateways
поддерживался. Если он есть, то ставится он на разумное время - 2 минуты
например. И требуется, чтобы клиенты обменялись INVITE за это время. Если
нет - то приравнивается к побегу, и call считается законченным. А в CDR
такие Re-INVITE можно писать, чтобы всё это учесть.
Sincerely,
Vladimir
Получено Tue Nov 08 23:56:21 2005