在freeswitch管理模块中没有挂起的持续时间

本文关键字:挂起 持续时间 freeswitch 管理 模块 | 更新日期: 2023-09-27 18:06:42

我正在为FreeSwitch编写一个托管模块(它是在c#中,但我认为这适用于其他语言),我在挂起过程中没有得到持续时间:

    public void Run(AppContext context)
    {
        context.Session.HangupFunction = () => Hangup(context.Session);
        HandleCall(context.Session);
    }
    private void Hangup(ManagedSession session)
    {
        Log.WriteLine(LogLevel.Info, "Hanging up");
        Log.WriteLine(LogLevel.Info, "Created time: " + session.Variables.CreatedTime);
        Log.WriteLine(LogLevel.Info, "Answered time: " + session.Variables.AnsweredTime);
        Log.WriteLine(LogLevel.Info, "Hangup time: " + session.Variables.HangupTime);
        Log.WriteLine(LogLevel.Info, "Duration: " + session.GetVariable("duration"));
    }

CreatedTime和AnsweredTime都已设置。但是挂断时间和持续时间都是空的。知道为什么吗?

在freeswitch管理模块中没有挂起的持续时间

这基本上是一个两难的选择。你正在编写一个处于EXECUTE状态的应用程序,当它的状态改变为HANGUP状态时,你已经要求回调运行,但是该回调必须在它仍然在你的应用程序中运行,这必须在它从EXECUTE改变为HANGUP之前。一旦你退出回调,应用程序就会退出,然后它会变成HANGUP,处理所有其他的挂起的东西。如果我们在之后调用你的函数,所有你想查询的东西都已经被删除了。

所以你基本上可以假设你的函数运行的当前时间在实际挂起时间的几微秒内,这取决于你在函数中阻塞的时间。如果您试图做任何类似于CDR或呼叫处理的事情,那么无论如何都不应该在那里做。相反,您可以为CS_REPORTING注册一个api_hangup_hook或一个状态处理程序,其中所有数据将被捕获并存在于与应用程序分离的逻辑流中。