freeswitch透传带SDP的180

 

概述

freeswitch是一款简单好用的VOIP开源软交换平台。

freeswitch对于180/183的消息处理有默认的规则,但是在3GPP的标准中,消息流程会更加复杂,场景更多变。

这样就需要我们根据实际环境中的场景定制消息流程。

本文只讨论带SDP的183/180消息。

环境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.10.7

GCC:4.8.5

fs中183/180的默认处理

fs收到183(SDP)的时候,会透传183(SDP)到A路。

fs收到180(SDP)的时候,默认将180(SDP)转换为183(SDP)传给A路。

在设置了参数“early_use_180”的场景下,fs会把183(SDP)和180(SDP)都转换为180(SDP)传给A路。

 

期望的183/180处理流程。

fs收到183(SDP)的时候,会透传183(SDP)到A路。

fs收到180(SDP)的时候,会透传180(SDP)到A路。

修改方案

修改方案,在B路处理180(SDP)消息的流程中,设置通道变量“180withsdp=true”,在A路响应183/180消息的流程中,检查通道变量“180withsdp”的值并设置响应的消息码。

 

修改 src\mod\endpoints\mod_sofia\sofia.c,7537行

if (status == 180 && r_sdp) {

       status = 183;

       if (switch_true(switch_channel_get_variable(channel, "passthrough180")))

       {

              //设置通道变量,标记B路的180+SDP,在A路响应时,处理send_sip_code为180+SDP

              if (switch_core_session_get_partner(session, &other_session) == SWITCH_STATUS_SUCCESS)

              {

                     other_channel = switch_core_session_get_channel(other_session);

                     switch_channel_set_variable(other_channel, "180withsdp", "true");

 

                     switch_core_session_rwunlock(other_session);

              }

       }

}

 

修改 src\mod\endpoints\mod_sofia\mod_sofia.c,2548行

if (switch_true(switch_channel_get_variable(channel, "passthrough180")) &&

       switch_true(switch_channel_get_variable(channel, "180withsdp")) )

{

       send_sip_code = 180;

       p_send_sip_msg = sip_180_Ringing;

}

 

重新编译安装mod_sofia模块。

 

修改拨号计划如下。

<include>

       <context name="out2in">

              <extension name="sbc-out2in" continue="true">

                     <condition field="destination_number" expression="^(\d+)$">

                            <action application="export" data="passthrough180=true" />

                            <action application="bridge" data="{sip_invite_call_id=${sip_call_id}

                                   }sofia/external/sip:${destination_number}@10.55.55.138:5555"/>

                     </condition>

              </extension>

       </context>

</include>

测试

搭建测试环境,B路响应180(SDP)。

 

 

总结

常见的消息处理流程都可以在mod_sofia中找到,但是对于AB路之间的消息透传,以及涉及到codec媒体协商的流程会比较复杂。

 

空空如常

求真得真

posted @ 2023-06-08 17:37  求真得真  阅读(267)  评论(0编辑  收藏  举报