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

How to set Application-UUID for Applications executed from ESL

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

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

当使用此 ExecuteAsync FreeSwitch 启动应用程序时,会为该应用程序生成一个 UUID,这将不会出现在所有后续 CHANNEL_EXECUTE 事件的 Application-UUID header 字段中。问题是 ExecuteAsynch 调用没有 return 这个 UUID。如果有多个 运行 应用程序,这使得跟踪 CHANNEL_EXECUTE 事件变得棘手。由 ExecuteAsynch 编辑的事件 return 具有以下形式(不存在 UUID):

{  
    "Event-Name": "SOCKET_DATA",
    "Content-Type": "command/reply",
    "Reply-Text": "+OK"
}

例如 API 使用 Bgapi 的调用执行支持一个 job_uuid 参数,它将是相关 BACKGROUND_JOB 的 Job-UUID header 字段的值事件。

 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)

根据 documentation of sendmsgEvent-UUID header 值就是为此目的而设计的。 API中的esl_execute函数使用esl_send_recv发送自编sendmsg消息,但不幸的是它没有提供设置该字段的方法。 一种方法是撰写包含 Event-UUID 字段的类似 sendmsg 消息,并通过 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