freeswitch

freeSwitch入门

2022-07-13  本文已影响0人  Robin92

阅读《FreeSWITCH 权威指南》笔记。

简单使用

windows 安装 FreeSwitch

自己的电脑系统是 xubuntu 22.10 Ubuntu Kinetic Kudu (development branch) 版本,linx 安装 FreeSwitch 需要自己编译安装,里面安装编译会出错,所以采用虚拟机 windows 安装。windows 安装很方便,不再赘述。

freeswitch 默认开启了 1000~1019 的号码,默认密码为 1234。

可通过配置文件 安装目录下\conf\directory\default\ 内查看各个号码的配置信息,其中的变量如 $${default_password}安装目录\conf\vas.xml 中定义。

启动 freeswitch 在开始菜单的列表中 右键程序-以管理员身份运行 进行启动,当出现如下界面时即启动完成。

image.png

sip客户端安装、登陆、呼叫

在 Windows 中用的是 MicroSip,安装和使用都很方便(仅使用于 Windoes)。下载链接

手机端用的是 SipDroid,在手机浏览器中找的下载链接。配置登陆号码见下方截图(域名即 FreeSwitch 所安装机器的 IP 地址)。

手机端和 MicroSip 的配置几乎是一样的,不过需要在同一个局域网中。我是用手机分出了 Wifi 让主机连接,然后 VirtualBox 使用桥接的方式连上主机网络。多个终端也可以通过多开几个虚拟机安装 MircoSip 的方式实现。

image.png

不同客户端通过登陆不同的号码,就可以通过电话进行呼叫和通话了。

image.png

启动 FS 后,在安装包中还有一个 fs-cli 是可以连接到 FS 的客户端,和 FS 一样的输入输出,但关闭不影响服务程序。

FreeSwitch 基本命令

sofia status profile internal reg # 查看已注册(登陆)设备(号码)
originate user/1000 &park # 通过 1000 拨打电话到 park 程序
# 程序(APP)其实为 freeswitch 内置的函数(注意使用时加上 & 符号):
  # park 挂起(听不到任何声音)
  # hold 挂起(能听到声音,Music On Hold, MOH)
  # playback(/root/welcome.wav) 播放特定的声音文件
  # record(/tmp/rec.wav) 录音文件
  # bridge(user/1001)  转接到 1001
show channels # 显示通话中的一些信息,包含 UUID
uuid_bridge <uuid1> <uuid2> # 将两个 channel 桥接起来
help # 帮助
sofia help # 模块帮助
sofia global siptrace on # 开启 sip 信息的显示,用 off 可以关闭。

FreeSWITCH 架构

以下 FS 表示 FreeSWITCH 的缩写。

总体架构

总体来说包括 核心外围模块 组成。核心短小精悍高稳定高安全,外围模块通过调用核心提供的 API 与核心进行通信,核心通过让外围模块注册回调函数执行外围模块代码。

核心主要有四部分:DB、公共接口(Public API)、抽象接口和事件(Event)。

外围接口实现

目录结构

在安装目录下

sounds 提供各种声音文件,sounds/music 提供 MOH(Music On Hold,保持音乐)
storage 存放从其他 HTTP 服务器下载下来的语音文件缓存及录音留言文件
conf 存放配置文件

着重介绍下配置文件,配置文件由众多 XML 组成系统装载时,会将 XML 组织在一起 Load 到内存,成为 XML 注册表。

XML 用户目录

SIP 不要求一定要注册才可以打电话,但通话前仍需用户认证,认证参数即中用户目录中进行配置。即用户目录决定了哪些用户能注册到 FS 中。

<include>
    <domain name="$${domain}">
        <params>
            <param name="dial-string" value="..."/>
        </params>
        <variables>
            <variable name="record_stereo" value="true"/>
        </variables>
        <groups>
            <group name="sales">
                <users>
                    <user id="1000" type="pointer"/>
                </users>
            </group>
        </groups>
    </domain>
</include>

default.xml 是自带默认的配置文件。其中 $${domain} 默认变量值是主机 IP 地址,可以将他修改为一个域名。

呼叫相关概念

两种典型流程:

市场上有对方式二的变种,流程为 a) B -> FS 随即 FS 挂掉电话;b) FS -> B && FS -> A。好处:接电话不会被收费。(华为中 Welink 呼叫就是这个流程)。

Early Media 的流量不包含在通信费中,一般是在月租或套餐中的收费的,所以可以将真正的话音数据伪装成 Early Media 实现“免费通话”。但这种应用有一定的限制,大多数交换机允许的 Early Media 不会太常,如 1 分钟,以避免这种免费通话。

拨号计划 DialPlan

找到了本章的在线读书笔记可参考。

从配置文件看工作流程

配置文件的拨号计划又叫 XML DialPlan,下文还会降到 内联拨号计划。

拨号计划默认用 XML 格式配置。DailPlan 的完整结构的配置是这样的嵌套结构(简写了 xml 文件):

- document
  - section(name: dialplan)
    - context 
      - extension # extension 与 extension 之间在逻辑上是隔离的
        - condition(field="xxx" expression="^echo|1234$") # 测试条件,指定表达式
          - action(application="info" data="xxx") # 执行动作
<extension name="My Echo Test"> <!-- 测试时名字没改,忽略其意义就好 -->
    <condition expression="^1234(\d+)$" field="destination_number">
        <action application="log" data="INFO you called ${destination_number}"/> <!-- log 数据首单词可设置级别 -->
        <action application="log" data="NOTICE the suffix is $1"/>
        <action application="hangup"/>
    </condition>
</extension>
image.png

工作机制

Channel 状态机转换工程: NEW - INIT - ROUTING/HUNTING - EXECUTE - HANGUP - REPORTING - DESTROY
新建 Channel - 初始化 - 路由(查找解析 Dialplan) - 执行动作 - 挂机(某一方执行)- 包好(统计计费) - 销毁(释放资源)
在 执行 阶段,也可以发生转移(Transfer),转移到同一个 Context 下不同 Extension,转移后会重新进入 Routing 阶段。

注意:

内联拨号计划

可以把前面讲到的拨号计划成为“XML 拨号计划”。内联拨号计划(Inline Dialplan),用于快速测试不同的 action,可以直接在命令行中写出对应的命令:

originate user/1000 answer,playback:/tmp/a.wav,record:/tmp/b.wav inline
# 解释:使用 1000 拨打,首先 answer,然后放音 a.wav,然后录音到 b.wav

如上注释中的解释,不再重复了,其中:

调用 API

在拨号计划中可以调用一些 API,使用方法和引用变量一样,不过变量为函数,如 ${version()} 获取版本。 ${expr(1+1)} 计算一个表达式。

调试技巧

一般流程:发现问题 - 定位问题 - 分析问题 - 解决问题。

originate 命令详解

originate # 使用 FS 发起呼叫(默认主叫号码是 000000000)
-USAGE: <call url> <exten>|&<application_name>(<app_args>) [<dialplan>] [<context>] [<cid_name>] [<cid_num>] [<timeout_sec>]

实际上,bridge 和 oiginate 底层用的同一个函数实现,伪代码是 originate(session, new_session, dial_str) 差别在于 originate 调用函数是 session 字段为 null。

呼叫的完整逻辑

假设 1000 呼叫 1001

总结主流程:1000 Invite -> sofia profile -> FS context -> dialplan -> action (bridge 1001) -> invite 1001。

external.xml 配置(5080 会走这里)
auth-calls 为 false,所以不进行鉴权
context=public 其中也没有每一个 user 上配置的 user_context(internal 中也有 context=public 但走 user_context)

FS GUI

图形化界面实现一般有两种方式:

如:

上一篇下一篇

猜你喜欢

热点阅读