11 HYQ458941968

尚未进行身份认证

我要认证

熟悉 音视频、嵌入式、SIP、VOIP相关行业技术,多平台开发经验。嵌入式Linux最熟,Windows和Android初级。 个人QQ:985087028

等级
TA的排名 8w+

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

freeswitch系列31注册流程

freeswitch中的sip架构freeswitch的结构图如上,蓝色箭头是调用,绿色箭头是回调。最底层的是第三方库,一个sip协议栈,实现sip信令协议,构造sip当中的各个字段。核心层主要维护跟会话,通路相关的信息,它不依赖于sip,但是会被逻辑层用到。mod_sofia是一个端点模块,它可以理解为逻辑层,实现注册、呼叫等业务,它一方面跟sip协议栈交互,调用sip协议栈去发送信令,提供回调,用于接收信令、状态变化。另一方面,它也通过核心层,构建session和channel,并且还是通..

2020-05-12 15:43:27

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

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

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

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

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

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

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

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

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

freeswitch系列1概述

1、PBX与freeswitchPBX是Private Branch eXchange的缩写形式,用户级交换机,即公司内部使用的电话业务网络,系统内部分机用户分享一定数量的外线。FreeSwitch是一个开源的电环交换平台,是一个跨平台的/伸缩性极好的/免费的/多协议的电话软交换平台。从下面两张拓扑图可以看出PBX的作用。图一模式,公司内部只能有7部电话,使用7个运营商号码。图二模式,...

2020-01-20 15:29:14

pjmedia系列之媒体设备pjmedia_snd_port

在simpleua.c文件,当协商成功call_on_media_update中,会创建音频设备对象。static pjmedia_snd_port *g_snd_port; /* Sound device. */static void call_on_media_update( pjsip_inv_session *inv, pj_status_t status){}...

2019-09-30 16:17:59

pjmedia系列之媒体流pjmedia_stream

前面讲过,一个会话可以有多个流,比如音频流、视频流,这里讲一个音频流有哪些东西。媒体流struct pjmedia_stream{ pjmedia_endpt *endpt; /**< Media endpoint. */ pjmedia_codec_mgr *codec_mgr; /**< Codec manager...

2019-09-25 20:04:29

pjmedia系列之媒体传输pjmedia_transport

媒体传输封装了网络收发细节,pjmedia_transport可以是udp、srtp、ice等,这里以udp为例。结构体pjmedia_transport/** * This structure declares media transport. A media transport is called * by the stream to transmit a packet, and...

2019-09-19 20:00:23

pjmedia系列之媒体端点pjmedia_endpt

simpleua.c在进行媒体相关初始化时,首先创建媒体端点,看看媒体端点的数据结构和创建流程。#if PJ_HAS_THREADS status = pjmedia_endpt_create(&cp.factory, NULL, 1, &g_med_endpt);#else status = pjmedia_endpt_create(&cp.fac...

2019-09-19 19:39:16

pjmedia系列开篇

pjlib系列完结后,开始进入pjmedia系列。pjmedia是多媒体栈,可以把它按照抽象的分解大小分解为几个对象,下面通过simpleua.c示例代码解析这些对象和数据流。从对象关系来看:1、 pjmedia_endpt,代表一个媒体端点,端点可以理解为一个节点,可以是服务器或者客户端,一个设备一般只会有唯一一个端点,而且在初始化的时候创建。2、pjmedia_session,代表...

2019-09-17 20:15:10

pjlib系列之数学统计math

之前在看pjmedia的jbuf时,发现里面用到了pjlib中的数学统计,来实现抖动的测量。进去查看,发现方差的实现跟定义完全不一样,非常简洁,推导了1个多小时,终于推导出里面的代码实现原理。果然,程序员都是给数学家打工的。pjlib实现的数学和统计文件是math.h,没有math.c文件,所有实现都内联在头文件。其中统计结构体如下:/** * This structure descr...

2019-09-03 23:20:48

pjlib系列之日志log

日志用法使用之前需要初始化日志,但这一步是内部函数pj_init自己调用的,应用程序无需显示调用。/** * Internal function to be called by pj_init() */pj_status_t pj_log_init(void);* PJ_LOG(3, ("main.c", "Starting hello..."));* PJ_LOG...

2019-09-06 11:29:53

pjlib系列之网络安全

本文占位,关于加密知识还未整理,先不深入研究,这里从注释知道,使用SSL和TLS的网络加密。

2019-09-05 20:36:08

查看更多

勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv4
    勤写标兵Lv4
    授予每个自然周发布9篇以上(包括9篇)原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。