我正在为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都已设置。但是挂断时间和持续时间都是空的。有什么想法吗?
答案 0 :(得分:0)
基本上它是一个捕获22。您正在编写一个处于EXECUTE状态的应用程序,并且当它指示更改为HANGUP状态时,您已要求回调运行,但该回调必须在其仍然在您的应用程序中时运行,该回调必须在它从EXECUTE更改之前挂断。一旦退出回调,应用程序将退出,然后它将更改为HANGUP并处理所有其他挂断的东西。如果我们之后调用了您的函数,那么您要查询的所有内容都将被拆除。
因此,基本上可以假设函数运行的当前时间在实际挂起时间的几微秒内,具体取决于您在函数中阻塞的时间长短。如果您正在尝试执行类似CDR或呼叫处理的任何操作,则无论如何都不应该在那里进行。相反,您可以为CS_REPORTING注册api_hangup_hook或状态处理程序,其中将捕获所有数据并将其存在于来自应用程序的单独逻辑流中。这是设计的。