FreeSWITCH 處理Refer盲轉時,UUI傳遞不對(沒有將SIP 消息頭Refer-To中的User-to-User傳遞給B-Leg)

運行環境:
    CentOS 7.6
    FreeSWICH 1.6.18
 
1、問題場景:
    FreeSWITCH收到REFER命令後,從新發起的INVITE消息中的 "User-to-User" 消息頭信息不對,跟REFER命令的 "Refer-To" 消息頭中的User-to-User參數值不一樣。
    具體報文狀況以下(省略了部分SIP信息):
REFER sip:mod_sofia@10.2.32.90:5080 SIP/2.0
Via: SIP/2.0/UDP 10.2.32.116:5080;rport;branch=z9hG4bKryvUZZerH16DN
From: <sip:449998@10.2.32.116:5080>;tag=XH27mSc4ZyjaF
To: "Extension 296898" <sip:296898@10.2.32.90>;tag=6g430SNK5Be3m
Call-ID: 46eda73c-76b2-1239-e1b5-487b6b8ad630
Contact: <sip:449998@10.2.32.116:5080;transport=udp> Refer-To: <sip:296896@test.refer.com?User-to-User=00C82b264F7267416E693D3131313337303035303030303139393433333634264F7267446E69733D333030393637%3Bencoding%3Dhex>
Referred-By: <sip:10.2.32.116:5080> User-to-User: 00C8426613D31%3Bencoding%3Dhex


INVITE sip:296896@10.32.26.19:50078;rinstance=b4e528536c8c5a3d SIP/2.0
Via: SIP/2.0/UDP 10.2.32.90;rport;branch=z9hG4bKtK4yS4SH849vD
Route: <sip:296896@10.32.26.19:50078>;rinstance=b4e528536c8c5a3d
From: "Extension 296898" <sip:296898@10.2.32.90>;tag=ymDeQZt2ZcK1B
To: <sip:296896@10.32.26.19:50078;rinstance=b4e528536c8c5a3d>
Call-ID: 4992bbb6-76b2-1239-e1b5-487b6b8ad630
Contact: <sip:mod_sofia@10.2.32.90:5060>
Referred-By: <sip:10.2.32.116:5080> User-to-User: 00C8426613D31%3Bencoding%3Dhex
Remote-Party-ID: "Extension 296898" <sip:296898@10.2.32.90>;party=calling;screen=yes;privacy=off

 

2、問題緣由:
    FreeSWICH默認狀況下,處理REFER命令進行盲轉時,新發起的INVITE消息中的 "User-to-User" 是從REFER的 "User-to-User" 頭中獲取的,而非"Refer-to"裏的參數
 
    FS處理Refer命令的邏輯:
  • 信令交互邏輯
              
  • 信令處理邏輯
    • REFER的SIP消息頭"Refer-To"中的信息,只提取盲轉的被叫號碼,忽略其餘參數(如User-to-User),而後發起新的INVITE
    • 新的INVITE消息中的「User-to-User」頭,是根據REFER命令中的「User-to-User」頭獲取,非「Refer-To」裏的參數值

 

3、解決方案
    FreeSWITCH 收到 REFER 後,取出sip_refer_to頭中的值,執行export nolocal 命令,將值設置到將來bridge的B-leg通道上便可。
    增長下面撥號方案便可:
  <extension name="refer request" continue="true">
    <condition field="${sip_refer_to}" expression=".+User-to-User=(.+)%3B">
       <action application="log" data="INFO yuxiu:change User-to-User by sip_refer_to : sip_refer-to [$1]"/>
       <action application="export" data="nolocal:sip_h_User-to-User=$1;encoding=hex"/>
    </condition>
  </extension>
    經過上面方式,若是FS收到的REFER命令的「Refer-To」頭中有User-to-User參數,就取該參數做爲後續INVITE的「User-to-User」頭,不然依舊取REFER命令中的「User-to-User」頭
    修改後,盲轉報文將變成下面形式:
REFER sip:mod_sofia@10.2.32.90:5080 SIP/2.0
From: <sip:449998@10.2.32.116:5080>;tag=XH27mSc4ZyjaF
To: "Extension 296898" <sip:296898@10.2.32.90>;tag=6g430SNK5Be3m
Refer-To: <sip:296896@test.refer.com?User-to-User=00C82b264F7267416E693D3131313337303035303030303139393433333634264F7267446E69733D333030393637%3Bencoding%3Dhex>
User-to-User: 00C8426613D31%3Bencoding%3Dhex

INVITE sip:296896@10.32.26.19:50078;rinstance=b4e528536c8c5a3d SIP/2.0
From: "Extension 296898" <sip:296898@10.2.32.90>;tag=ymDeQZt2ZcK1B
To: <sip:296896@10.32.26.19:50078;rinstance=b4e528536c8c5a3d> User-to-User:  00C82b264F7267416E693D3131313337303035303030303139393433333634264F7267446E69733D333030393637%3Bencoding%3Dhex
Remote-Party-ID: "Extension 296898" <sip:296898@10.2.32.90>;party=calling;screen=yes;privacy=off

 

4、模擬的呼叫場景:express

       

 

4.一、PBX-FS機器:充當分機註冊服務器
     在PBX-FS (10.2.32.90:5060)上註冊兩個分機:296896 和 296898
     而後讓296989 呼叫 449998 進行測試
  • 撥號方案詳情:default.xml 
  <!-- 處理refer消息頭 -->
  <extension name="refer request" continue="true">
    <condition field="${sip_refer_to}" expression=".+User-to-User=(.+)%3B">
       <action application="log" data="WARNING yuxiu:change User-to-User by sip_refer_to : sip_refer-to [$1]"/>
       <action application="export" data="nolocal:sip_h_User-to-User=$1;encoding=hex"/>
    </condition>
  </extension>

  <!-- 模擬呼叫IVR -->
  <extension name="outbound-ivr">
    <condition field="destination_number" expression="^(449998)$">
      <action application="bridge" data="sofia/external/$1@10.2.32.116:5080"/>
      <action application="hangup" data="Esl Server ERROR"/>
    </condition>
  </extension>

  <!-- 模擬呼叫PBX分機 -->
  <extension name="outbound-pbx">
    <condition field="destination_number" expression="^(296\d{3})$">
      <action application="bridge" data="user/${1}"/>
      <action application="hangup" data="Esl Server ERROR"/>
    </condition>
  </extension>
 
4.二、IVR-FS機器:充當IVR導航服務器
    收到來電後,自動應答,而後播放一段提示音後,refer 盲轉到296896
  <extension name="outbound-test2">
    <condition field="destination_number" expression="^449998$">
      <action application="log" data="INFO  uui=${sip_h_User-to-User}"/>
      <action application="answer"/>
      <action application="playback" data="/usr/local/freeswitch/sounds/welcom_to_call_yuxiu_ivr.wav"/>
      <action application="deflect" data="sip:296896@test.refer.com?User-to-User=00C82b264F7267416E693D3131313337303035303030303139393433333634264F7267446E69733D333030393637%3Bencoding%3Dhex"/>
      <action application="log" data="WARNING refer finished"/>
      <action application="hangup" data="refer finished"/>
    </condition>
  </extension>

 

4.三、FS測試日誌服務器

EXECUTE sofia/internal/296898@10.2.32.90 bridge(sofia/external_90/449998@10.2.32.116:5080)

[DEBUG]  sofia.c:8544 Process REFER to [296896@test.refer.com]
[INFO] mod_dialplan_xml.c:637 Processing 296898 <296898>->296896 in context default
EXECUTE sofia/internal/296898@10.2.32.90 bridge(user/296896)
相關文章
相關標籤/搜索