我想知道每个CHANNEL_EXECUTE事件触发的ExecuteApplication调用。在Managed ESL的ExecuteAsync方法中,没有支持此参数的参数。签名是:
public ESLevent ExecuteAsync(string app, string arg, string uuid)
当使用此ExecuteAsync启动应用程序时,FreeSwitch会为应用程序生成UUID,这将在随后的所有CHANNEL_EXECUTE事件的Application-UUID标头字段中显示。问题是ExecuteAsynch调用没有返回此UUID。如果有多个正在运行的应用程序,这使得跟踪CHANNEL_EXECUTE事件变得棘手。 ExecuteAsynch返回的事件具有以下形式(不存在UUID):
{
"Event-Name": "SOCKET_DATA",
"Content-Type": "command/reply",
"Reply-Text": "+OK"
}
例如,使用Bgapi执行API调用支持job_uuid参数,该参数将是相关BACKGROUND_JOB事件的Job-UUID标头字段的值。
public ESLevent Bgapi(string cmd, string arg, string job_uuid)
如何为播放等拨号方案应用程序实现相同的目标?
我已经检查过它是否被Managed Wrapper隐藏了,但是esl.c中的esl_execute函数(包装器的ExecuteAsync方法使用它)似乎也不支持这个:< / p>
ESL_DECLARE(esl_status_t) esl_execute(esl_handle_t *handle, const char *app, const char *arg, const char *uuid)
答案 0 :(得分:0)
根据documentation of sendmsg,.state('income', {
url: '/income',
parent: 'root',
views: {
'main@': 'pageContent'
},
...
标头值是为此目的而设计的。
API中的Event-UUID
函数使用esl_execute
发送自编esl_send_recv
条消息,但不幸的是它没有提供设置此字段的方法。
一种方法是撰写包含sendmsg
字段的类似sendmsg
消息,并通过Event-UUID
发送。
例如使用Managed ESL:
esl_send_recv
因此要发送的消息将具有以下形式:
public void ExecuteApplication(ESLconnection conn, string application, string appParams, string uiid, string jobid)
{
var header = new Dictionary<string, string>
{
{"call-command", "execute"},
{"execute-app-name", application },
{"execute-app-arg", appParams },
{"loops", "1" },
{"Event-UUID", jobid },
};
string newLine = "\n";
var cmd = $"sendmsg {uiid}{newLine}" + string.Join(newLine, header.Select(kvp => $"{kvp.Key}: {kvp.Value}"));
var e = conn.SendRecv(cmd);
...
}