2017-10-25 9 views
0

JAIN SIP를 사용하여 통화를 시작하려고합니다. 코드를 실행하려고 할 때 코드 415 - 지원되지 않는 미디어 유형으로 응답을받습니다.JAIN SIP returns 415

내 IP 주소 (포트 5061 사용)에서 다른 SIP 주소로 전화하고 있습니다.

헤더가 누락 되었습니까? 아니면 잘못 생각한거야?

public void sendMessage(String to) throws ParseException, InvalidArgumentException, SipException { 

     SipURI from = addressFactory.createSipURI(getUsername(), getHost() + ":" + getPort()); 
     Address fromNameAddress = addressFactory.createAddress(from); 
     fromNameAddress.setDisplayName(getUsername()); 
     FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress, "sipinitiator"); 

     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<ViaHeader> viaHeaders = new ArrayList<ViaHeader>(); 
     ViaHeader viaHeader = headerFactory.createViaHeader(getHost(), getPort(), "udp", "branch1"); 
     viaHeaders.add(viaHeader); 

     CallIdHeader callIdHeader = sipProvider.getNewCallId(); 

     CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L, Request.MESSAGE); 

     MaxForwardsHeader maxForwards = headerFactory.createMaxForwardsHeader(70); 

     Request request = messageFactory.createRequest(requestURI, Request.MESSAGE, callIdHeader, cSeqHeader, 
       fromHeader, toHeader, viaHeaders, maxForwards); 

     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); 

     sipProvider.sendRequest(request); 
    } 

(I :이 요청을 만드는 공장을 사용하여 전송하는 기능이다

public SipLayer(String username, String ip, int port) throws PeerUnavailableException, 
      TransportNotSupportedException, InvalidArgumentException, ObjectInUseException, TooManyListenersException { 
     sipFactory = SipFactory.getInstance(); 
     sipFactory.setPathName("gov.nist"); 
     Properties properties = new Properties(); 
     properties.setProperty("javax.sip.STACK_NAME", "SipInitiator"); 
     properties.setProperty("javax.sip.IP_ADDRESS", ip); 

     sipStack = sipFactory.createSipStack(properties); 
     headerFactory = sipFactory.createHeaderFactory(); 
     addressFactory = sipFactory.createAddressFactory(); 
     messageFactory = sipFactory.createMessageFactory(); 

     ListeningPoint udp = sipStack.createListeningPoint(ip, port, "udp"); 
     sipProvider = sipStack.createSipProvider(udp); 
     sipProvider.addSipListener(this); 
    } 

:

는 SIP 스택 및 SIP 제공자를 설정하는 생성자 SipListener 기능 구현)

답변

0

미디어 설정을 협상하는 SDP가 누락되었습니다. 415 오류는 원격 측에서 유효한 SDP를 제공해야하며이를 사용하지 않으면 작동하지 않는다는 것을 의미합니다. 이 예제를 통해 RTP 스택을 준비하지 않은 경우 가짜 미디어 설정을 제공하는 방법을 살펴보십시오. https://github.com/usnistgov/jsip/blob/master/src/examples/simplecallsetup/Shootist.java#L348

오디오/미디어가 필요하면 궁극적으로 어떤 종류의 미디어 스택을 사용하여 적절한 유효한 SDP.

+0

내가 언급 한 예에서와 같이 가짜 SDP를 추가했지만 (ip를 내 ip로 변경 한 것), 여전히 415를 얻고 있습니다. 왜 그런가? –

+0

예제에 표시된대로 contentTypeHeader를 포함해야합니다. 그렇지 않으면 특이합니다. 오류가 계속 발생하면 원격 상대방의 디버그 로그를 검토하여 오류를 보내는 이유를 확인해야합니다. 일부 희귀 형식 만 허용 할 수 있습니다. 또한 작동하는 장치가 있으면 해당 SDP를 복사하여 붙여 넣기 만하면 호환되는 알려진 SDP를 캡처 할 수 있습니다. –

+0

contentTypeHeader가 추가되었으며 이제 작동합니다. 고맙습니다! –