在使用SIP注冊代理的場景中,經常遇到 FS向注冊代理伺服器請求外呼時,由于注冊代理伺服器的位址為内網,是以FS的請求SDP會自動切換為内網,這是使得FS的媒體不能直接和用戶端進行RTP通信。
是以有些場景會需要FS固定SDP為公網位址,代理伺服器進行媒體繞過,FS直接和用戶端進行媒體通信。
增加一個通道變量 fix_extrtpip ,設為 true時,呼叫發起是則強制SDP的位址為 external_rtp_ip配置的值。
源碼中增加該變量的控制
freeswitch 1.10.1 版本 switch_core_media.c -> switch_core_media_choose_port 函數。
增加的代碼是紅色部分:
if(switch_channel_var_true(session->channel, "fix_extrtpip")){
use_ip = smh->mparams->extrtpip;
}else{
use_ip = smh->mparams->rtpip;
}
在源碼中的大緻位置 8214 行:
/* Check if NAT is detected */
if (!zstr(smh->mparams->remote_ip) && switch_core_media_check_nat(smh, smh->mparams->remote_ip)) {
/* Yes, map the port through switch_nat */
switch_nat_add_mapping(engine->local_sdp_port, SWITCH_NAT_UDP, &sdp_port, SWITCH_FALSE);
switch_snprintf(vname, sizeof(vname), "rtp_adv_%s_ip", tstr);
/* Find an IP address to use */
if (!(use_ip = switch_channel_get_variable(session->channel, vname))
&& !zstr(smh->mparams->extrtpip)) {
use_ip = smh->mparams->extrtpip;
}
if (use_ip) {
if (switch_core_media_ext_address_lookup(session, &lookup_rtpip, &sdp_port, use_ip) != SWITCH_STATUS_SUCCESS) {
/* Address lookup was required and fail (external ip was "host:..." or "stun:...") */
return SWITCH_STATUS_FALSE;
} else {
/* Address properly resolved, use it as external ip */
use_ip = lookup_rtpip;
}
} else {
/* No external ip found, use the profile's rtp ip */
use_ip = smh->mparams->rtpip;
}
} else {
+ //add by aominle [20211021] : 強制sdp為公網IP
+ if(switch_channel_var_true(session->channel, "fix_extrtpip")){
use_ip = smh->mparams->extrtpip;
+ }else{
/* No NAT traversal required, use the profile's rtp ip */
use_ip = smh->mparams->rtpip;
}
}
用法:
在發起呼叫是增加通道變量 {fix_extrtpip=true}