首页 > 其他分享 >FreeSWITCH添加自定义endpoint之api及app开发

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

时间:2023-10-28 11:24:23浏览次数:34  
标签:session core endpoint uuid 自定义 SWITCH switch api channel

操作系统 :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);
}

好,就这么多了,希望对你有帮助。

标签:session,core,endpoint,uuid,自定义,SWITCH,switch,api,channel
From: https://www.cnblogs.com/MikeZhang/p/fsAddApiApp20231028.html

相关文章

  • JAVA - Obejects api
    packagecom.demo2;importcom.demo.Demo1;importjava.util.Objects;publicclassTest{publicstaticvoidmain(String[]args){Stringname=null;StringreturnName=Objects.requireNonNullElse(name,"张三");//第一个参数不为空......
  • c# winfom从0学习开发OA、BPM工作流程与自定义表单系统(十三)新建工作
     1,新建一个工作 2,填写表单 3,当时表单设置的可写字段,在这里就体现出来了,这里设置的第一个节点开始是字段全部可写的,其他节点只能看不能写 4,转交下一步工作,也就是我们流程图连线箭头指向的节点 5,确定转交下一步工作 6,需要登录张三的账号,去代办工作里查看有没有需......
  • openapi-generator修改默认生成的Model文件名称
    openapi-generator为各种语言都以抽象类的形式进行了默认配置以Typescript为例,其中的抽象类路径为openapi-generator\modules\openapi-generator\src\main\java\org\openapitools\codegen\languages\AbstractTypeScriptClientCodegen.java其中的toTypescriptTypeName方法则对生......
  • API商品数据接口调用爬虫实战
    随着互联网的发展,越来越多的商家开始将自己的商品数据通过API接口对外开放,以供其他开发者使用。这些API接口可以提供丰富的商品数据,包括商品名称、价格、库存、图片等信息。对于爬虫开发者来说,通过调用这些API接口,可以更加便捷地获取商品数据,避免了爬取网页数据的繁琐过程。本文将......
  • 支持自动生成API文档 Apipost 真香
    在数字化时代,API已经成为了应用程序之间进行通信的关键桥梁。随着API的普及和复杂性的增加,API研发和管理也面临着越来越多的挑战。为了更好地应对这些挑战,Apipost提供了一整套API研发工具,包括API设计、API调试、API文档和API自动化测试等功能。本文将深入介绍Apipost的优势和特点,助......
  • 如何使用nodejs对接【企查查开放平台API服务】
    下面分享一下如何对接企查查API接口相关内容。API服务对接流程:1、登录|注册:先打开企查查开放平台网站(https://openapi.qcc.com),菜单栏中右上角【登录|注册】;2.打开API服务列表通过顶部导航菜单【API】,可以查看所有服务列表,里面包含了很多API接口,此处不具体介绍,有兴趣的可以自己......
  • 支持自动生成API文档 Apipost 真香
    在数字化时代,API已经成为了应用程序之间进行通信的关键桥梁。随着API的普及和复杂性的增加,API研发和管理也面临着越来越多的挑战。为了更好地应对这些挑战,Apipost提供了一整套API研发工具,包括API设计、API调试、API文档和API自动化测试等功能。本文将深入介绍Apipost的优势和特点,......
  • 逆向手机银行余额修改生成器,实现自定义修改效果
    哈喽大家好,我又来了,我是专注于APP逆向的小库,我从网上找来了一款银行模拟器,就是装逼用的,然后它存在一个问题,就是每次打开那个余额固定死的,也没有其它修改的地方,而一些小伙伴想把这个余额改成自己想要的内容,这个软件我已经改好了,下面是软件的界面图。我这边主要教大家改这两处:教......
  • Python:爬取某软件站数据报错requests.exceptions.SSLError: HTTPSConnectionPool(hos
    使用Python爬取某网站数据时候,之前一直是好好的。突然就报错:requests.exceptions.SSLError:HTTPSConnectionPool(host='api.***.cn',port=443):Maxretriesexceededwithurl:/accounty1/login?analysis............检查发现,可能是IP地址存在代理导致网络环境一场。可以检......
  • VUE+Ant 自定义cron组件,显示最近运行时间
    先上效果图 自定义组件<template><a-modaltitle="corn表达式":width="modalWidth":visible="visible":confirmLoading="confirmLoading"@ok="handleSubmit"@cancel="close"......