[J2SE] 關於JAIN SIP這API中NOTIFY的使用方法????
是JAVA新手..也是SIP新手...現在正在使用JAIN SIP這套API來寫我的SIP Client
以下是我想要做的事:
當A電腦使用NOTFY Request傳給B電腦..接著B電腦應該要回傳200 OK給A電腦...
但是B電腦卻沒有按照我寫的回傳....
B電腦而是回傳"481 Subscription does not exist"...
我覺得意思是說我沒有傳先SUBSCRIBE....
接著我重新寫了:
1.B電腦使用SUBSCRIBE Request傳給A電腦..接著A電腦回傳200 OK給B電腦...(成功)
2.A電腦使用NOTFY Request傳給B電腦..接著B電腦應該要回傳200 OK給A電腦...
但是還是失敗...>///<..依舊是"481 Subscription does not exist"...
一直覺得好像是要把SUBSCRIBE和NOTFY連在一起...不然NOTIFY一直都不知道有
SUBSCRIBE...但是我不知道要如何把他們連在一起???????
想要請問有哪一位JAVA高手可以指點指點我...謝謝!!
-----------------------------------------------------------------------------
以下是我A.B電腦的程式碼
B電腦(傳SUBSCRIBE給A)
public void makeSUB(String to, String message) throws ParseException,
InvalidArgumentException, SipException ,TransactionUnavailableException
{
SipURI from = addressFactory.createSipURI(getUsername(), getHost()
+ ":" + getPort());
Address fromNameAddress = addressFactory.createAddress(from);
fromNameAddress.setDisplayName(getUsername());
FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress,
"textclientv1.0");
String username = to.substring(to.indexOf(":") + 1, to.indexOf("@"));
String address = to.substring(to.indexOf("@") + 1);
SipURI toAddress = addressFactory.createSipURI(username, address);
Address toNameAddress = addressFactory.createAddress(toAddress);
toNameAddress.setDisplayName(username);
ToHeader toHeader = headerFactory.createToHeader(toNameAddress, null);
SipURI requestURI = addressFactory.createSipURI(username, address);
requestURI.setTransportParam("udp");
ArrayList viaHeaders = new ArrayList();
ViaHeader viaHeader = headerFactory.createViaHeader(getHost(),
getPort(), "udp", "branch1");
viaHeaders.add(viaHeader);
CallIdHeader callIdHeader = sipProvider.getNewCallId();
CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1,
Request.SUBSCRIBE);
MaxForwardsHeader maxForwards = headerFactory
.createMaxForwardsHeader(70);
Request subscribe = messageFactory.createRequest(requestURI,
Request.SUBSCRIBE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
EventHeader eventHeader =
headerFactory.createEventHeader("state");//--SUB
subscribe.addHeader(eventHeader);//---SUB
SipURI contactURI = addressFactory.createSipURI(getUsername(),
getHost());
contactURI.setPort(getPort());
Address contactAddress = addressFactory.createAddress(contactURI);
contactAddress.setDisplayName(getUsername());
ContactHeader contactHeader = headerFactory
.createContactHeader(contactAddress);
subscribe.addHeader(contactHeader);
ContentTypeHeader contentTypeHeader = headerFactory
.createContentTypeHeader("text", "plain");
subscribe.setContent(message, contentTypeHeader);
sipProvider.sendRequest(subscribe);
}
A電腦回200 OK
else if(method.equals("SUBSCRIBE"))
{
FromHeader from = (FromHeader) req.getHeader("From");
messageProcessor.processMessage(from.getAddress().toString(),
new String(req.getRawContent()));
Response response = null;
try { //Reply with OK
response = messageFactory.createResponse(200, req);
Address contactAddress =
addressFactory.createAddress("sip:bob@140.115.152.189:5061");
contactAddress.setDisplayName("bob");
ContactHeader contactHeader = headerFactory
.createContactHeader(contactAddress);
response.addHeader(contactHeader);
ContentTypeHeader contentTypeHeader = headerFactory
.createContentTypeHeader("text", "plain");
response.setContent("OK",contentTypeHeader);
sipProvider.sendResponse(response);
} catch (Throwable e) {
e.printStackTrace();
messageProcessor.processError("Can't send OK reply.");
}
}
A電腦(傳NOTIFY給B)
public void sendNotify(String to, String message) throws ParseException,
InvalidArgumentException, SipException
{
SipURI from = addressFactory.createSipURI(getUsername(), getHost()
+ ":" + getPort());
Address fromNameAddress = addressFactory.createAddress(from);
fromNameAddress.setDisplayName(getUsername());
FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress,
"vinbabyclientv1.0");
String username = to.substring(to.indexOf(":") + 1, to.indexOf("@"));
String address = to.substring(to.indexOf("@") + 1);
SipURI toAddress = addressFactory.createSipURI(username, address);
Address toNameAddress = addressFactory.createAddress(toAddress);
toNameAddress.setDisplayName(username);
ToHeader toHeader = headerFactory.createToHeader(toNameAddress, null);
SipURI requestURI = addressFactory.createSipURI(username, address);
requestURI.setTransportParam("udp");
ArrayList viaHeaders = new ArrayList();
ViaHeader viaHeader = headerFactory.createViaHeader(getHost(),
getPort(), "udp", "branch1");
viaHeaders.add(viaHeader);
CallIdHeader callIdHeader = sipProvider.getNewCallId();
CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1,
Request.NOTIFY);
MaxForwardsHeader maxForwards = headerFactory
.createMaxForwardsHeader(70);
Request request = messageFactory.createRequest(requestURI,
Request.NOTIFY, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);
EventHeader eventHeader =
headerFactory.createEventHeader("state");//-NOTIFY
request.addHeader(eventHeader);//--------NOTIFY
SipURI contactURI = addressFactory.createSipURI(getUsername(),
getHost());
contactURI.setPort(getPort());
Address contactAddress = addressFactory.createAddress(contactURI);
contactAddress.setDisplayName(getUsername());
ContactHeader contactHeader = headerFactory
.createContactHeader(contactAddress);
request.addHeader(contactHeader);
ContentTypeHeader contentTypeHeader = headerFactory
.createContentTypeHeader("text", "plain");
request.setContent(message, contentTypeHeader);
sipProvider.sendRequest(request);
}
B電腦應該要回傳200 OK(但是他卻回傳481)
else if (method.equals("NOTIFY"))//----------send 200 OK
{
if(((EventHeader)req.getHeader(EventHeader.NAME))
.getEventType().equalsIgnoreCase("state"))
{
FromHeader from = (FromHeader) req.getHeader("From");
messageProcessor.processMessage(from.getAddress().toString(),
new String(req.getRawContent()));
Response response = null;
SubscriptionStateHeader subscriptionStateHeader= null;
try { //Reply with OK
response = messageFactory.createResponse(200, req);
subscriptionStateHeader=
headerFactory.createSubscriptionStateHeader
(SubscriptionStateHeader.TERMINATED);
response.addHeader(subscriptionStateHeader);
sipProvider.sendResponse(response);
} catch (Throwable e) {
e.printStackTrace();
messageProcessor.processError("Can't send OK reply.");
}
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.115.152.197
推
05/24 22:59, , 1F
05/24 22:59, 1F
推
05/25 11:40, , 2F
05/25 11:40, 2F
→
05/25 11:42, , 3F
05/25 11:42, 3F
→
05/25 11:43, , 4F
05/25 11:43, 4F
→
05/25 13:02, , 5F
05/25 13:02, 5F
→
05/25 13:06, , 6F
05/25 13:06, 6F
→
05/25 13:12, , 7F
05/25 13:12, 7F