概述

freeswitch支持多种语言的业务开发,包括C/C++,java,python,js,lua,Golang等等。
freeswitch在使用python做业务开发时,有俩种接入方式,一种是ESL接口,另一种是mod_python模块。
python的ESL接口是通过socket套接字与freeswitch进行命令交互,包括发送命令、命令响应和事件回调等,类似于在外部增加一个第三方模块控制fs行为。
ESL接口部分会在后续的章节中详细介绍。
今天我们要介绍的是fs内部的mod_python语言支持模块,该模块允许我们使用python脚本开发fs呼叫控制流程。

环境

centos:CentOS release 7.0 (Final)或以上版本
freeswitch:v1.8.7
GCC:4.8.5

安装mod_python模块

freeswitch的源码安装部署请参照之前的文章。
freeswitch源码安装时,默认不安装mod_python模块,需要我们进入目录编译安装。

cd /root/freeswitch-1.8.7/src/mod/languages/mod_python
make install cd /usr/local/freeswitch/mod
ll -tr
-rwxr-xr-x. 1 root root 753208 9月 14 10:41 mod_python.so
-rwxr-xr-x. 1 root root 1360 9月 14 10:41 mod_python.la

python脚本

增加testapi.py脚本

vi /usr/local/freeswitch/scripts/testapi.py
import freeswitch
def fsapi(session,stream,env,args):
stream.write("hello")
freeswitch.consoleLog("info","test")

增加testapp.py脚本

vi /usr/local/freeswitch/scripts/testapp.py
import freeswitch
def handler(session, args):
  session.answer()
  freeswitch.console_log("info","testCall\n")
  session.streamFile("local_stream://moh")
  freeswitch.msleep(3000)
  session.hangup()

配置启动

修改freeswitch模块加载配置文件

cd /usr/local/freeswitch/conf/autoload_configs
vi modules.conf.xml
<!-- Languages -->
<load module="mod_python"/>

修改dialplan拨号计划

cd /usr/local/freeswitch/conf/dialplan
vi public.xml

<include>
<context name="public">
<extension name="test">
<condition>
<action application="python" data="testapp"/>
</condition>
</extension>

启动freeswitch

cd /usr/local/freeswitch/bin
./freeswitch -nonat
2021-09-14 10:57:06.392800 [NOTICE] mod_python.c:551 Python Framework Loading...
2021-09-14 10:57:06.405965 [CONSOLE] switch_loadable_module.c:1540 Successfully Loaded [mod_python]
2021-09-14 10:57:06.405982 [NOTICE] switch_loadable_module.c:292 Adding Application 'python'
2021-09-14 10:57:06.406012 [NOTICE] switch_loadable_module.c:315 Adding Chat Application 'python'
2021-09-14 10:57:06.406030 [NOTICE] switch_loadable_module.c:338 Adding API Function 'pyrun'
2021-09-14 10:57:06.406046 [NOTICE] switch_loadable_module.c:338 Adding API Function 'python'

测试

在freeswitch命令行中输入命令,使用python调用API接口

freeswitch@localhost.localdomain> python testapi
2021-09-14 11:13:56.068722 [NOTICE] mod_python.c:212 Invoking py module: testapi
2021-09-14 11:13:56.088701 [INFO] switch_cpp.cpp:1443 test
hello

在日志打印中,我们可以看到mod_python模块调用了testapi脚本,并打印了“test“和”hello“。

注意事项,python调用命令中,python脚本的后缀“.py“要去掉。

通过其他sip server发送呼叫请求到本机,查看日志:

2021-09-14 11:24:40.988720 [NOTICE] switch_channel.c:1114 New Channel sofia/external/10011@192.168.0.110 [73b09c9b-6a62-4372-839b-4c076af7dfc2]
2021-09-14 11:24:40.988720 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->10012 in context public
2021-09-14 11:24:40.988720 [NOTICE] mod_python.c:212 Invoking py module: testapp
2021-09-14 11:24:40.988720 [NOTICE] sofia_media.c:92 Pre-Answer sofia/external/10011@192.168.0.110!
2021-09-14 11:24:40.988720 [NOTICE] switch_cpp.cpp:685 Channel [sofia/external/10011@192.168.0.110] has been answered
2021-09-14 11:24:40.988720 [INFO] switch_cpp.cpp:1443 testCall
2021-09-14 11:24:40.988720 [WARNING] mod_local_stream.c:870 Unknown source moh, trying 'default'
2021-09-14 11:24:40.988720 [ERR] mod_local_stream.c:878 Unknown source default
2021-09-14 11:24:43.988724 [NOTICE] switch_cpp.cpp:733 Hangup sofia/external/10011@192.168.0.110 [CS_EXECUTE] [NORMAL_CLEARING]
2021-09-14 11:24:44.008687 [NOTICE] switch_core_session.c:1744 Session 2 (sofia/external/10011@192.168.0.110) Ended
2021-09-14 11:24:44.008687 [NOTICE] switch_core_session.c:1748 Close Channel sofia/external/10011@192.168.0.110 [CS_DESTROY]

在日志打印中,我们可以看到在dialplan拨号计划的执行过程中,通过mod_python调用了“testapp“,testapp.py脚本中应答了这通呼叫,打印日志”testcall“,并在3秒后挂机。

总结

freeswitch做业务开发时,支持多种语言接入,很方便,用户可以根据自己的技能栈来选择接入方式和语言。
但是,不同语言在呼叫性能上肯定有差异,这个就需要用户自己来测试并评估实际使用中的差别了。


空空如常

求真得真

freeswitch python模块的更多相关文章

  1. 使用C/C++写Python模块

    最近看开源项目时学习了一下用C/C++写python模块,顺便把学习进行一下总结,废话少说直接开始: 环境:windows.python2.78.VS2010或MingW 1 创建VC工程 (1) 打 ...

  2. Python模块之configpraser

    Python模块之configpraser   一. configpraser简介 用于处理特定格式的文件,其本质还是利用open来操作文件. 配置文件的格式: 使用"[]"内包含 ...

  3. Python模块之"prettytable"

    Python模块之"prettytable" 摘要: Python通过prettytable模块可以将输出内容如表格方式整齐的输出.(对于用Python操作数据库会经常用到) 1. ...

  4. python 学习第五天,python模块

    一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...

  5. windows下安装python模块

    如何在windows下安装python模块 1. 官网下载安装包,比如(pip : https://pypi.python.org/pypi/pip#downloads) pip-9.0.1.tar. ...

  6. 安装第三方Python模块,增加InfoPi的健壮性

    这3个第三方Python模块是可选的,不安装的话InfoPi也可以运行. 但是如果安装了,会增加InfoPi的健壮性. 目录 1.cchardet    自动检测文本编码 2.lxml    用于解析 ...

  7. Python基础篇【第5篇】: Python模块基础(一)

    模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...

  8. python 模块加载

    python 模块加载 本文主要介绍python模块加载的过程. module的组成 所有的module都是由对象和对象之间的关系组成. type和object python中所有的东西都是对象,分为 ...

  9. pycharm安装python模块

    这个工具真的好好,真的很喜欢,它很方便,很漂亮,各种好 pycharm安装python模块:file-setting-搜索project inte OK

随机推荐

  1. Aging Cell两篇连发 | 华中科技大学王建枝团队运用蛋白质组学技术发现具有AD早期诊断价值的血小板生物标志物

    阿尔茨海默症 (Alzheimer 's disease,AD) 是一种原发性的中枢神经系统退行性疾病.AD的主要临床症状是缓慢的认知功能减退,包括记忆.逻辑推理能力和语言功能的进行性丟失,最后发展为 ...

  2. Javac 编译器

    编译过程 Javac 编译过程大致可以分为1个准备过程和3个处理过程: 准备过程:初始化插入式注解处理器. 解析与填充符号表过程,包括: 词法.语法分析,将源代码的字符流转变为标记集合,构造出抽象语法 ...

  3. 用 Java 实现常见的 8 种内部排序算法

    一.插入类排序 插入类排序就是在一个有序的序列中,插入一个新的关键字.从而达到新的有序序列.插入排序一般有直接插入排序.折半插入排序和希尔排序. 1. 插入排序 1.1 直接插入排序 /** * 直接 ...

  4. Java TreeMap 和 LinkedHashMap【笔记】

    Java TreeMap 和 LinkedHashMap[笔记] TreeMap TreeMap基本结构 TreeMap 底层的数据结构就是红黑树,和 HashMap 的红黑树结构一样 与HashMa ...

  5. 六种方式,教你在SpringBoot初始化时搞点事情!

    前言 在实际工作中总是需要在项目启动时做一些初始化的操作,比如初始化线程池.提前加载好加密证书....... 那么经典问题来了,这也是面试官经常会问到的一个问题:有哪些手段在Spring Boot 项 ...

  6. bluecms安装错误一记

    菜鸡兴致勃勃下载了bluecms1.6准备大干一番 环境 phpstudy mysql 5.7.26 apache 2.4.39 php 7.3.4 结果安装第四步发现个这个问题   开始还以为自己这 ...

  7. 「移动端」touch事件,touchEvent对象

    随着智能手机普及,有越来越多的手机网页和网页版游戏,手机触摸.移动.旋转等等,多种操作.一般电脑的人机交互靠的是鼠标,而手机用的就是触摸.区别有: PC 端一个电脑只能有一个鼠标,而移动端有多点触摸. ...

  8. SpringBoot获取请求的参数

    说明 SpringBoot 为我们封装了许多,简便的获取请求参数的方法! 1.获取无注解获取请求参数 请求地址:http://192.168.0.115:8080/myproject/test/noA ...

  9. C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)

    两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...

  10. C# WPF 后台调整怎样使用代码把指定控件的Z序调整到最前面呢?

    Panel.SetZIndex(rectangle1, 2); //把前台名称为rectangle1的矩形的ZIndex设置为2