作者vinbaby (vinbaby)
站内java
标题[J2SE] 关於JAIN SIP这API中NOTIFY的使用方法????
时间Sat May 24 21:56:53 2008
是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:
[email protected]: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
1F:推 smayday:你是在做SIP Presence吧? 05/24 22:59
2F:推 smayday:你这已是完整的程式码? 我看应该是A电脑传notify讯息时 05/25 11:40
3F:→ smayday:未夹带负责记录presentity state的PIDF document, 所以B 05/25 11:42
4F:→ smayday:电脑才回应说 "481 Subscription does not exist" 05/25 11:43
5F:→ vinbaby:嗯嗯我是在做SIP Presence....不过不好意思..我不知道你所 05/25 13:02
6F:→ vinbaby:说的PIDF document是什麽??..我上面的程式是部份...不过对 05/25 13:06
7F:→ vinbaby:NOTIFY和SUBSCRIBE来说~~是全部了!! 05/25 13:12