![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
freeswitch
HYQ458941968
这个作者很懒,什么都没留下…
展开
-
freeswitch系列1概述
1、PBX与freeswitchPBX是Private Branch eXchange的缩写形式,用户级交换机,即公司内部使用的电话业务网络,系统内部分机用户分享一定数量的外线。FreeSwitch是一个开源的电环交换平台,是一个跨平台的/伸缩性极好的/免费的/多协议的电话软交换平台。从下面两张拓扑图可以看出PBX的作用。图一模式,公司内部只能有7部电话,使用7个运营商号码。图二模式,...原创 2020-01-20 15:29:14 · 1346 阅读 · 0 评论 -
freeswitch系列2初始化
1、核心头文件freeswitch是服务端程序,它的入口main函数在src/switch.c实现,相关的头文件还有switch.h、private/switch_core_pvt.h。先看下switch.h内容。#include <stdlib.h> #include <stdio.h> #include <stdarg.h> #include...原创 2020-01-21 14:51:02 · 889 阅读 · 0 评论 -
freeswitch系列3加载模块
可加载模块数据结构可加载模块相关的文件如下switch_loadable_module.hswitch_loadable_module.cswitch_types.hswitch_module_interfaces.h在switch_loadable_module.c定义了可加载模块容器和可加载模块对象:structswitch_loadable_module{ char*key; char*filename; intperm;...原创 2020-05-12 14:47:51 · 1464 阅读 · 0 评论 -
freeswitch系列4 session
初始化session在switch_core_session.c实现,在switch_core_pvt.h定义相关数据结构。在第2章节初始化的时候,在核心初始化里会调用session初始化。voidswitch_core_session_init(switch_memory_pool_t*pool) { memset(&session_manager,0,sizeof(session_manager)); session_manager.sess...原创 2020-05-12 14:57:40 · 2022 阅读 · 2 评论 -
freeswitch系列5 channel
初始化channel在switch_channel.c实现,在switch_channel.h定义相关数据结构。在第2章节初始化的时候,在核心初始化里会调用channel_global初始化。staticstruct{ switch_memory_pool_t*pool; switch_hash_t*device_hash; switch_mutex_t*device_mutex; switch_device_state_bind...原创 2020-05-12 15:01:34 · 2975 阅读 · 1 评论 -
freeswitch系列6数据库
数据库体系freeswitch默认使用sqlite3数据库,但也支持odbc使用其它数据库,或者PostgreSQL这是支持的三类数据库类型,从定义可以看出。typedefenum{ SCDB_TYPE_CORE_DB, SCDB_TYPE_ODBC, SCDB_TYPE_PGSQL }switch_cache_db_handle_type_t;switch_core_db.c实现sqlite核心数据库,switch_odb...原创 2020-05-12 15:08:12 · 1917 阅读 · 0 评论 -
freeswitch系列7 IO
freeswitch的大部分媒体逻辑在switch_ivr_*.c中实现,但是这些是功能逻辑,最后会调用switch_core_io.c中的读写帧函数进行io操作。本章不分析功能,只对读写帧这些底层IO的API进行分析。switch_core_session_read_frame读写帧代码比较长,这里对关键流程进行注解。对一些参数进行判断if(!switch_core_codec_ready(session->read_codec)){从端点读帧...原创 2020-05-12 15:16:01 · 1031 阅读 · 1 评论 -
freeswitch系列8 media
初始化media在switch_core_media.c实现,完成媒体协商的功能。这部分本来是在mod_sofia实现的,后来增加了webrtc支持,就独立出来。还有一个media_bug.c,实现监控媒体。在core初始化的时候,会调用media的初始化。SWITCH_DECLARE(void)switch_core_media_init(void) { switch_core_gen_certs(DTLS_SRTP_FNAME".pem"); ...原创 2020-05-12 15:23:44 · 1629 阅读 · 0 评论 -
freeswitch系列9 rtp
初始化rtp在switch_rtp.c中实现,里面不仅包括rtp,还包括跟媒体传输相关的几个组件,rtcp、dtmf、 srtp、zrtp,本次先完成rtp部分。在core初始化的时候,同样会进行rtp初始化。SWITCH_DECLARE(void)switch_rtp_init(switch_memory_pool_t*pool) { #ifdefENABLE_ZRTP constchar*zid_string=switch_core_get_varia...原创 2020-05-12 15:25:28 · 2053 阅读 · 0 评论 -
freeswitch系列21模块sofia
mod_sofia加载在可加载模块那一章节说过,一个模块的加载,主要是调用load函数,也可以理解为模块初始化函数,下面分析下,mod_sofia加载做了哪些事。 全局结构体mod_sofia_globals mod_sofia.c开头定义了两个全局结构体,其中一个是端点接口,前面也说过,sofia是一类最重要的端口。structmod_sofia_globalsmod_sofia_globals; switch_endpoint_interface_t*sofia_...原创 2020-05-12 15:29:12 · 1562 阅读 · 0 评论 -
freeswitch系列31注册流程
freeswitch中的sip架构freeswitch的结构图如上,蓝色箭头是调用,绿色箭头是回调。最底层的是第三方库,一个sip协议栈,实现sip信令协议,构造sip当中的各个字段。核心层主要维护跟会话,通路相关的信息,它不依赖于sip,但是会被逻辑层用到。mod_sofia是一个端点模块,它可以理解为逻辑层,实现注册、呼叫等业务,它一方面跟sip协议栈交互,调用sip协议栈去发送信令,提供回调,用于接收信令、状态变化。另一方面,它也通过核心层,构建session和channel,并且还是通..原创 2020-05-12 15:43:27 · 2437 阅读 · 0 评论 -
freeswitch系列32通话流程
呼叫信令流程呼叫的信令交互是比较复杂的,大概分3个阶段:阶段1:A发送invate请求给服务器,服务器发现未认证,回复407; A再次发送invite,带上认证信息,服务器通过。阶段2:服务器向另一方B发送invite请求,B回复180。 服务器向A回复180,A开始响铃。阶段3:B接起电话,发送200OK给服务器 服务器发送200OK给A 阶段1sip协议栈通知应用是通过回调sofia_event_callback,和注册一样,这里会创建session和chan..原创 2020-05-12 15:52:00 · 1645 阅读 · 0 评论