FreeSWITCH新增自定義endpoint之api及app開發

2023-10-28 12:01:15

作業系統 :CentOS 7.6_x64

FreeSWITCH版本 :1.10.9

之前寫過FreeSWITCH新增自定義endpoint的文章,今天整理下api及app開發的筆記。歷史文章可參考如下連結:

FreeSWITCH新增自定義endpoint
FreeSWITCH新增自定義endpoint之媒體互動

一、常用函數介紹

這裡列舉下開發過程中常用的函數。

1、根據uuid查詢session

使用switch_core_session_locate宏進行查詢。

定義如下:

#define switch_core_session_locate(uuid_str) switch_core_session_perform_locate(uuid_str, FILE, SWITCH_FUNC, LINE)

範例如下:

switch_core_session_t *session;
if ((session = switch_core_session_locate(uuid))) {
switch_channel_t *tchannel = switch_core_session_get_channel(session);
val = switch_channel_get_variable(tchannel, varname);
switch_core_session_rwunlock(session);
}

查詢session後,需要使用switch_core_session_rwunlock函數釋放鎖。

2、獲取session的uuid

使用 switch_core_session_get_uuid 函數根據session查詢uuid。定義如下:

SWITCH_DECLARE(char *) switch_core_session_get_uuid(_In_ switch_core_session_t *session);

範例如下:

const char *uuid = switch_core_session_get_uuid(session);

3、根據session獲取channel

 使用 switch_core_session_get_channel 函數根據session查詢channel。定義如下:
_Ret_ SWITCH_DECLARE(switch_channel_t *) switch_core_session_get_channel(_In_ switch_core_session_t *session);

範例如下:

switch_channel_t *tchannel = switch_core_session_get_channel(session);

4、channel操作

  • switch_channel_set_name

  設定通道名稱,通常以 endpoint 型別作為字首,比如"sofia/1001"、"rtc/1002"等。

  • switch_channel_get_name

  獲取通道名稱。

  • switch_channel_set_variable

  設定通道變數的值。

  • switch_channel_get_variable

  獲取通道變數的值。

  • switch_channel_set_flag

  設定channel的標記

  • switch_channel_ready

  判斷channel是否就緒

  • switch_channel_set_caller_profile

  設定profile屬性


更多內容channel操作可參考 switch_channel.h 檔案。

二、檢視已有api及app

使用 show modules 顯示所有api、app及mod對應關係。

效果如下:

 如需檢視單個模組包含的api及app,可以在後面加上模組名稱,比如:

show modules mod_db

三、新增api命令

通過SWITCH_STANDARD_API進行新增。

比如新增如下命令:

ctest_update_token <uuid> <token>

範例程式碼如下:

/* <uuid> <token> */
SWITCH_STANDARD_API(ctest_update_token_function)
{
    char *argv[3];
    char *mydata;
    char *uuid, *token;

    if (zstr(cmd)) {
        stream->write_function(stream, "-ERR Parameter missing\n");
        return SWITCH_STATUS_SUCCESS;
    }
    if (!(mydata = strdup(cmd))) {
        return SWITCH_STATUS_FALSE;
    }

    if (!switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))) || !argv[0]) {
        goto end;
    }

    uuid = argv[0];
    token = argv[1];

    if (zstr(uuid) || zstr(token)) {
        goto end;
    }

    switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"uuid : %s , token : %s\n",uuid,token); 

end:
    switch_safe_free(mydata);
    return SWITCH_STATUS_SUCCESS;
}

在模組載入函數(mod_ctest_load)新增入口:

switch_api_interface_t *api_interface;

SWITCH_ADD_API(api_interface, "ctest_update_token", "update ctest channel token", ctest_update_token_function,"<uuid> <token>");

設定自動填充uuid:

switch_console_set_complete("add ctest_update_token ::console::list_uuid");

 執行效果如下:

四、新增app命令

通過 SWITCH_STANDARD_APP 新增,這裡就不詳細描述了,具體看下 echo 這個app:

mod/applications/mod_dptools/mod_dptools.c :2317

SWITCH_STANDARD_APP(echo_function)
{
    switch_ivr_session_echo(session, NULL);
}

好,就這麼多了,希望對你有幫助。