Freeswitch-Python3开发

文章目录

  • 一、Freeswitch如何使用mod_python3
    • 1.1 Freeswitch和python
    • 1.2 Freeswitch版本选择
    • 1.3 Freeswitch编译mod_python3
      • 1.3.1 debian安装python3
      • 1.3.2 Freeswitch编译mod_python3
      • 1.3.3 加载
  • 二、如何编写脚本
    • 2.1 函数的基本框架
    • 2.2 基本使用
      • 2.2.1 触发条件
      • 2.2.2 默认脚本位置
      • 2.2.3 回调参数如何使用参数
        • 2.2.3.1 handler回调函数参数怎么用
        • 2.2.3.2 set事件回调函数参数怎么用
  • 三、致谢

一、Freeswitch如何使用mod_python3

官网地址:https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_python_1048940/#eol

1.1 Freeswitch和python

请注意,mod_python 基于 python2,并将于 2020 年 1 月 1 日停止使用。请使用 mod_python3。

所以我这里就是使用的python3给大家介绍

1.2 Freeswitch版本选择

Freeswitch从1.10.7才开始对python3的支持,所以,你的Freeswitch必须不低于Freeswitch1.10.7。

1.3 Freeswitch编译mod_python3

1.3.1 debian安装python3

pip install -yq python3-dev python3-pip

在这里插入图片描述
说明你安装好了

1.3.2 Freeswitch编译mod_python3

方法一:直接从源开始编译
如果你要从头全部重新编译一下,你可以到源码的freeswitch1_10_7/build/modules.conf.in下面取消这个注释,然后编译
在这里插入图片描述
然后就是正常的编译Freeswitch。如果你还不会编译Freeswitch,请参考
Freeswitch编译安装指南:http://t.csdnimg.cn/tuSVJ

方法二:只编译mod_python3这个模块
首先需要再freeswitch1_10_7源码目录下执行

 ./configure --with-python3=/usr/bin/python3.9

接着在freeswitch1_10_7/src/mod/languages/mod_python3 目录下,执行:

make
make install

或者在源码目录下执行:

make mod_python3-install

可能是我的版本是freeswitch1_10_7还是其他的什么原因,在源码目录下直接执行make mod_python3-install没有成功,我也没有深究。有实验的大佬可以告诉我原因。我就在 freeswitch1_10_7/src/mod/languages/mod_python3 下执行了

编译后,会在/usr/lib/python3/dist-packages下产生freeswitch.py
在这里插入图片描述

有的时候,我们可以直接把freeswitch.py放在对应安装的python3库下面,给你们拷贝了一份freeswitch.py

链接: https://pan.baidu.com/s/127ok_jI2UnIvFqSBGad6xA?pwd=5n45 提取码: 5n45 复制这段内容后打开百度网盘手机App,操作更方便哦

也会在编译后的 /usr/local/freeswitch/mod/产生对应的so和la
在这里插入图片描述

1.3.3 加载

方法一:
在fs_cli的控制台执行:load mod_python3
方法二:
在/usr/local/freeswitch/conf/autoload_configs下,每次启动FS自动加载mod_python3
在这里插入图片描述

在这里插入图片描述
重启FS就可以了

二、如何编写脚本

2.1 函数的基本框架

  • handler 启动函数
  • hangup_hook 处理挂机或转移事件的钩子函数,需通过session.setHangupHook事先设定。
  • input_callback 处理输入事件(如DTMF按键)的回调函数,需通过session.setInputCallback事先设定。
  • fsapi 处理来自fs_cli、拨号计划HTTP请求等的API调用
  • runtime 在独立线程中运行指定函数,通常由fs_cli的pyrun命令触发。
  • xml_fetch 绑定到FreeSWITCH的XML查找功能,用于动态生成或修改XML配置。
# 导入FreeSWITCH的Python模块以实现与FreeSWITCH服务器的交互
import freeswitch"""
FreeSWITCH的mod_python使用示例。此模块使用mod_python默认查找的名称,
但大多数这些名称可以通过在从FreeSWITCH调用模块时使用<modname>::<function>来覆盖。
"""def handler(session, args):"""'handler'是应用程序的默认函数名。它可以被<modname>::<function>覆盖。`session`是会话对象,用于控制通话过程。`args`是一个字符串,包含了模块名之后的所有传入参数。功能:接听电话呼叫,记录日志,设置挂机钩子,设置输入回调,并播放音乐。"""freeswitch.consoleLog('info', 'Answering call from Python.\n')  # 记录接听电话的日志信息freeswitch.consoleLog('info', 'Arguments: %s\n' % args)         # 打印传入的参数session.answer()                                                  # 接听电话session.setHangupHook(hangup_hook)                                # 设置挂机时的回调函数session.setInputCallback(input_callback)                           # 设置输入(如DTMF)的回调函数session.execute("playback", session.getVariable("hold_music"))     # 播放背景音乐,音乐来源为变量hold_music的值def hangup_hook(session, what, args=''):"""处理挂机或转移事件的钩子函数,需通过session.setHangupHook事先设定。`session`: 会话对象。`what`: 字符串,表示触发事件的类型,如"hangup"(挂断)或"transfer"(转移)。`args`: 可选参数,若在设置回调时提供了额外参数,则此处会有值。"""freeswitch.consoleLog("info", "hangup hook for '%s'\n" % what)  # 记录挂机或转移的钩子被触发的日志信息def input_callback(session, what, obj, args=''):"""处理输入事件(如DTMF按键)的回调函数,需通过session.setInputCallback事先设定。`session`: 会话对象。`what`: 字符串,表示事件类型,如"dtmf"(双音多频按键)或"event"(其他事件)。`obj`: 对象,根据what的不同,可能是DTMF对象或事件对象。`args`: 可选参数,同hangup_hook。功能:根据输入类型记录日志,并根据情况暂停输入处理。"""if what == "dtmf":                          # 判断是否为DTMF输入freeswitch.consoleLog("info", what + " " + obj.digit + "\n")  # 记录按下的DTMF键else:freeswitch.consoleLog("info", what + " " + obj.serialize() + "\n")  # 记录其他类型的事件return "pause"  # 返回"pause"以暂停输入处理,等待进一步指令def fsapi(session, stream, env, args):"""处理来自fs_cli、拨号计划HTTP请求等的API调用。`session`: 当从拨号计划调用时为会话对象,否则为"na"。`stream`: 输出流对象,用于向API调用方返回数据。`env`: 环境事件对象,包含调用时的相关环境信息。`args`: 调用该模块时传入的所有参数组成的字符串。功能:根据是否有参数,记录不同日志,并返回环境事件的序列化数据。"""if args:stream.write("fsapi called with no arguments.\n")  # 若有参数,提示无参数调用(这里可能是注释错误,应为有参数)else:stream.write("fsapi called with these arguments: %s\n" % args)  # 记录传入的参数stream.write(env.serialize())  # 将环境事件对象序列化后返回给调用者def runtime(args):"""在独立线程中运行指定函数,通常由fs_cli的`pyrun`命令触发。`args`: 从命令行传递给此函数的参数字符串。功能:简单打印传入的参数。"""print(args + "\n")  # 打印参数并换行def xml_fetch(params):"""绑定到FreeSWITCH的XML查找功能,用于动态生成或修改XML配置。`params`: 包含查找请求详情的事件对象。功能:返回一个示例XML配置,定义了一个简单的拨号计划上下文,用于接听电话并播放音乐。"""xml = '''<?xml version="1.0" encoding="UTF-8" standalone="no"?><document type="freeswitch/xml"><section name="dialplan" description="RE Dial Plan For FreeSWITCH"><context name="default"><extension name="generated"><condition><action application="answer"/><action application="playback" data="${hold_music}"/></condition></extension></context></section></document>'''return xml  # 返回生成的XML配置

2.2 基本使用

2.2.1 触发条件

在这里插入图片描述

2.2.2 默认脚本位置

默认的脚本位置一般在/usr/local/freeswitch/scripts

  1.   如果你有很多脚本,建议在这个文件夹下面在建文件夹;比如说你建立了一个脚本路径为/usr/local/freeswitch/scripts/tests/t1.py
    你的调用方式是tests.t1
  2. 如果tests.t1里面引用了自己定义的包,这个包也在同目录下,是会报找不到这个包的
    解决方式:找到你安装python的位置,然后找dist-packages或者site-packages下面,比如我通过pip install -yq python3-dev python3-pip安装的python3.9,所以我的操作如下

方法一:添加软连接

cd /usr/lib/python3/dist-packages
ln -s /usr/local/freeswitch/scripts/tests .

然后就会找到这个方法了,
方法二:硬核操作,直接添加复制
把/usr/local/freeswitch/scripts/tests/下面引用的包放在/usr/lib/python3/dist-packages下面,不过这样会显得特别臃肿,不建议

方法三:以下内容添加到系统环境启动中

export PYTHONPATH=$PYTHONPATH:/usr/local/freeswitch/scripts/tests

不要忘记,tests 包目录将需要一个 init.py。

在启动 freeswitch 的 shell 中,需要定义这个环境变量。

export 设置的环境变量只在当前 Shell 会话中有效。一旦你退出当前 Shell(例如关闭终端窗口),这些环境变量的设置就会丢失。因此,相对于写入诸如 /.bashrc、/.profile 或 /etc/profile 等配置文件从而实现持久化环境变量设置的方式,直接使用 export 命令所做的设置确实是临时的

2.2.3 回调参数如何使用参数

2.2.3.1 handler回调函数参数怎么用

前面已经介绍了如何handler是拨号计划的回调函数,那么回调函数 handler(session, args)里面有个args参数,这个其实就是额外参数,这里args就是一个字符串。

在这里插入图片描述
只要在里面用空格拼接就可以了,然后使用则会功能则表达式处理下就可以用了

def handler(session, args):"""'handler'是应用程序的默认函数名。它可以被<modname>::<function>覆盖。`session`是会话对象,用于控制通话过程。`args`是一个字符串,包含了模块名之后的所有传入参数。"""freeswitch.consoleLog('info', 'Answering call from Python.\n')  # 记录接听电话的日志信息freeswitch.consoleLog('info', 'Arguments: %s\n' % args)  # 打印传入的参数pairs = re.findall(r'(\w+)=(\S+)', args)# 将匹配到的键值对转换为字典dialplan_args = dict(pairs)# 获取参数ws= dialplan_args.get('ws', None)model=dialplan_args.get('model', "qwen")
2.2.3.2 set事件回调函数参数怎么用

我们通常在handler里面设置一些事件

  • setHangupHook 挂断事件
  • setInputCallback 输入事件

在这里插入图片描述
在这里插入图片描述
这里的回调函数一定要有这些参数,但是args默认是字符串,我们可以把=''删掉。我们来穿一个对象或者多个对象,这里我们就可以用利用字典的方式进行传,然后获取

    # 创建主线程 QueueManager对象main_qm = QueueManager()# 客户说话类speaker = SpeakerStatus()input_callback_args = {'main_qm': main_qm, 'speaker': speaker}session.setInputCallback(input_callback, input_callback_args)hangup_hook_args = {'speaker': speaker}session.setHangupHook(hangup_hook, hangup_hook_args)  # 设置挂机时的回调函数

在这里插入图片描述

三、致谢

写到这里,大家应该就入了门,后面的修行就要看自己了。欢迎讨论微信手机同号18956043585

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pycharm更改远程编辑器设置

pycharm的远程编辑器可以分为两个部分&#xff1a;SFTP服务器(用于传输文件&#xff09;和命令行&#xff08;用于控制linux&#xff09;系统。那么当创建完成后&#xff0c;如何才能更改其设置呢&#xff1f; 一、远程SFTP服务器设置 找到导航栏依次点击tools-deployment-co…

运行vue2项目基本过程

目录 步骤1 步骤2 步骤3 补充&#xff1a; 解决方法&#xff1a; node-scss安装失败解决办法 步骤1 安装npm 步骤2 切换淘宝镜像 #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npmmirror.com 步骤3 安装vue-cli npm install…

取消页面按钮回车事件

html页面登录按钮 <button class"btn btn-success btn-block" id"btnSubmit" data-loading"正在验证登录&#xff0c;请稍候...">登 录</button>js部分 在回车键按下时&#xff0c;阻止默认行为 $(document).keyup(function (event…

采用伪代码及C代码演示如何解决脱机最小值问题

采用伪代码及C代码演示如何解决脱机最小值问题 问题背景算法设计伪代码实现C代码实现证明数组正确性使用不相交集合数据结构最坏情况运行时间的紧确界 问题背景 脱机最小值问题涉及到一个动态集合 &#xff08; T &#xff09; &#xff08;T&#xff09; &#xff08;T&…

并网逆变器学习笔记9---VSG控制

参考文献&#xff1a;《新型电力系统主动构网机理与技术路径》 “构网技术一般包含下垂控制&#xff0c;功率同步控制&#xff0c;虚拟同步机控制&#xff0c;直接功率控制&#xff0c;虚拟振荡器控制 等。其中&#xff0c;虚拟同步机技术&#xff0c;即 VSG&#xff0c;因其物…

蓝牙(2):BR/EDR的连接过程;查询(发现)=》寻呼(连接)=》安全建立=》认证=》pair成功;类比WiFi连接过程。

4.2.1 BR/EDR 流程&#xff1a; 查询&#xff08;发现&#xff09;》寻呼&#xff08;连接&#xff09;》安全建立》认证》pair成功 4.2.1.1 查询&#xff08;发现&#xff09;流程Inquiry (discovering) 类比WiFi的probe request/response 蓝牙设备使用查询流程来发现附近的…

Github 2024-05-24 Java开源项目日报 Top10

根据Github Trendings的统计,今日(2024-05-24统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Java项目10Java设计模式:提高开发效率的正规化实践 创建周期:3572 天开发语言:Java协议类型:OtherStar数量:86766 个Fork数量:25959 次关…

探数API统计分享-1949年-2021年中国历年夏粮产量统计报告

​​​​​​​​中国历年夏粮产量​&#xff0c;为1949年到2021年我国每年的夏粮产量数据。2021年&#xff0c;我国夏粮产量为14596万吨&#xff0c;比上年增长2.2%。 数据统计单位为&#xff1a;万吨 。 我国夏粮产量有多少&#xff1f; 2021年&#xff0c;我国夏粮产量为1…

在Juniper SRX系列防火墙上配置DNS

SRX# set system name-server 17.20.0.11 SRX# show system name-server

vue中v-for的key值怎么使用?如何选择?

在 Vue 中&#xff0c;v-for 指令用于渲染列表数据。当使用 v-for 时&#xff0c;强烈建议为每一项提供一个唯一的 key 属性。这个 key 不仅是 Vue 区分节点的标识&#xff0c;也是 Vue 实现列表高效更新的一种机制。 如何使用 key 在 v-for 中&#xff0c;key 应该绑定到列表…

202206青少年软件编程(Python)等级考试试卷(三级)

第 1 题 【单选题】 下图所示, 有一个名为"书目.csv"的文件。 小明针对这个文件编写了 5 行代码,请问, 代码运行到最后打印在屏幕上的结果是? ( ) with open(书目.csv, r, encoding=utf-8) as f:for line in f.readlines

适配arm架构国产服务器(银河麒麟、中科方德)依赖下载

在计算机硬件领域&#xff0c;两种主流的CPU架构分别是X86和ARM。X86架构&#xff0c;也称为CISC&#xff08;复杂指令集计算机&#xff09;&#xff0c;主要服务于PC和服务器行业。而ARM架构&#xff0c;代表RISC&#xff08;精简指令集计算机&#xff09;&#xff0c;则在移动…

利用Axure模板快速设计,可视化大屏信息大屏,含近200例资源和各类部件

模板类别&#xff1a; **通用模板&#xff1a;**提供基础的布局和设计元素&#xff0c;适用于各种场景。 **行业特定模板&#xff1a;**如农业、医院、销售、能源、物流、政府机关等&#xff0c;针对不同行业提供专业模板。 **数据展示模板&#xff1a;**包括大数据驾驶舱、统…

1.1 什么是internet?

什么是Internet&#xff1a;从具体构成角度 节点 主机及其上运行的应用程序路由器、交换机等网络交换设备  边&#xff1a;通信链路接入网链路&#xff1a;主机连接到互联网的链路主干链路&#xff1a;路由器间的链路  协议  数以亿计的、互联的计算设备:  主机 端系…

webgl开发家居设计软件

WebGL是一种在网页浏览器中渲染3D图形的JavaScript API&#xff0c;它基于OpenGL ES标准&#xff0c;允许开发者创建和显示交互式的3D图形。开发基于WebGL的家居设计软件可以为用户提供一种全新的、沉浸式的家居设计体验。以下是开发此类软件的一些关键步骤和特点。北京木奇移动…

2024 Google I/O 宣布正式支持 Kotlin Multiplatform ,那 KMP 是什么?它的未来在哪里?

基于最近一直有人和我提 KMP &#xff0c;那就简单聊聊。 2024 Google I/O 正式官宣了支持 KMP &#xff0c;而一般意义上的 KMP 指的就是 Kotlin Multiplatform &#xff0c;它是 Google Workspace 团队的一项长期「投资」项目&#xff0c;这里有个重点&#xff0c;那就是 Ko…

Nginx配置文件

当然&#xff0c;让我们一步步来了解Nginx配置文件&#xff0c;即使你是完全的初学者也能轻松跟上。想象一下Nginx是一个超级聪明的接待员&#xff0c;它知道如何处理各种各样的访客请求&#xff0c;而这些规则&#xff0c;我们就写在一个叫做nginx.conf的文件里。 1. 找到配置…

AJAX(JavaScript版本)

目录 一.AJAX简介 二.XMLHttpRequests对象 2.1XMLHttpRequests对象简介 2.2创建XMLHttpRequests对象 2.3定义回调函数 2.4发送请求 2.5XMLHttpRequests对象方法介绍 2.6XMLHttpRequests对象属性 三.向服务器发送请求 3.1发送请求 3.2使用GET还是POST 3.3使用GET来发…

前端nvm、nodejs、npm、cnpm、yarn安装教程(超详细图文,含卸载旧的nodejs,安装及环境变量配置)

最近换了新电脑&#xff0c;一开始在网上找了一个教程让下载nvm-noinstall.zip 压缩包解压使用&#xff0c;踩坑了&#xff0c;过程复杂最后报错无法用。 后来搜到下文教程&#xff0c;直接使用nvm。exe进行安装&#xff0c;方便快捷。下面这个文章写的很详细&#xff0c;从如何…

谷歌快速收录怎么做?

快速收录顾名思义&#xff0c;就是让新的的网页内容能够迅速被谷歌搜索引擎抓取、索引和显示在搜索结果中&#xff0c;这对于做seo来说非常重要&#xff0c;因为它有助于新发布的内容尽快出现在谷歌的搜索结果中&#xff0c;从而增加网站的流量 想做谷歌快速收录谷歌推荐了几种…