欢迎参考

在此记录freeswitch开发的点点滴滴,供同行交流。欢迎大家多留言讨论,如此,这一主题才能壮大下去。

Sofia library 【2020-6-22】

Freeswitch采用Sofia SIP开源库处理SIP协议,Sofia SIP开源库由Nokia开发,进一步了解代码库可以参考网页:http://sofia-sip.sourceforge.net/development.html

Freeswitch 参考书 【2020-6-22】

Freeswitch 相关的书很少,最好的参考资料就是源代码。

  1. 一些参考资料可以帮助入门,个人认为国内的杜金房所著 《FreeSWITCH权威指南完整版》有一定的参考意义
  2. 国外Freeswitch核心开发人员写的三本书也可看看。
    《Mastering FreeSWITCH》
    《FreeSWITCH 1.6 Cookbook》
    《freeswitch1.8》// 这里有翻译为中文的博客连接。
  3. SIP协议是基础,是必须学习的。推荐学习SIP协议一本好的书:《Sip Understanding the Session Initiation Protocol》第四版。

FS_cli 常用命令 【2020-6-23】

show 显示统计信息,命令show直接列出可显示的信息
例如:show calls, show registrations等
sofia, 列出sofia库相关的命令
例如:sofia global siptrace on //打开sip相关的log

Freeswitch编译路径 【2020-6-23】

Freeswitch编译后放置的路径由prefix指定,否则用默认的路径。参见configure文件里的语句:

if test "x$prefix" = "xNONE" ; then
    prefix='/usr/local/freeswitch'
fi

SIP字段笔记 【2020-6-23】

SIP中两个重要的概念,Dialog和Transaction。Dialog和Transaction是如何标识的呢?

  1. From和To两个域包含的Tag以及Call-ID组合标识一个Dialog(一个会话),一个电话包含的消息Invite、180 Ring、200 Ok、Ack、Bye,它们对应一个dialog,其中的call-Id都是一样的,Tag组合也是一样的。(subscribe,200 Ok 和 notify是一个dialog, message和200 Ok也是一个dialog)
  2. Via域包含的Branch用于标识一个Transaction(如:Invite、Ack、Bye),一个Transaction中所有的回应消息, Branch字段,From和To两个域是一样的。
    例如 Invite 以及对应的response 180 Ring,200 Ok, 他们的 Branch字段以及From和To两个域是一样的。

SIP调试神器 【2020-6-24】

sngrep可以可视化显示呼叫过程中SIP流程。
sngrep开源软件的网址为:https://github.com/irontec/sngrep。
可以直接安装编译的安装包,以centos安装为例:

  1. 添加 /etc/yum.repos.d/irontec.repo文件,文件中输入以下内容:
[irontec]
name=Irontec RPMs repository
baseurl=http://packages.irontec.com/centos/$releasever/$basearch/
  1. 执行以下命令添加 Irontec repositories 的公钥
rpm --import http://packages.irontec.com/public.key
  1. 执行以下命令开始安装
yum install sngrep

下面是SIP显示的例子:

freeswitch源码调用其他模块api freeswitch开发文档_xml

SIP认证算法MD5 【2020-6-29】

SIP认证采用MD5算法时,MD5结果取32位小写。具体产生response的过程如下:

  1. 生成ha1
    ha1 = MD5(username “:” realm “:” password)
  2. 生成ha2
    ha2 = MD5(method “:” req_uri)
  3. 生成response digest
    当 qop 为空时:
    response = MD5(ha1 “:” nonce “:” ha2)
    当qop=auth 时:
    response = MD5(ha1 “:” nonce “:” nc “:” cnonce “:” qop “:” ha2)

下面是一个认证的实例:

response = MD5(ha1 ":" nonce ":" nc ":" cnonce ":" qop ":" ha2)
               = MD5(dbf2766cb7e77e0c5ae00cc23f78397b:58971392-ea2f-48b4-a118-0f808d111999:00000001:017a526603e5a15f:auth:442f0464c91da85e6d6e40d47e2ff57c) = 510d6f4e39ab0418d6ac8f640645a4ed
ha1= MD5(username ":" realm ":" password) 
    = MD5(1001:119.23.67.126:1234)= dbf2766cb7e77e0c5ae00cc23f78397b
ha2 = MD5(method ":" req_uri) 
    = MD5(INVITE:sip:1000@119.23.67.126) = 442f0464c91da85e6d6e40d47e2ff57c

1.发送INVITE

freeswitch源码调用其他模块api freeswitch开发文档_freeswitch_02

  1. 返回407,

freeswitch源码调用其他模块api freeswitch开发文档_f5_03


3. 重发带response的INVITE

freeswitch源码调用其他模块api freeswitch开发文档_freeswitch_04

如何设置媒体处理模式 【2020-7-1】

几种模式的比较

模式

功能

使用场景

a.默认方式

媒体通过freeswitch,RTP被freeswtich转发,freeswitch控制编码的协商并在协商不一致时提供语音编码转换能力,支持录音,二次拨号等。

更适合呼叫中心等富功能应用,但性能相比其他两个也是最差的

b.代理模式(Proxy Media)

媒体通过freeswitch转发,但是不处理媒体,RTP通过freewtich转发(只改动sdp c= ip)freeswtich不控制 sdp参数,只是转发。通话的终端必须有一致的语音或者视频编码,因为freeswitch此时不支持转码(适合视频编码)不支持录音, 二次拨号等功能

更适合处理nat问题,可以考虑用这种模式做一个session border controlor,也适合于外部MCU配合做为视频会议,性能也明显好于a

c.旁路模式(Bypass Media)

不转发也不处理媒体,FS不会对SDP控制,音视频也不走FS。此模式下freeswitch更像是一个信令proxy,媒体不会通过freeswitch,sdp消息体不做修改,没有录音,二次拨号等功能

更像是一个信令代理,性能最高,但提供的功能有限

模式配置

模式

配置

Proxy Media

conf\sip_profiles\internal.xml 在 sip_profile 中设置proxy media 模式,其他模式注释掉,<param name=“inbound-proxy-media” value=“true”/>还要在Dailplan中 ,在打电话bridge 之前<param name=“set” value=“proxy_media=true”/>

Bypass Media

conf\sip_profiles\internal.xml中在sip_profile 中设置bypass-media模式,其他模式注释掉,<param name=“inbound-bypass-media” value=“true”/>还要在Dailplan中的default.xml的local-extension中设置bypass-media=true