FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据

FreeSWITCH 简单图形化界面29 - 使用mod_xml_curl 动态获取配置、用户、网关数据

  • FreeSWITCH GUI界面预览
  • 安装FreeSWITCH GUI先看使用手册
  • 1、简介
  • 2、安装mod_xml_curl模块
  • 3、配置mod_xml_curl模块
  • 3、编写API接口
  • 4、测试一下
  • 5、其他注意的地方


FreeSWITCH GUI界面预览

http://myfs.f3322.net:8020/
用户名:admin,密码:admin

FreeSWITCH界面安装参考:https://blog.csdn.net/jia198810/article/details/137820796

安装FreeSWITCH GUI先看使用手册

先看使用手册,先看使用手册,先看使用手册。

这里是手册,这里是手册,这里是手册,
这里是手册,这里是手册,这里是手册,
这里是手册,这里是手册,这里是手册,
这里是手册,这里是手册,这里是手册,

1、简介

在FreeSWITCH的架构中,大部分配置都是通过XML文件来定义的。传统的配置方式是直接编辑这些XML文件。然而,借助于mod_xml_curl模块,我们可以实现配置的动态加载。这意味着配置文件可以通过API接口来获取。

mod_xml_curl模块是FreeSWITCH的一个扩展,它允许系统动态地从远程服务器获取配置信息,而不是依赖静态的XML配置文件。这种灵活性可以带来许多好处,包括但不限于多实例管理、集中式配置管理以及动态配置生成。

使用mod_xml_curl模块,您可以实现以下几种典型用途:

  • 在无需维护多个服务器配置的情况下运行多个FreeSWITCH实例;
  • 中央化管理配置,避免使用复杂的shell脚本来同步配置;
  • 从连接到数据库的Web应用程序动态填充配置;
  • 提供一种简便的方法来自动化部署FreeSWITCH配置,例如在托管的VoIP平台上。

FreeSWITCH的所有配置文件都集中存储在一个主配置文件/usr/local/freeswitch/conf/freeswitch.xml中。这个主配置文件使用include指令,不仅包含各个模块的配置,还涵盖了呼叫路由规则、聊天计划、用户目录信息以及语言设置等关键配置。

<!-- /usr/local/freeswitch/conf/freeswitch.xml 主配置文件内容-->
<?xml version="1.0"?>
<document type="freeswitch/xml"><!-- 全局变量 --><X-PRE-PROCESS cmd="include" data="vars.xml"/><!-- 各个模块的配置文件 --><section name="configuration" description="Various Configuration"><X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/></section><!-- 呼叫规则配置文件 --><section name="dialplan" description="Regex/XML Dialplan"><X-PRE-PROCESS cmd="include" data="dialplan/*.xml"/></section><!-- 聊天计划配置文件 --><section name="chatplan" description="Regex/XML Chatplan"><X-PRE-PROCESS cmd="include" data="chatplan/*.xml"/></section><!-- 用户目录(分机号、gateway)配置文件 --><section name="directory" description="User Directory"><X-PRE-PROCESS cmd="include" data="directory/*.xml"/></section><!-- 语言管理 --><section name="languages" description="Language Management"><X-PRE-PROCESS cmd="include" data="lang/en/*.xml"/><X-PRE-PROCESS cmd="include" data="lang/zh/*.xml"/></section>
</document>

我们可以使用mod_xml_curl模块,通过http访问API接口,按照此文件的格式,分别获取各个模块的配置、用户目录配置、呼叫规则配置。

2、安装mod_xml_curl模块

# 进入freeswitch源码主目录
cd /usr/local/src/freeswitch
# 单独编译安装mod_xml_curl
make mod_xml_curl-install
# 修改modules.conf,自动加载mod_xml_curl
cd /usr/local/freeswitch/conf/autoload_configs
vim modules.conf.xml # 把modules.conf里,mod_xml_curl前面的注释取消
# 尽量确保此模块首先加载,否则可能会导致加载顺序出错。
# 重新启动FreeSWITCH

3、配置mod_xml_curl模块

mod_xml_curl的配置文件路径是/usr/local/freeswitch/conf/autoload_configs/xml_curl.conf.xml,下面是一个典型的配置及注释。

./freeswitch/conf/autoload_configs/xml_curl.conf.xml<configuration name="xml_curl.conf" description="cURL XML Gateway"><bindings><!-- 请求example1.com的拨号计划配置,如果接收到有效响应,则不再继续请求example2.com。如果未接收到有效响应,则继续请求example2.com --><binding name="dialplan"><param name="gateway-url" value="http://example1.com:80/fsapi" bindings="dialplan"/></binding><!-- 如果example1.com返回无效或未找到的响应,则只在此情况下调用此备用配置。如果此网关也未能返回有效配置,则FreeSWITCH将从磁盘查找静态配置文件 --><binding name="dialplan backup"><param name="gateway-url" value="http://example2.com:80/fsapi" bindings="dialplan"/></binding><!-- 请求example1.com的用户目录配置,如果没有找到则恢复到磁盘 --><binding name="directory"><param name="gateway-url" value="http://example1:80/fsapi" bindings="directory"/></binding><!-- 请求example1.com的配置配置,如果没有找到则恢复到磁盘 --><binding name="configuration"><param name="gateway-url" value="http://example1:80/fsapi" bindings="configuration"/></binding><!-- 请求example1.com的语音短语配置,如果没有找到则恢复到磁盘 --><binding name="phrases"><param name="gateway-url" value="http://example1:80/fsapi" bindings="phrases"/></binding></bindings>
</configuration>

参考mod_xml_curl.conf的注释,我们配置一下如下:

<configuration name="xml_curl.conf" description="cURL XML Gateway"><bindings><!--通过http://127.0.0.1:9000/pbx/config接口,获取所有模块的配置文件,  也就是主配置文件freeswitch.xml里的,configuration部分。<section name="configuration" description="Various Configuration"><X-PRE-PROCESS cmd="include" data="autoload_configs/*.xml"/></section>--><binding name="all configs"><param name="gateway-url" value="http://127.0.0.1:9000/pbx/config" bindings="configuration"/><param name="timeout" value="10"/><param name="method" value="GET"/></binding><!--通过http://127.0.0.1:9000/pbx/directory接口,获取分机用户的配置文件,  也就是主配置文件freeswitch.xml里的,configuration部分。<section name="directory" description="User Directory"><X-PRE-PROCESS cmd="include" data="directory/*.xml"/></section>--><binding name="directory"><param name="gateway-url" value="http://127.0.0.1:9000/pbx/directory" bindings="directory"/><param name="timeout" value="10"/><param name="method" value="GET"/></binding><!--通过http://127.0.0.1:9000/pbx/dialplan接口,获取呼叫规则,  也就是主配置文件freeswitch.xml里的,configuration部分。<section name="dialplan" description="Regex/XML Dialplan"><X-PRE-PROCESS cmd="include" data="dialplan/*.xml"/></section>--><binding name="dialplan"><param name="gateway-url" value="http://127.0.0.1:9000/pbx/dialplan" bindings="dialplan"/><param name="timeout" value="10"/><param name="method" value="GET"/></binding></bindings>
</configuration>

其他binding选项,可参考:

名称描述示例
gateway-url绑定的URLhttp://127.0.0.1/pbx/config
gateway-credentialsURL的身份验证用户名和密码user:pass
auth-scheme使用的身份验证方案。支持的值为:basic, digest, NTLM, GSS-NEGOTIATE 或 “any” 用于自动检测basic
method是否使用GET或POST方法GET
timeoutHTTP请求的超时时间(秒)20
enable-cacert-check是否检查服务器的SSL证书以验证其是否由受信任的CA证书颁发(对于HTTPS推荐使用)true
enable-ssl-verifyhost是否检查服务器的SSL证书是否与URL的主机名匹配(对于HTTPS推荐使用)true
ssl-cacert-fileCA证书文件的路径。注意,此选项似乎是必需的,因为模块不会自动搜索系统CA证书。/etc/ssl/certs/ca-certificates.crt
ssl-cert-path客户端证书的路径/etc/ssl/certs/fs_client.crt
ssl-key-path客户端私钥的路径/etc/ssl/private/fs_client.key
ssl-key-password客户端私钥的密码mysecret
ssl-version要使用的SSL/TLS版本。支持的值为 “SSLv3” 或 “TLSv1”TLSv1
disable-100-continue禁用HTTP Expect头中的100 Continue选项,适用于不喜欢此选项的服务器true
cookie-file存储cookies的文件路径/var/run/freeswitch/fs.cookies
enable-post-var定义post参数
bind-local用于HTTP请求的网络接口名称,这可能会影响多宿主服务器上的源地址/路由eth1

3、编写API接口

简单编写api接口,返回数据,示例如下:

from flask import Flask, request, Responseapp = Flask(__name__)@app.route('/pbx/config', methods=['GET'])
def get_configuration():# 这里返回各个模块的配置信息,相关value可以从数据库获取其他数据源获取# xml_response = """<document type="freeswitch/xml"><section name="configuration" description="all configs"><!-- 生成switch.conf.xml文件 --><configuration name="post_load_switch.conf" description="Core Configuration"><settings><param name="rtp-start-port" value="10000"/><param name="rtp-end-port" value="11000"/><param name="max-sessions" value="1000"/><param name="sessions-per-second" value="100"/><param name="switchname" value="Myfs"/></settings></configuration><!-- 生成acl.conf.xml文件 --><configuration name="acl.conf" description="Network Lists"><network-lists><!--  预定义:所有IP地址  --><list name="all.auto" default="allow"> </list><!--  内网  --><list name="LocalNet" default="allow"><node host="192.168.1.0" mask="255.255.255.0" type="allow"/></list></network-lists></configuration><!-- 参考模块配置文件,动态生成其他配置文件即可 --><!-- 生成sofia.conf --><!-- 生成odbc_cdr.conf --><!-- 生成db.conf --><!-- 生成ivr.conf --><!-- 生成callcenter.conf--><!-- 生成voicemail.conf--><!-- 生成nibblebill.conf--><!-- 生成acl.conf--><!-- 生成conference.conf--><!-- 生成freetdm.conf--><!-- 生成unimrcp.conf--><!-- 生成distributor.conf.xml-->......</section></document>"""return Response(xml_response, mimetype='text/xml')@app.route('/pbx/directory', methods=['GET'])
def get_directory():# 这里返回分机用户目录信息,相关value可以从数据库获取其他数据源获取xml_response = """<document type="freeswitch/xml"><section name="directory" description="User Directory"><domain name="$${domain}"><params><param name="dial-string" value="{^^:sip_invite_domain=${dialed_domain}:presence_id=${dialed_user}@${dialed_domain}}${sofia_contact(*/${dialed_user}@${dialed_domain})},${verto_contact(${dialed_user}@${dialed_domain})}"/></params><groups><group name="默认部门"><users><!-- 分机1001--><user id="1001" cacheable="1800000"><params><param name="password" value="1001"/><param name="allow-empty-password" value="false"/><param name="sip-forbid-register" value="false"/></params><variables><variable name="user_context" value="默认权限"/><variable name="video_bandwidth" data="2mb"/><variable name="_jitterbuffer" data="0"/><variable name="tx_vol" data="0"/><variable name="rx_vol" data="0"/><variable name="call_timeout" data="60"/><variable name="sched_hangup" data="7200"/><variable name="limit_max" data="1"/><variable name="_absolute_codec_string" data=""/><variable name="media_processing" data="default"/><variable name="zrtp_secure_media" data="false"/><variable name="sip_secure_media" data="false"/><variable name="effective_caller_id_name" value="1001"/><variable name="outbound_caller_id_name" value="1001"/><variable name="effective_caller_id_number" value="1001"/><variable name="outbound_caller_id_number" value="1001"/><variable name="callgroup" value="1"/><variable name="limit_max" value="1"/><variable name="minimum-session-expires" value="120"/><variable name="sip-force-expires" value="1800"/><variable name="sip-expires-max-deviation" value="600"/><variable name="nibble_account" value="1001"/></variables></user><!-- 分机1002--><user id="1002" cacheable="1800000"><params><param name="password" value="1002"/><param name="allow-empty-password" value="false"/><param name="sip-forbid-register" value="false"/></params><variables><variable name="user_context" value="默认权限"/><variable name="video_bandwidth" data="2mb"/><variable name="_jitterbuffer" data="0"/><variable name="tx_vol" data="0"/><variable name="rx_vol" data="0"/><variable name="call_timeout" data="60"/><variable name="sched_hangup" data="7200"/><variable name="limit_max" data="1"/><variable name="_absolute_codec_string" data=""/><variable name="media_processing" data="default"/><variable name="zrtp_secure_media" data="false"/><variable name="sip_secure_media" data="false"/><variable name="effective_caller_id_name" value="1002"/><variable name="outbound_caller_id_name" value="1002"/><variable name="effective_caller_id_number" value="1002"/><variable name="outbound_caller_id_number" value="1002"/><variable name="callgroup" value="1"/><variable name="limit_max" value="1"/><variable name="minimum-session-expires" value="120"/><variable name="sip-force-expires" value="1800"/><variable name="sip-expires-max-deviation" value="600"/><variable name="nibble_account" value="1002"/></variables></user></users></group></groups></domain></section></document>"""return Response(xml_response, mimetype='text/xml')@app.route('/pbx/dialplan', methods=['GET'])
def get_dialplan():# 这里返回拨号计划信息,相关value可以从数据库获取其他数据源获取xml_response = """<document type="freeswitch/xml"><section name="dialplan" description="Regex/XML Dialplan"><context name="default"><extension name="11113-播放音乐号码"><condition expression="^(11113)$" field="destination_number"><action application="answer"/><action application="playback" data="$${sounds_dir}/sound/fenghuang.wav"/><action application="hangup"/></condition></extension></context></section></document>"""return Response(xml_response, mimetype='text/xml')if __name__ == '__main__':app.run(host='127.0.0.1', port=9000)

4、测试一下

先启动接口,在启动FreeSWITCH,测试一下。

如果先启动FreeSWITCH,FreeSWITCH的mod_xml_curl获取失败,还是读取的本地文件。

5、其他注意的地方

  • mod_xml_curl 从接口获取的数据大小有限制,超过限制,FreeSWITCH会报错。
    可以修改源码里的XML_CURL_MAX_BYTES的值,重新编译该模块。如下图:
    在这里插入图片描述

  • 如果分机数量巨大,接口无需返回所有分机的配置文件,返回该分机的配置文件即可,这样可以减少数据的大小。
    mod_xml_curl在访问API接口时,会传递很多参数,找到传递分机号的参数,从而生成该分机号的配置文件。(分机登录时,都会请求接口,从获取的分机目录xml中,验证用户名和密码是否正确)

  • FreeSWITCH官方文档https://developer.signalwire.com/freeswitch/FreeSWITCH-Explained/Modules/mod_xml_curl_1049001/

祝君好运,国庆快乐

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

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

相关文章

鸿蒙开发(NEXT/API 12)【跨设备互通特性简介】协同服务

跨设备互通提供跨设备的相机、扫描、图库访问能力&#xff0c;平板或2in1设备可以调用手机的相机、扫描、图库等功能。 说明 本章节以拍照为例展开介绍&#xff0c;扫描、图库功能的使用与拍照类似。 用户在平板或2in1设备上使用富文本类编辑应用&#xff08;如&#xff1a;…

【yolo破损纸板-包装盒-快递袋缺陷检测】

yolo破损纸板-包装盒-快递袋缺陷检测 破损纸质包装盒检测方盒型快递包裹检测 破损纸质包装盒检测 数据集合模型 可视化 方盒型快递包裹检测 数据集和模型 train: ../train/images val: ../valid/images test: ../test/images nc: 1 names: - box_packet可视化

股指期权交易详细基础介绍

股指期权是期权市场中的一种特定类型&#xff0c;其标的资产为股票指数。简而言之&#xff0c;它允许投资者在未来某个特定时间&#xff0c;以预先约定的价格&#xff0c;买入或卖出股票指数的权利。在中国&#xff0c;已上市的股指期权包括上证50、沪深300和中证1000股指期权&…

鸿萌数据恢复服务: 修复 Windows, Mac, 手机中 “SD 卡无法读取”错误

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 公司是多款国际主流数据恢复软件的授权代理商&#xff0c;为…

C语言深入理解指针(四)

目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过&#xff0c;&#xff08;字符&#xff09;&am…

Python--TCP/UDP通信

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.客户端与服务端通信原理 1. 服务器端 服务器端的主要任务是监听来自客户端的连接请求&#xff0c;并与之建立连接&#xff0c;然后接收和发送数据。 创建套接字&#xff1a;首先&#xff0…

《使用 LangChain 进行大模型应用开发》学习笔记(四)

前言 本文是 Harrison Chase &#xff08;LangChain 创建者&#xff09;和吴恩达&#xff08;Andrew Ng&#xff09;的视频课程《LangChain for LLM Application Development》&#xff08;使用 LangChain 进行大模型应用开发&#xff09;的学习笔记。由于原课程为全英文视频课…

Gitlab学习(009 gitlab冲突提交)

尚硅谷2024最新Git企业实战教程&#xff0c;全方位学习git与gitlab 总时长 5:42:00 共40P 此文章包含第30p-第p34的内容 文章目录 冲突提交不同人修改不同文件不同人修改同文件的不同区域不同人修改同文件的相同区域 同时变更文件名和文件内容gitLab功能拓展code review代码复…

Mastering Qt 番外 —— 添加源码调试

笔者最近正在尝试深入的学习Qt框架&#xff0c;经常需要明确我经常使用的类底下发生了什么&#xff0c;因此笔者决定仔细研究一下如何进行源码级别的调试 此篇文章将会介绍如何使用Qt Creator这个IDE进行调试。最终效果如下 EasyWay 笔者采用的是这个最简单明了的方式&#xff…

OpenCV基础入门30讲(Python)——第三讲 图像对象的创建与赋值

在OpenCV里&#xff0c;对图像的操作是最为基本的。接下来我们看一下图像对象的创建与赋值。 注&#xff1a;前文介绍过的代码和操作不再重复。 代码 在 main 文件中&#xff0c;先导入新的模块 # 导入 numpy 模块&#xff0c;重命名为 np import numpy as np 再写进以下代…

Cpp类和对象(中)(4)

文章目录 前言一、类的六个默认成员函数二、构造函数构造函数的概念构造函数的特性构造函数的两种分类编译器默认生成构造函数意义及相关问题C11打的补丁 三、析构函数析构函数的概念析构函数的特性验证是否会自动调用析构函数验证析构函数对于内置与自定义类型处理验证先定义后…

LLM - 理解 多模态大语言模型(MLLM) 的 对齐微调(Alignment) 与相关技术 (五)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142354652 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 完备(F…

为什么git有些commit记录,只有git reflog可以看到,git log看不到?

文章目录 原因分析1. git log 只能显示 **可达的** 提交2. git reflog 记录所有引用的变更 常见导致 git log 看不到提交的原因1. git reset 操作2. git rebase 操作3. 分支删除4. git commit --amend5. 垃圾回收&#xff08;GC&#xff09;* 如何恢复 git log 看不到的提交&am…

带你0到1之QT编程:十七、Http协议实战,实现一个简单服务器和一个客户端进行http协议通信

此为QT编程的第十七谈&#xff01;关注我&#xff0c;带你快速学习QT编程的学习路线&#xff01; 每一篇的技术点都是很很重要&#xff01;很重要&#xff01;很重要&#xff01;但不冗余&#xff01; 我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点&#xff01; …

DEPLOT: One-shot visual language reasoning by plot-to-table translation论文阅读

文章链接&#xff1a;https://arxiv.org/abs/2308.01979http://arxiv.org/abs/2212.10505https://arxiv.org/abs/2308.01979 源码链接&#xff1a;https://github.com/cse-ai-lab/RealCQA 启发&#xff1a;two-stage方法可能是未来主要研究方向&#xff0c;能够增强模型可解释…

利用AI增强现实开发:基于CoreML的深度学习图像场景识别实战教程

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

网络安全-利用 Apache Mod CGI

目录 一、环境 二、开始操作 三、总结 一、环境 蚁剑官网拉取 二、开始操作 蚁剑连接 一样终端命令不能执行 可以看到putenv已经禁用 我们开始一下&#xff0c;跳入一个新终端且可以执行命令 我们具体看一下干了什么事情 上传了一个htaccess这个文件的作用是让以后所有ant文…

LAMP架构搭建

目录 LAMP架构搭建 编译安装Apache httpd服务 1、需要的安装包 2、关闭防火墙和核心防护 3、安装环境依赖包 4、配置软件模块 5、编译及安装 6、优化配置文件路径&#xff08;可不做&#xff09; 7、添加httpd系统服务 8、修改httpd 服务配置文件 9、浏览器访问验证…

【Pycharm】Pycharm创建Django提示pip版本需要升级

目录 1、现象 2、分析 3、本质 前言&#xff1a;经常使用pycharm创建django、flask等项目时候提示pip版本需要升级&#xff0c;解决方案 1、现象 使用Pycharm创建Django项目提示安装Django超时&#xff0c;报错建议pip升级22升级到24 2、分析 之前使用命令升级了pip到了24…

linux 基础(一)mkdir、ls、vi、ifconfig

1、linux简介 linux是一个操作系统&#xff08;os: operating system&#xff09; 中国有没有自己的操作系统&#xff08;华为鸿蒙HarmonyOS&#xff0c;阿里龙蜥(Anolis) OS 8、百度DuerOS都有&#xff09; 计算机组的组成&#xff1a;硬件软件 硬件&#xff1a;运算器&am…