[J2SE] 關於JAIN SIP這API中NOTIFY的使用方法????

看板java作者 (vinbaby)時間18年前 (2008/05/24 21:56), 編輯推噓2(205)
留言7則, 2人參與, 最新討論串1/1
是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
你是在做SIP Presence吧?
05/24 22:59, 1F

05/25 11:40, , 2F
你這已是完整的程式碼? 我看應該是A電腦傳notify訊息時
05/25 11:40, 2F

05/25 11:42, , 3F
未夾帶負責記錄presentity state的PIDF document, 所以B
05/25 11:42, 3F

05/25 11:43, , 4F
電腦才回應說 "481 Subscription does not exist"
05/25 11:43, 4F

05/25 13:02, , 5F
嗯嗯我是在做SIP Presence....不過不好意思..我不知道你所
05/25 13:02, 5F

05/25 13:06, , 6F
說的PIDF document是什麼??..我上面的程式是部份...不過對
05/25 13:06, 6F

05/25 13:12, , 7F
NOTIFY和SUBSCRIBE來說~~是全部了!!
05/25 13:12, 7F
文章代碼(AID): #18E1wchs (java)