用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加一,有时很有用。

你可能感兴趣的:(FreeSWITCH,Kamailio,Kamailio,FreeSWITCH)