2017-04-06 49 views
0

我想知道爲每個CHANNEL_EXECUTE事件觸發ExecuteApplication調用。在託管ESL的ExecuteAsync方法中,沒有支持這一點的參數。簽名是:如何設置從ESL執行的應用程序的應用程序UUID

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

當一個應用程序啓動這個ExecuteAsync FreeSWITCH中產生的UUID的應用程序,這將在隨後的所有CHANNEL_EXECUTE事件的應用程序UUID頭域presen't。問題是ExecuteAsynch調用不會返回此UUID。如果有多個正在運行的應用程序,這就很難跟蹤CHANNEL_EXECUTE事件。通過ExecuteAsynch返回的事件具有以下形式(無UUID存在):

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

例如API調用執行與Bgapi支持這將是工作-UUID頭字段的用於相關BACKGROUND_JOB的值的job_uuid參數事件。

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

如何同爲撥號方案的應用,如播放實現?

我檢查,如果可能它是由託管包裝隱蔽,但在esl.c(至極用於由包裝的ExecuteAsync法)esl_execute功能似乎不支持此兩種:

ESL_DECLARE(esl_status_t) esl_execute(esl_handle_t *handle, const char *app, const char *arg, const char *uuid) 

回答

0

根據documentation of sendmsgEvent-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 
相關問題