FreeSWITCH添加自定义endpoint之api及app开发

种地  金牌会员 | 2023-11-22 17:44:21 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 954|帖子 954|积分 2862

操作系统 :CentOS 7.6_x64
FreeSWITCH版本 :1.10.9
之前写过FreeSWITCH添加自定义endpoint的文章,今天整理下api及app开发的笔记。历史文章可参考如下链接:
FreeSWITCH添加自定义endpoint
FreeSWITCH添加自定义endpoint之媒体交互
一、常用函数介绍

这里列举下开发过程中常用的函数。
1、根据uuid查询session
使用switch_core_session_locate宏进行查询。
定义如下:
  1. #define switch_core_session_locate(uuid_str) switch_core_session_perform_locate(uuid_str, FILE, SWITCH_FUNC, LINE)
复制代码
示例如下:
  1. switch_core_session_t *session;
  2. if ((session = switch_core_session_locate(uuid))) {
  3. switch_channel_t *tchannel = switch_core_session_get_channel(session);
  4. val = switch_channel_get_variable(tchannel, varname);
  5. switch_core_session_rwunlock(session);
  6. }
复制代码
查询session后,需要使用switch_core_session_rwunlock函数释放锁。
2、获取session的uuid
使用 switch_core_session_get_uuid 函数根据session查询uuid。定义如下:
  1. SWITCH_DECLARE(char *) switch_core_session_get_uuid(_In_ switch_core_session_t *session);
复制代码
示例如下:
  1. const char *uuid = switch_core_session_get_uuid(session);
复制代码
3、根据session获取channel
 使用 switch_core_session_get_channel 函数根据session查询channel。定义如下:
  1. _Ret_ SWITCH_DECLARE(switch_channel_t *) switch_core_session_get_channel(_In_ switch_core_session_t *session);
复制代码
示例如下:
  1. 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进行添加。
比如添加如下命令:
  1. ctest_update_token <uuid> <token>
复制代码
示例代码如下:
  1. /* <uuid> <token> */
  2. SWITCH_STANDARD_API(ctest_update_token_function)
  3. {
  4.     char *argv[3];
  5.     char *mydata;
  6.     char *uuid, *token;
  7.     if (zstr(cmd)) {
  8.         stream->write_function(stream, "-ERR Parameter missing\n");
  9.         return SWITCH_STATUS_SUCCESS;
  10.     }
  11.     if (!(mydata = strdup(cmd))) {
  12.         return SWITCH_STATUS_FALSE;
  13.     }
  14.     if (!switch_separate_string(mydata, ' ', argv, (sizeof(argv) / sizeof(argv[0]))) || !argv[0]) {
  15.         goto end;
  16.     }
  17.     uuid = argv[0];
  18.     token = argv[1];
  19.     if (zstr(uuid) || zstr(token)) {
  20.         goto end;
  21.     }
  22.     switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO,"uuid : %s , token : %s\n",uuid,token);
  23. end:
  24.     switch_safe_free(mydata);
  25.     return SWITCH_STATUS_SUCCESS;
  26. }
复制代码
在模块加载函数(mod_ctest_load)添加入口:
  1. switch_api_interface_t *api_interface;
  2. SWITCH_ADD_API(api_interface, "ctest_update_token", "update ctest channel token", ctest_update_token_function,"<uuid> <token>");
复制代码
设置自动填充uuid:
  1. switch_console_set_complete("add ctest_update_token ::console::list_uuid");
复制代码

 运行效果如下:

四、新增app命令

通过 SWITCH_STANDARD_APP 添加,这里就不详细描述了,具体看下 echo 这个app:
  1. mod/applications/mod_dptools/mod_dptools.c :2317
  2. SWITCH_STANDARD_APP(echo_function)
  3. {
  4.     switch_ivr_session_echo(session, NULL);
  5. }
复制代码
好,就这么多了,希望对你有帮助。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表