用Kamailio修复FreeSWITCH的sdp
FreeSWITCH收到对话内的OPTIONS(很少见),Respond的sdp有问题
v=0
o=freeswitch 1680834355 1680834356 IN IP4 192.168.1.100
s=freeswitch
c=IN IP4 192.168.1.100
t=0 0
m=audio 0 RTP/AVP 8 97 # rtp端口居然为0
a=rtpmap:8 PCMA/8000
a=rtpmap:97 telephone-event/8000
a=fmtp:97 0-15
a=sendrecv
a=ptime:20
尝试用Kamailio修复,主要内容如下:
loadmodule "textops.so"
loadmodule "textopsx.so"
loadmodule "sdpops.so"
loadmodule "htable.so"
modparam("htable", "htable", "fsmedia=>size=8;autoexpire=300;")
route[SAVE_FS_MEDIA] {
if (is_method("INVITE") && has_body("application/sdp") && search_body("s=freeswitch")) {
$var(body) = $sdp(body);
$var(m) = $(var(body){line.sw,m=audio});
$sht(fsmedia=>$ci) = $var(m);
}
}
route[RESTORE_FS_MEDIA] {
if (is_method("OPTIONS") && has_body("application/sdp") && search_body("s=freeswitch")) {
$var(body) = $sdp(body);
$var(m) = $(var(body){line.sw,m=audio});
$var(new_m) = $sht(fsmedia=>$ci);
replace_body($var(m), $var(new_m));
msg_apply_changes();
}
}
或者用下面的代码,干脆删除sdp
remove_body();
remove_hf("Content-Type");
msg_apply_changes();
温馨提示:
- $sdp(body) 来自sdpops模块
- $(var(body){line.sw,m=audio}) 来自Transformations,找到包含m=audio的那一行
- replace_body 来自textops模块
- msg_apply_changes来自textopsx模块,修改sip消息,调用此函数,再读,就可以读到改变后的值。比如msg_apply_changes(); xinfo("newsdp = $sdp(body)\n");
sdpops模块还有一个功能,就是让sess_version加一,有时很有用。