如何为从 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 sendmsg,Event-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
我想知道每个 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 sendmsg,Event-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