我想知道每个ExecuteApplication事件的触发CHANNEL_EXECUTE调用。在托管ESL的ExecuteAsync方法中,没有支持这一点的参数。签名是:
public ESLevent ExecuteAsync(string app, string arg, string uuid)使用此ExecuteAsync启动应用程序时,FreeSwitch将为应用程序生成一个UUID,这将不会出现在随后的CHANNEL_EXECUTE事件的application标头字段中。问题是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)如何实现同样的拨号计划应用程序,如回放?
我检查了托管包装器是否隐藏了它,但是esl.c中的esl_execute函数(wich由包装器的ExecuteAsync方法使用)似乎也不支持这一点:
ESL_DECLARE(esl_status_t) esl_execute(esl_handle_t *handle, const char *app, const char *arg, const char *uuid)发布于 2017-04-17 03:16:04
根据发送文件g,Event-UUID头值就是为此目的而设计的。API中的esl_execute函数使用esl_send_recv发送自组成的sendmsg消息,但不幸的是它没有提供设置该字段的方法。其中一种方法是编写一个类似的sendmsg消息,其中包含Event-UUID字段并通过esl_send_recv发送。
例如,在托管ESL中:
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);
...
}因此,要发送的消息将具有以下形式:
sendmsg bb2652fa-467c-44a1-a2f0-0f5e4363e2f3
call-command: execute
execute-app-name: playback
execute-app-arg: d:\vox\sample.vox
loops: 1
Event-UUID: play command id 369https://stackoverflow.com/questions/43253217
复制相似问题