Freeswitch|Freeswitch 开发日记

欢迎参考 在此记录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》// https://blog.csdn.net/yetyongjin/category_10047301.html 这里有翻译为中文的博客连接。
  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|Freeswitch 开发日记
文章图片

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|Freeswitch 开发日记
文章图片

  1. 返回407,
Freeswitch|Freeswitch 开发日记
文章图片

3. 重发带response的INVITE
Freeswitch|Freeswitch 开发日记
文章图片

如何设置媒体处理模式 【2020-7-1】 【Freeswitch|Freeswitch 开发日记】几种模式的比较
模式 功能 使用场景
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 模式,其他模式注释掉,还要在Dailplan中 ,在打电话bridge 之前
Bypass Media conf\sip_profiles\internal.xml中在sip_profile 中设置bypass-media模式,其他模式注释掉,还要在Dailplan中的default.xml的local-extension中设置bypass-media=true

    推荐阅读