FreeSWITCH代码分析(一)

什么是FreeSWITCH

FreeSWITCH 是一个可扩展的开源跨平台的电话平台,支持音频、视频、文本或任何其他形式的媒体使用的协议的路由与交互。它于2006年成立。FreeSWITCH也提供一个稳定的技术平台,可供许多电话应用开发利用的免费工具。

FreeSWITCH 最初由Anthony Minessale在Brian West和Michael Jerris的协助下设计和开发。这三人原先都是asterisk的开发者。这个项目的设计目标包括模块化、跨平台的支持,可扩展性和稳定性。今天,许多更多的开发者和使用者都为FreeSWITCH在贡献力量。

FreeSWITCH支持各种通信技术,如Skype,SIP、H.323、GoogleTalk,因此它容易与其他的开源PBX进行对接,如:sipXecs、Call Weaver、Bayonne、YATE 和Asterisk。

FreeSWITCH支持许多高级的SIP特性,如presence、BLF、SLA以及TCP TLS和 sRTP。它也可以作为一个透明代理(有媒体或无媒体),扮演SBC和T.38代理的角色。

FreeSWITCH既支持宽带、窄带编码。Voice channel和conference bridge模块可以支持8k、16k、24k、32k和48k不同的码率,而且这些不同码率的通道可以进行bridge。如果G.729编解码经过授权,FreeSWITCH也是支持的。

FreeSWITCH支持Windows,Mac OS X ,Linux,BSD和Solaris的32与64位平台。

FreeSWITCH支持传真,无论是音频,还是T.38,而且可以微微音频和T.38的网关。

FreeSWITCH的很多开发者,都是非常有经验的开发人员。他们同时也参与其他开源软交换产品的开发,如:openSER, sipXecs, Asterisk和Call Weaver.

目录结构

├── configure

├── configure.in

├── Makefile.am

├── Makefile.in

├── modules.conf :需要编译的module列表

├── patches/ :补丁包

│ ├── MODAPP-293.diff

│ ├── mod_portaudio_snow_leopard.diff

│ ├── sofia.diff

│ └── zrtp_bnlib_pic.diff

├── src/

│ ├── CMakeLists.txt

│ ├── g711.c

│ ├── include/

│ ├── inet_pton.c

│ ├── Makefile.am

│ ├── Makefile.in

│ ├── mod/

│ ├── switch_apr.c

│ ├── switch_buffer.c

│ ├── switch.c :main入口

│ ├── switch_caller.c

│ ├── switch_channel.c

│ ├── switch_config.c

│ ├── switch_console.c

│ ├── switch_core_asr.c

│ ├── switch_core.c

│ ├── switch_core_codec.c

│ ├── switch_core_db.c

│ ├── switch_core_directory.c

│ ├── switch_core_event_hook.c

│ ├── switch_core_file.c

│ ├── switch_core_hash.c

│ ├── switch_core_io.c

│ ├── switch_core_media_bug.c

│ ├── switch_core_memory.c

│ ├── switch_core_port_allocator.c

│ ├── switch_core_rwlock.c

│ ├── switch_core_session.c

│ ├── switch_core_speech.c

│ ├── switch_core_sqldb.c

│ ├── switch_core_state_machine.c

│ ├── switch_core_timer.c

│ ├── switch_cpp.cpp

│ ├── switch_dso.c

│ ├── switch_event.c

│ ├── switch_ivr_async.c

│ ├── switch_ivr_bridge.c

│ ├── switch_ivr.c

│ ├── switch_ivr_menu.c

│ ├── switch_ivr_originate.c

│ ├── switch_ivr_play_say.c

│ ├── switch_ivr_say.c

│ ├── switch_loadable_module.c

│ ├── switch_log.c

│ ├── switch_mprintf.c

│ ├── switch_nat.c

│ ├── switch_odbc.c

│ ├── switch_pcm.c

│ ├── switch_profile.c

│ ├── switch_regex.c

│ ├── switch_resample.c

│ ├── switch_rtp.c

│ ├── switch_scheduler.c

│ ├── switch_stun.c

│ ├── switch_swig.c

│ ├── switch_swig.i

│ ├── switch_time.c

│ ├── switch_utils.c

│ ├── switch_xml.c

│ └── switch_xml_config.c

├── libs/

启动逻辑

FreeSwitch主程序的入库函数在src/switch.c文件中。Main函数启动:

  1. 分析启动参数;

  2. 为全局变量SWITCH_GLOBAL_dirs分配内存和赋值;

  3. 创建pid文件;

  4. 调用switch_core.c中的switch_core_init_and_modload()函数,初始化并加载所有的module,内部实现逻辑如下:

a) switch_core_init_and_modload

i. 首先调用switch_core_init

  1. 初始化全局变量runtime的相关参数;

  2. 对SWITCH_GLOBAL_dirs指定的目录进行创建;

  3. load_mime_types加载conf/mime.types加载所有的mime类型;

  4. 设置运行参数的默认值(注意:switch_find_local_ip获取本地IP的时候会访问外网);

  5. 依次调用:switch_core_session_init、switch_console_init、switch_event_init、switch_xml_init、switch_log_init进行相关的初始化,初始化的内容主要:hash、mutex。

  6. 加载”switch.conf”配置文件;

  7. switch_core_state_machine_init对state_machine进行初始化;

  8. switch_core_sqldb_start,启动数据库相关线程;

  9. switch_scheduler_task_thread_start,启动任务调度模块

  10. switch_rtp_init:初始化rtp/zrtp相关的

  11. switch_scheduler_add_task( heartbeat_callback),将心跳任务加入任务调度模块;

ii. switch_loadable_module_init()[switch_loadable_module.c]加载各module,freeswitch为了后续高效的运行module中的各种接口,将所有的接口都存放到了hash表中,每种接口建立了一个hash桶:

  1. 初始化全局变量:loadable_modules的各类hash。

  2. 加载集成module:CORE_SOFTTIMER_MODULE、CORE_PCM_MODULE;

a) switch_loadable_module_load_file进行module加载

i. 找到name##_module_interface的全局变量进行加载(module中宏SWITCH_MODULE_DEFINITION定义的);

ii. 执行module->load(会初始化参数module_interface,是SWITCH_MODULE_LOAD_FUNCTION定义的函数的一个参数),load中会增加各类接口:API、CHAT、APP、DIALPLAN、CODEC

b) switch_loadable_module_process

i. 遍历每个节点的endpoint_interface、codec_interface、dialplan_interface、timer_interface、application_interface、api_interface、file_interface、speech_interface、asr_interface、directory_interface、chat_interface、say_interface、management_interface,加载并存储到hash。

c) 创建线程,执行module->runtime()

  1. 遍历conf/modules.conf加载所有配置的module;

  2. 遍历conf/post_load_modules.conf加载所有配置的module;

  3. 如果除集成module之外配置的模块为0,则从SWITCH_GLOBAL_dirs.mod_dir加载所有的mod;

  4. switch_loadable_module_runtime,为每个module的runtime入口创建一个线程并运行runtime;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FreeSWITCH 是一个开源的电话系统,它提供了灵活、可扩展的呼叫处理和媒体处理能力。FreeSWITCH 的源码分析可以帮助开发者更好地理解和定制 FreeSWITCH 的功能。 FreeSWITCH 的源码分析可以从以下几个方面入手: 1. SIP 协议栈:FreeSWITCH 使用 SIP 协议与其他电话系统进行通信。因此,SIP 协议栈是 FreeSWITCH 的核心之一。SIP 协议栈的实现主要是在 sofia-sip 库中。开发者可以仔细分析 sofia-sip 库的源码,了解 SIP 协议的各个细节。 2. 呼叫路由:FreeSWITCH 的呼叫路由是通过 Dialplan 实现的。Dialplan 是一个类似于脚本的语言,可以根据不同的条件来决定如何处理呼叫。开发者可以仔细分析 Dialplan 的语法和执行过程,了解 FreeSWITCH 的呼叫路由规则。 3. 媒体处理:FreeSWITCH 可以处理各种类型的媒体流,包括语音、视频、Fax 等等。媒体处理涉及到音频编解码、RTP/RTCP 协议、语音识别、语音合成等等技术。开发者可以仔细分析 FreeSWITCH 的媒体处理模块,了解各种媒体处理技术的实现细节。 4. 事件处理:FreeSWITCH 可以向应用程序发送各种事件,例如呼叫建立事件、呼叫结束事件等等。应用程序可以根据这些事件来实现自己的业务逻辑。开发者可以仔细分析事件处理模块,了解事件的类型、格式和处理流程。 总体来说,FreeSWITCH 的源码比较庞大,但是通过仔细分析源码,可以比较清楚地了解 FreeSWITCH 的各个模块的实现细节。同时,开发者还可以根据自己的需求,定制 FreeSWITCH 的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值