我需要使用SIP servlet实现下一个流程:
1)我的SIP Servlet应该捕获INVITE消息 2)查看SIP TO标头,如果它匹配某种模式,我需要返回REFER消息。
我谷歌,并找到了本手册(基本转移):www.dialogic.com/webhelp/IMG1010/10.5.1/WebHelp/sip_rfr_calltrans.htm
据我所知,这个流程看起来像是下面的: 1)userA向SIP App发送INVITE消息 2)SIP App应该发回200 OK 3)UserA发送ACK消息 4)SIP App向UserA发送REFER消息 5)UserA应发回202Accepted和NOTIFY
我的环境:
1)mss-2.0.0.FINAL-jboss-as-7.1.2.Final as SIP PROXY Server 127.0.0.1:5080
2)user3@127.0.0.1:5060 --- MicroSIP(http://www.microsip.org/)
3)user2@127.0.0.1:5090 --- Zoiper_Free_2.41
DAR文件:
邀请:(“org.call.forwarding.CallForward”,“DAR:From”,“ORIGINATING”,“”,“NO_ROUTE”,“0”)
注册:(“org.call.forwarding.CallForward”,“DAR:From”,“ORIGINATING”,“”,“NO_ROUTE”,“0”)
SUBSCRIBE :(“org.call.forwarding.CallForward”,“DAR:From”,“ORIGINATING”,“”,“NO_ROUTE”,“0”)
OPTIONS :(“org.call.forwarding.CallForward”,“DAR:From”,“ORIGINATING”,“”,“NO_ROUTE”,“0”)
NOTIFY :(“org.call.forwarding.CallForward”,“DAR:From”,“ORIGINATING”,“”,“NO_ROUTE”,“0”)
REFER :(“org.call.forwarding.CallForward”,“DAR:From”,“ORIGINATING”,“”,“NO_ROUTE”,“0”)
来自user3@127.0.0.1我致电refuser@127.0.0.1
所以我的源代码如下: 1)捕获INVITE包并做出200 OK响应:
@Override
protected void doInvite(SipServletRequest request) throws Exception {
// Pattern match logic ommited
SipServletResponse response = request.createResponse(SipServletResponse.SC_OK);
String str = response.toString();
response.send()
}
INVITE sip:refuser@127.0.0.1:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.17:5060;rport=5060;branch=z9hG4bKPjb1570e34df4c442093af6fb2fa238667;received=127.0.0.1
Max-Forwards: 70
From: "user3" <sip:user3@127.0.0.1>;tag=87be8901c4e242fbb5c696d90d0ec068
To: <sip:refuser@127.0.0.1>
Contact: "user3" <sip:user3@127.0.0.1:5060;ob>
Call-ID: 983d9572c4a541d49566699b3edec1e0
CSeq: 22256 INVITE
Allow: PRACK,INVITE,ACK,BYE,CANCEL,UPDATE,INFO,SUBSCRIBE,NOTIFY,REFER,MESSAGE,OPTIONS
Supported: replaces,100rel,timer,norefersub
Session-Expires: 1800
Min-SE: 90
User-Agent: MicroSIP/3.3.21
Content-Type: application/sdp
Content-Length: 673
我的回答:200 OK如同吼叫:
SIP/2.0 200 OK
To: <sip:refuser@127.0.0.1>;tag=25395207_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Via: SIP/2.0/UDP 192.168.0.17:5060;rport=5060;branch=z9hG4bKPjb1570e34df4c442093af6fb2fa238667;received=127.0.0.1
CSeq: 22256 INVITE
Call-ID: 983d9572c4a541d49566699b3edec1e0
From: "user3" <sip:user3@127.0.0.1>;tag=87be8901c4e242fbb5c696d90d0ec068
Contact: <sip:127.0.0.1:5080>
Content-Length: 0
然后我尝试处理ACK包并生成REFER包:
@Override
protected void doAck(SipServletRequest request) throws ServletException, IOException {
String ack = request.toString();
logger.info("Got ASK!!!: " + request.toString());
SipFactory sipFactory = (SipFactory) getServletContext().getAttribute(SIP_FACTORY);
SipApplicationSession appSession = request.getApplicationSession();
SipServletRequest refer = sipFactory.createRequest(appSession, "REFER",
sipFactory.createURI("sip:user@127.0.0.1:5080"), // from sipFactory.createURI("sip:user2@127.0.0.1:5090")); // to
refer.addHeader("Refer-To", "sip:user3@127.0.0.1:5080");
refer.addHeader("Referred-By", "sip:user@127.0.0.1:5080");
logger.info("!!!!!!!!!!!THIS IS REFER: \n" + refer.toString());
String strRefer = refer.toString();
refer.send();
}
ACK sip:127.0.0.1:5080 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.17:5060;rport=5060;branch=z9hG4bKPje03842cfb4104d379db989f2d77a871a;received=127.0.0.1
Max-Forwards: 70
From: "user3" <sip:user3@127.0.0.1>;tag=87be8901c4e242fbb5c696d90d0ec068
To: <sip:refuser@127.0.0.1>;tag=25395207_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Call-ID: 983d9572c4a541d49566699b3edec1e0
CSeq: 22256 ACK
Content-Length: 0
我的REFER套餐:
REFER sip:user2@127.0.0.1:5090 SIP/2.0
Call-ID: ca002d9261fe165c0a4eaedc99ead2c7@127.0.0.1
CSeq: 1 REFER
From: <sip:user@127.0.0.1:5080>;tag=14387494_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
To: <sip:user2@127.0.0.1:5090>
Max-Forwards: 70
Contact: <sip:user@127.0.0.1:5080>
Refer-To: <sip:user3@127.0.0.1:5080>
Referred-By: <sip:user@127.0.0.1:5080>
Content-Length: 0
然后我在日志文件中看到TRYING消息:
SIP/2.0 100 Trying
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK8479416b-da5c-4dca-baef- f9b7db279b9e_da1be872_1872624593941
To: <sip:user2@127.0.0.1:5090>
From: <sip:user@127.0.0.1:5080>;tag=14387494_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Call-ID: ca002d9261fe165c0a4eaedc99ead2c7@127.0.0.1
CSeq: 1 REFER
Content-Length: 0
大约30秒后,我看到Microsip显示“Not Acceptable”消息:
SIP/2.0 408 Request timeout
To: <sip:user2@127.0.0.1:5090>;tag=37903989_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Via: SIP/2.0/UDP 127.0.0.1:5080;branch=z9hG4bK8479416b-da5c-4dca-baef-f9b7db279b9e_da1be872_1872624593941
CSeq: 1 REFER
Call-ID: ca002d9261fe165c0a4eaedc99ead2c7@127.0.0.1
From: <sip:user@127.0.0.1:5080>;tag=14387494_da1be872_8479416b-da5c-4dca-baef-f9b7db279b9e
Contact: <sip:127.0.0.1:5080>
Content-Length: 0
任何身体都可以解释:这个家伙怎么了? 还有另外一点让我的大脑震惊:在某些情况下,在发送200 OK消息后(当我处理INVITE时)我立即在ACK之前回复BYE消息...为什么会发生?
答案 0 :(得分:0)
在您的REFER标头中,您的Contact和CallID似乎与原始ACK和200OK消息无法链接。所以这就是为什么你最终获得100次尝试,因为没有任何未完成的消息等待任何类型的响应。