You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SIPp测试B2BUA:双注册UAC呼叫失败问题求助

解决方案

问题根源

SIPp默认UAS模式为单呼叫上下文,注册流程结束后,原呼叫上下文终止,后续INVITE请求无法匹配到有效上下文,因此被丢弃。


具体解决步骤

1. 启用多呼叫支持

给16002的UAS实例添加-multi启动参数,允许SIPp为每个新请求创建独立呼叫上下文,不再局限于初始注册流程。

启动命令示例:

sipp -multi -sf uas_register_invite.xml -s 16002 192.168.1.20:5060 -p 5061

2. 修改UAS场景文件

调整16002的场景配置,让它完成注册后持续等待INVITE请求,而非结束会话。示例配置如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE scenario SYSTEM "sipp.dtd">

<scenario name="UAS Register + Call Wait">
  <!-- 处理REGISTER流程 -->
  <recv request="REGISTER" crlf="true">
    <action>
      <ereg regexp="([0-9]+)" search_in="hdr" header="Call-ID:" assign_to="1"/>
    </action>
  </recv>

  <send>
    <![CDATA[
      SIP/2.0 401 Unauthorized
      Via: [branch]
      From: <sip:16002@[remote_ip]:[remote_port]>;tag=[call_number]
      To: <sip:16002@192.168.1.20:5060>;tag=[auto_tag]
      Call-ID: [Call-ID]
      CSeq: [cseq] REGISTER
      WWW-Authenticate: Digest realm="test", nonce="[nonce]"
      Content-Length: 0
    ]]>
  </send>

  <recv request="REGISTER" crlf="true"/>

  <send>
    <![CDATA[
      SIP/2.0 200 OK
      Via: [branch]
      From: <sip:16002@[remote_ip]:[remote_port]>;tag=[call_number]
      To: <sip:16002@192.168.1.20:5060>;tag=[auto_tag]
      Call-ID: [Call-ID]
      CSeq: [cseq] REGISTER
      Contact: <sip:16002@[local_ip]:[local_port]>;expires=3600
      Content-Length: 0
    ]]>
  </send>

  <!-- 注册完成后,持续等待INVITE -->
  <recv request="INVITE" crlf="true">
    <action>
      <ereg regexp="([0-9]+)" search_in="hdr" header="Call-ID:" assign_to="2"/>
    </action>
  </recv>

  <send>
    <![CDATA[
      SIP/2.0 100 Trying
      Via: [branch]
      From: <sip:16001@[remote_ip]:[remote_port]>;tag=[call_number]
      To: <sip:16002@192.168.1.20:5060>;tag=[auto_tag]
      Call-ID: [Call-ID]
      CSeq: [cseq] INVITE
      Content-Length: 0
    ]]>
  </send>

  <send>
    <![CDATA[
      SIP/2.0 200 OK
      Via: [branch]
      From: <sip:16001@[remote_ip]:[remote_port]>;tag=[call_number]
      To: <sip:16002@192.168.1.20:5060>;tag=[auto_tag]
      Call-ID: [Call-ID]
      CSeq: [cseq] INVITE
      Contact: <sip:16002@[local_ip]:[local_port]>
      Content-Type: application/sdp
      Content-Length: [len]

      v=0
      o=user1 53655765 2353687637 IN IP[local_ip_type] [local_ip]
      s=-
      c=IN IP[local_ip_type] [local_ip]
      t=0 0
      m=audio [audio_port] RTP/AVP 0
      a=rtpmap:0 PCMU/8000
    ]]>
  </send>

  <recv request="ACK" crlf="true"/>

  <!-- 模拟通话时长 -->
  <pause milliseconds="3000"/>

  <send request="BYE">
    <![CDATA[
      BYE sip:16001@[remote_ip]:[remote_port] SIP/2.0
      Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
      From: <sip:16002@192.168.1.20:5060>;tag=[auto_tag]
      To: <sip:16001@[remote_ip]:[remote_port]>;tag=[call_number]
      Call-ID: [Call-ID]
      CSeq: [cseq] BYE
      Content-Length: 0
    ]]>
  </send>

  <recv request="200" crlf="true"/>
</scenario>

3. 处理Call-ID匹配问题

如果B2BUA转发呼叫时修改了原始Call-ID,需确保UAS能识别新Call-ID:

  • 启动UAS时添加-cid_match参数,强制仅通过Call-ID匹配呼叫上下文
  • 确认B2BUA是否保留了原始Call-ID,若未保留,-multi参数会自动为新Call-ID创建上下文

4. 规范启动顺序与端口

  • 先启动16002的UAS实例,确保它完成注册后处于等待状态
  • 再启动16001的UAC实例,完成注册后发起呼叫
  • 用-p参数指定不同本地端口,避免冲突:
    # 启动16002 UAS
    sipp -p 5061 -multi -sf uas_register_invite.xml 192.168.1.20:5060
    
    # 启动16001 UAC
    sipp -p 5062 -sf uac_register_invite.xml 192.168.1.20:5060
    

内容的提问来源于stack exchange,提问作者Michael Soulier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 23:42:51