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