如何为从ESL执行的应用程序设置Application-UUID

问题描述 投票:0回答:1

我想知道每个 CHANNEL_EXECUTE 事件的触发 ExecuteApplication 调用。在托管 ESL 的 ExecuteAsync 方法中,没有参数支持此操作。签名是:

public ESLevent ExecuteAsync(string app, string arg, string uuid)

当使用此 ExecuteAsync FreeSwitch 启动应用程序时,会为应用程序生成一个 UUID,并且该 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 参数,该参数将是相关 Behind_JOB 事件的 Job-UUID 标头字段的值。

 public ESLevent Bgapi(string cmd, string arg, string job_uuid)

如何为播放等拨号方案应用程序实现同样的效果?

我已经检查过它是否被托管包装器隐藏,但 esl.c 中的 esl_execute 函数(由包装器的 ExecuteAsync 方法使用)似乎也不支持此功能:

ESL_DECLARE(esl_status_t) esl_execute(esl_handle_t *handle, const char *app, const char *arg, const char *uuid)
freeswitch
1个回答
0
投票

根据 sendmsg 的 文档

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 369
© www.soinside.com 2019 - 2024. All rights reserved.