首页 FreeSwitch系统介绍(2)

FreeSwitch系统介绍(2)

举报
开通vip

FreeSwitch系统介绍(2)FreeSwitchV1.2.7系统介绍文档标识:当前版本:1.0当前状态:草稿发布日期:发布修改历史日期版本作者修改内容评审号变更控制号2013-3-30V1.0newnewtang理解整体架构,后续再不断补充目录1  引言1.1  编写目的1.2  术语定义1.3  标签类别2  项目背景2.1  背景介绍2.2  组件架构2.3  设计思想3  Core介绍3.1  程序启动3.1.1...

FreeSwitch系统介绍(2)
FreeSwitchV1.2.7系统介绍文档标识:当前版本:1.0当前状态:草稿发布日期:发布修改历史日期版本作者修改内容评审号变更控制号2013-3-30V1.0newnewtang理解整体架构,后续再不断补充目录1  引言1.1  编写目的1.2  术语定义1.3  标签类别2  项目背景2.1  背景介绍2.2  组件架构2.3  设计思想3  Core介绍3.1  程序启动3.1.1  fs-c-0001启动过程说明3.1.2  fs-c-0002消息分发说明4  Module介绍4.1  mod_sofia4.1.1  fs-m-sofia-0001组成4.1.2  fs-m-sofia-0001启动5  参考资料1引言编写目的本文主要用于个人在学习Freeswitch中的一些总结和看法,供后续参考。术语定义本文件中用到的专门术语的定义、外文首字母组词的原词组如下:标签类别每一个条目编号方式可以根据实际情况进行自定义,也可以采用“FS”+“-”+“条目类型”+“序号”的形式。其中“条目类型”可用下表表示,“序号”以自然数表示,位数不限。条目类型英文名称中文名称CCORE核心,内核MMODULE功能模块FFunction功能DData数据UUserInterface用户界面IInterface接口OOther其他示例:FS-C-0001表示为FreeSwitch项目的核心模块第一个条目。2项目背景背景介绍FreeSWITCH是一个可扩展的开源跨平台的电话平台,支持音频、视频、文本或任何其他形式的媒体使用的 协议 离婚协议模板下载合伙人协议 下载渠道分销协议免费下载敬业协议下载授课协议下载 的路由与交互。它于2006年成立。FreeSWITCH也提供一个稳定的技术平台,可供许多电话应用开发利用的免费工具。FreeSWITCH最初由AnthonyMinessale在BrianWest和MichaelJerris的协助下设计和开发。这三人原先都是asterisk的开发者。这个项目的设计目标包括模块化、跨平台的支持,可扩展性和稳定性。今天,许多更多的开发者和使用者都为FreeSWITCH在贡献力量。FreeSWITCH支持各种通信技术,如Skype,SIP、H.323、GoogleTalk,因此它容易与其他的开源PBX进行对接,如:sipXecs、CallWeaver、Bayonne、YATE和Asterisk。FreeSWITCH支持许多高级的SIP特性,如presence、BLF、SLA以及TCPTLS和sRTP。它也可以作为一个透明代理(有媒体或无媒体),扮演SBC和T.38代理的角色。FreeSWITCH既支持宽带、窄带编码。Voicechannel和conferencebridge模块可以支持8k、16k、24k、32k和48k不同的码率,而且这些不同码率的通道可以进行bridge。如果G.729编解码经过授权,FreeSWITCH也是支持的。FreeSWITCH支持Windows,MacOSX,Linux,BSD和Solaris的32与64位平台。FreeSWITCH支持传真,无论是音频,还是T.38,而且可以微微音频和T.38的网关。FreeSWITCH的很多开发者,都是非常有经验的开发人员。他们同时也参与其他开源软交换产品的开发,如:openSER,sipXecs,Asterisk和CallWeaver.目录结构├──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可以仅包括FSCore独立运行,外围各种不同种类的组件(module)增强了FreeSWITCH的功能。开发者可以使用publicAPI,遵循FreeSWITCH的接口 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 ,开发各种不同种类的module来增强FreeSWITCH的功能。设计思想FreeSwitch目标是能专注于一个核心系统,它包含所有的通用函数,即受到保护又能提供给高层的应用。像Asterisk一样,我从ApacheWeb服务器上得到很多启发,并选择了一种模块化的设计。第一天,我做的最基本的工作就是让每一个信道有自己的线程,而不管它要做什么。该线程会通过一个状态机与核心交互。这种设计能保证每一个信道都有同样的、可预测的路径和状态钩子,同时可以通过覆盖向系统增加重要的功能。这一点也类似其它面向对象的语言中的类继承。FreeSWITCH核心提供的的大多数函数和对象都是有保护的,这通过强制它们按照设计的方式运行来实现。任何可扩展的或者由一个模块来提供 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 或函数都有一个特定的接口,从而避免了核心对模块的依赖性。整个系统采用清晰分层的结构,最核心的函数在最底层,其它函数分布在各层并随着层数和功能的增加而逐渐减少。例如,我们可以写一个大的函数,打开一个任意格式的声音文件向一个信道中播放声音。而其上层的API只需用一个简单的函数向一个信道中播放文件,这样就可以将其作为一个精减的应用接口函数扩展到拨号 计划 项目进度计划表范例计划下载计划下载计划下载课程教学计划下载 模块。因此,你可以从你的拨号计划中,也可以在你个性化的C程序中执行同样的playback函数,甚至你也可以自己写一个模块,手工打开文件,并使用模块的文件格式类服务而无需关注它的代码。FreeSWITCH由几个模块接口组成,列表如下:拨号计划(Dialplan):实现呼叫状态,获取呼叫数据并进行路由。终点(Endpoint):为不同协议实现的接口,如SIP,TDM等。自动语音识别/文本语音转换(ASR/TTS):语音识别及合成。目录服务(Directory):LDAP类型的数据库查询。事件(Events):模块可以触发核心事件,也可以注册自己的个性事件。这些事件可以在以后由事件消费者解析。事件句柄(Eventhandlers):远程访问事件和CDR。格式(Formats):文件模式如wav。日志(Loggers):控制台或文件日志。语言(Languages):嵌入式语言,如Python和JavaScript。语音(Say):从声音文件中组织话语的特定的语言模块。计时器(Timers):可靠的计时器,用于间隔计时。应用(Applications):可以在一次呼叫中执行的程序,如语音信箱(Voicemail)。3Core介绍程序启动fs-c-0001启动过程说明FreeSwitch主程序的入库函数在src/switch.c文件中。main()函数启动:1.分析启动参数;2.为全局变量SWITCH_GLOBAL_dirs分配内存和赋值;3.创建pid文件;4.调用switch_core.c中的switch_core_init_and_modload()函数,初始化并加载所有的module。switch_core_init_and_modload()函数内部逻辑实现如下:1.首先调用switch_core_init()执行core的初始化;2.switch_loadable_module_init()[switch_loadable_module.c]加载各module,freeswitch为了后续高效的运行module中的各种接口,将所有的接口都存放到了hash表中,每种接口建立了一个hash桶:switch_core_init()函数内部逻辑实现如下:1.初始化全局变量runtime的相关参数;2.初始化apr_initialize();3.对SWITCH_GLOBAL_dirs指定的目录进行创建;4.switch_core_session_init(runtime.memory_pool);5.load_mime_types加载conf/mime.types加载所有的mime类型;6.设置运行参数的默认值(注意:switch_find_local_ip获取本地IP的时候会访问外网);并依次调用:switch_core_session_init、switch_console_init、switch_event_init、switch_xml_init、switch_log_init进行相关的初始化,初始化的内容主要:hash、mutex。7.加载"switch.conf"配置文件;8.switch_core_state_machine_init对state_machine进行初始化;(donothing…)9.switch_core_sqldb_start,启动数据库相关线程;10.switch_scheduler_task_thread_start,启动定时任务调度模块11.switch_rtp_init:初始化rtp/zrtp相关的12.switch_scheduler_add_task(heartbeat_callback),将心跳任务加入任务调度模块;switch_loadable_module_init()函数内部逻辑实现如下:1.初始化全局变量:loadable_modules的各类hash。2.switch_loadable_module_load_module()加载集成module:CORE_SOFTTIMER_MODULE、CORE_PCM_MODULE;3.遍历conf/modules.conf加载所有配置的module;4.遍历conf/post_load_modules.conf加载所有配置的module;5.如果除集成module之外配置的模块为0,则从SWITCH_GLOBAL_dirs.mod_dir加载所有的mod;6.switch_loadable_module_runtime(),为每个module的runtime入口创建一个线程并运行runtime;switch_loadable_module_load_module_ex()函数内部逻辑实现如下:1.调用switch_loadable_module_process()进行预处理;2.首先根据path找到动态库;dso=switch_dso_open(path,load_global,&derr);3.根据path和#name#_module_interface找到进程入口变量(包括进程入口,进程版本等信息)interface_struct_handle=switch_dso_data_sym(dso,struct_name,&derr);4.执行进程初始化status=load_func_ptr(&module_interface,pool);举例:对于sofia,将会调用src\mod\endpoints\mod_sofia\mod_sofia.cSWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)fs-c-0002消息分发说明1.消息的定义路径:\src\include\switch_types.h
SWITCH_EVENT_CUSTOM        -AcustomeventSWITCH_EVENT_CHANNEL_CREATE    -AchannelhasbeencreatedSWITCH_EVENT_CHANNEL_DESTROY    -AchannelhasbeendestroyedSWITCH_EVENT_CHANNEL_STATE      -AchannelhaschangedstateSWITCH_EVENT_CHANNEL_ANSWER    -AchannelhasbeenansweredSWITCH_EVENT_CHANNEL_HANGUP    -AchannelhasbeenhungupSWITCH_EVENT_CHANNEL_EXECUTE    -Achannelhasexecutedamodule'sapplicationSWITCH_EVENT_CHANNEL_EXECUTE_COMPLETE  -Achannelhasfinshedexecutingamodule'sapplicationSWITCH_EVENT_CHANNEL_BRIDGE  -AchannelhasbridgedtoanotherchannelSWITCH_EVENT_CHANNEL_UNBRIDGE -AchannelhasunbridgedfromanotherchannelSWITCH_EVENT_CHANNEL_PROGRESS    -AchannelhasstartedringingSWITCH_EVENT_CHANNEL_PROGRESS_MEDIA  -AchannelhasstartedearlymediaSWITCH_EVENT_CHANNEL_OUTGOING    -AchannelhasbeenunparkedSWITCH_EVENT_CHANNEL_PARK    -AchannelhasbeenparkedSWITCH_EVENT_CHANNEL_UNPARK    -AchannelhasbeenunparkedSWITCH_EVENT_CHANNEL_APPLICATION-AchannelhascalledandeventfromanapplicationSWITCH_EVENT_CHANNEL_ORIGINATE -AchannelhasbeenoriginatedSWITCH_EVENT_CHANNEL_UUID   -AchannelhaschangeduuidSWITCH_EVENT_API        -AnAPIcallhasbeenexecutedSWITCH_EVENT_LOG        -ALOGeventhasbeentriggeredSWITCH_EVENT_INBOUND_CHAN    -AnewinboundchannelhasbeencreatedSWITCH_EVENT_OUTBOUND_CHAN    -AnewoutboundchannelhasbeencreatedSWITCH_EVENT_STARTUP      -ThesystemhasbeenstartedSWITCH_EVENT_SHUTDOWN      -ThesystemhasbeenshutdownSWITCH_EVENT_PUBLISH      -PublishSWITCH_EVENT_UNPUBLISH      -UnPublishSWITCH_EVENT_TALK        -TalkingDetectedSWITCH_EVENT_NOTALK        -NotTalkingDetectedSWITCH_EVENT_SESSION_CRASH    -SessionCrashedSWITCH_EVENT_MODULE_LOAD    -ModulewasloadedSWITCH_EVENT_MODULE_UNLOAD    -ModulewasunloadedSWITCH_EVENT_DTMF        -DTMFwassentSWITCH_EVENT_MESSAGE      -ABasicMessageSWITCH_EVENT_PRESENCE_IN    -PresenceinSWITCH_EVENT_NOTIFY_IN      -ReceivedincomingNOTIFYfromgatewaysubscriptionSWITCH_EVENT_PRESENCE_OUT    -PresenceoutSWITCH_EVENT_PRESENCE_PROBE    -PresenceprobeSWITCH_EVENT_MESSAGE_WAITING  -AmessageiswaitingSWITCH_EVENT_MESSAGE_QUERY    -AqueryforMESSAGE_WAITINGeventsSWITCH_EVENT_CODEC        -CodecChangeSWITCH_EVENT_BACKGROUND_JOB    -BackgroundJobSWITCH_EVENT_DETECTED_SPEECH  -DetectedSpeechSWITCH_EVENT_DETECTED_TONE   -DetectedToneSWITCH_EVENT_PRIVATE_COMMAND  -AprivatecommandeventSWITCH_EVENT_HEARTBEAT      -MachineisaliveSWITCH_EVENT_TRAP        -ErrorTrapSWITCH_EVENT_ADD_SCHEDULE    -SomethinghasbeenscheduledSWITCH_EVENT_DEL_SCHEDULE    -SomethinghasbeenunscheduledSWITCH_EVENT_EXE_SCHEDULE    -SomethingscheduledhasbeenexecutedSWITCH_EVENT_RE_SCHEDULE    -SomethingscheduledhasbeenrescheduledSWITCH_EVENT_RELOADXML      -XMLregistryhasbeenreloadedSWITCH_EVENT_NOTIFY        -NotificationSWITCH_EVENT_SEND_MESSAGE    -MessageSWITCH_EVENT_RECV_MESSAGE    -MessageSWITCH_EVENT_NAT        -NATManagement(new/del/status)SWITCH_EVENT_FAILURE      -AfailureoccurredwhichmightimpactthenormalfunctioningoftheswitchSWITCH_EVENT_ALL        -Alleventsatonce
typedefenum{SWITCH_EVENT_CUSTOM,SWITCH_EVENT_CLONE,……SWITCH_EVENT_CALL_SETUP_RESULT,SWITCH_EVENT_ALL}switch_event_types_t;2.消息与回调函数绑定与解绑路径:src\include\switch_event.hSWITCH_DECLARE(switch_status_t)switch_event_bind(constchar*id,switch_event_types_tevent,constchar*subclass_name,switch_event_callback_tcallback,void*user_data);SWITCH_DECLARE(switch_status_t)switch_event_unbind(switch_event_node_t**node);3.消息分发机制switch_event_init()时,将初始化EVENT_DISPATCH_QUEUE队列,并创建分发线程;其中队列容量与CPU个数相关联。如下:switch_queue_create(&EVENT_DISPATCH_QUEUE,DISPATCH_QUEUE_LEN*MAX_DISPATCH,pool);switch_event_launch_dispatch_threads(1);具体流程:a.首先Create一个消息,然后push到EVENT_DISPATCH_QUEUE队列;b.由switch_event_dispatch_thread负责分发;4Module介绍mod_sofiafs-m-sofia-0001组成freeswitch的sipmodule的组成是核心模块mod_sofia.dll模块;其实所有其他模块也都是类似的由对应的mod_xxx.dllfreeswitchcoremodule组成,比如mod_fifo.dll/mod_conference.dll等。而freeswitch在启动时是否要加载某个mod,取决于配置文件modules.conf,在Windows平台下,该文件位于/conf/autoload_configs目录下图4.1-1sofia的模块图mod_sofia的组成如下:1)Mod_soifa模块由freeswitch处理sip的应用层(也叫TU-TransactionUser)和Nokiasofiasip协议栈library组成;2)FreesiwtchTU主要处理呼叫并建立对应的呼叫控制数据结构和线程(后续的文档将仔细分析该部分),在本文档中,暂时没有分析这部分,主要分析的是整个的底层架构及流程,以后的文档将分析TU和freeswitch的应用层的处理架构和流程。3)Sofiasip是基于Nokia的一个开源库工程(参考,本文也不对sofiasip的内部细节进行分析,主要分析其关键流程以及和freeswitch的集成架构和流程),sofiasip本身由NTA和NUA组成(当然也包括其他更多的支撑模块),freeswitchsipapp是sofiaNUA的客户,freeswitchsipapp直接和sofiaNUA模块打交道,而sofiaNTA又是NUA的支撑模块。4)Sofiasip既支持UDP传输,又支持TCP传输,对应用层屏蔽,也就是说freeswitchsipapp不用关心底层的传输协议是tcp还是udp,只需要关心自己的业务逻辑就可以了。fs-m-sofia-0001启动Freeswitch在启动时,通过分析/conf/autoload_configs/modules.conf文件,决定要加载的其他模块。…………当mod_sofia被成功加载后,会在console中打印出对应的信息。进程启动请参考fs-c-00002,将会在启动时执行mod_sofia的初始化函数mod_sofia_load,该函数数位于文件mod_sofia.c。SWITCH_MODULE_LOAD_FUNCTION(mod_sofia_load)函数主要完成的工作:1.初始化mod_sofia;如:mod_sofia_globals;sofia消息队列;2.sofia_init():初始化sofiasip协议栈;3.config_sofia(…):实现对sofiasip的所有初始化工作。4.注册modsofiasip的事件处理函数handler,比如SWITCH_EVENT_TRAP事件等。5.Freeswitch会为每个sipUA都创建一个对应的sofia_profile_t*profile数据结构,这个数据结构是mod_sofia_sip的核心数据结构,所有sip相关的信息都最后可以通过这个数据结构追踪到sofia_init()初始化说明:1.首先读取分析\conf\autoload_configs目录下的文件sofia.conf,读取其中指示的目录\conf\sip_profiles目录下的所有*.xml文件2.在freeswitch的设计中,该目录下的每个*.xml文件都实际上对应一个sipTU,他们分别是如下的三个sipUA,前两个是IPv4,最后一个是IPv6的。5参考资料本用户需求说明书包括资料名称、版本号、作者、日期、出版单位或资料来源如下表所示:资料名称版本号作者日期出版单位/资料来源备注
本文档为【FreeSwitch系统介绍(2)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_003124
暂无简介~
格式:doc
大小:78KB
软件:Word
页数:30
分类:
上传时间:2022-08-19
浏览量:14