使用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
相关产品推荐
相关产品推荐

