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…

采用伪代码及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…

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

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

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

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

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

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

谷歌快速收录怎么做?

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

【MySQL02】【 InnoDB 记录存储结构】

文章目录 一、前言二、InnoDB 行格式1. COMPACT 行格式1.1 记录的额外信息1.2 记录的真实数据1.3 综上 2. REDUNDANT 行格式2.1 字段长度偏移列表2.2 记录头信息 3. DYNAMIC 行格式和 COMPPESED 行格式 三、InnoDB 数据页结构1. File Header (文件头部)2. Page Header (页面头部…

移动硬盘不小心制作成启动盘怎么办?别慌,这样解决更轻松

在数字化时代&#xff0c;移动硬盘作为我们存储和携带重要数据的重要设备&#xff0c;其安全性与便利性不言而喻。然而&#xff0c;在日常使用中&#xff0c;我们可能会遇到一些意想不到的情况&#xff0c;比如一不小心将移动硬盘制作成了启动盘。面对这种情况&#xff0c;许多…

HTTP 重定向 状态码3xx

http状态码301代表永久重定向。当服务器收到客户端的请求时&#xff0c;会将其重定向到另一个url&#xff0c;而不是返回请求的资源。通常用于以下情况&#xff1a; 1、当网站的url结构发生变化或网站迁移到新的域名时。 2、当网站上存在重复内容时&#xff0c;可以使用301状态…

go select 原理

编译器会使用如下的流程处理 select 语句&#xff1a; 将所有的 case 转换成包含 channel 以及类型等信息的 runtime.scase 结构体。调用运行时函数 runtime.selectgo 从多个准备就绪的 channel 中选择一个可执行的 runtime.scase 结构体。通过 for 循环生成一组 if 语句&…

1W、2W 3KVAC隔离 宽电压输入 交直两用AC/DC 电源模块——TP01(02)AZ 系列

TP01(02)AZ为客户提供一款超小体积模块式开关电源&#xff0c;该系列模块电源输出功 率为1W、2W&#xff0c;具有极低的空载损耗&#xff0c;低漏电流仅0.1mA&#xff0c;小体积&#xff0c;隔离耐压高达 3KV等特点。产品安全可靠&#xff0c;EMC 性能好&#xff0c;EMC 及安全…

【低照度图像增强系列(7)】RDDNet算法详解与代码实现(同济大学|ICME)

前言 ☀️ 在低照度场景下进行目标检测任务&#xff0c;常存在图像RGB特征信息少、提取特征困难、目标识别和定位精度低等问题&#xff0c;给检测带来一定的难度。 &#x1f33b;使用图像增强模块对原始图像进行画质提升&#xff0c;恢复各类图像信息&#xff0c;再使用目标检测…

绝缘监测系统在1kV 及以下低压配电系统的应用

安科瑞电气股份有限公司 祁洁 acrelqj 一、系统概述 Acrel-2000L/A 绝缘监测系统设备适用于 1kV 及以下低压配电系统。该设备可以集中采集监测显示绝缘监测仪的数据&#xff0c;实现最多 8 个绝缘监测仪的数据&#xff0c;并且实时记录告警信息和曲线查询。匹配的绝缘监测仪…