2013-08-28 8 views
0

클라이언트 시스템에서 원격 SIP UDP 포트 5060에 연결할 수 있는지 알아야하는 프로그램을 작성 중입니다.SIP UDP 서버에 옵션 명령 보내기

UDP 포트의 가용성을 직접 확인할 방법이 없기 때문에. 나는 SIP UDP 서버에 OPTIONS 메시지를 보낼 간단한 자바 클래스를 만들고 나서 서버는 자바에서 클라이언트에게 다시 응답 할 것이다.

도움말/방향이 도움이 될 것입니다.

덕분에, 당신의 응답을 Anupam

덕분에, 나는 코드 조각 아래 시도했지만 서버에서 모든 응답하지 않았다 :

String message = "OPTIONS sip:[email protected];transport=udp SIP/2.0\r\nCall-ID: [email protected]\r\nCSeq: 1 OPTIONS\r\nFrom: \"Anupam\" <sip:[email protected]:5080>;tag=textclientv1.0\r\nTo: \"opensips\" <sip:[email protected]>\r\nVia: SIP/2.0/UDP 49.249.132.30:5080;branch=z9hG4bK-3938-f66aaa8dda2fe3b863b4acde5fbcab67\r\nMax-Forwards: 70\r\nContact: \"Anupam\" <sip:[email protected]:5080>\r\nContent-Length: 0\r\n\r\n"; 


System.out.println("Message is "+ message); 
byte [] data = message.getBytes(); 
DatagramPacket packet = new DatagramPacket(data, data.length, host, port) ; 

을하지만 그것은 작동하지 않았다.

답변

0

도서 (RFC 3261과 호환 됨)로이를 수행하려면 재전송 등을 처리하거나 JAIN-SIP과 같은 라이브러리를 사용하는 꽤 많은 기계를 만들어야합니다.

그러나 UDP 소켓을 열고 소켓을 통해 적절하게 형식이 지정된 OPTIONS 메시지를 포함하는 String을 보내고 잠시 기다려서 SIP를 얻는 지 확인하는 방법으로 대부분의 방법을 사용할 수 있습니다 그 소켓에 대한 응답. 모든 이전 SIP 응답 (성공 또는 오류)은 서버에 도달 할 수 있는지 확인합니다. 여기

는 RFC에서 예 OPTIONS 메시지이다 REGISTER 방법은 다음과 같은 코드를 사용하여 리모트 측 UDP의 SIP 서비스의 유용성을 확인하기 위하여

OPTIONS sip:[email protected] SIP/2.0 
Via: SIP/2.0/UDP pc33.atlanta.com;branch=z9hG4bKhjhs8ass877 
Max-Forwards: 70 
To: <sip:[email protected]> 
From: Alice <sip:[email protected]>;tag=1928301774 
Call-ID: a84b4c76e66710 
CSeq: 63104 OPTIONS 
Contact: <sip:[email protected]> 
Accept: application/sdp 
Content-Length: 0 
+0

답장을 보내 주셔서 감사합니다. 아래 코드를 시도했지만 서버에서 답장을받지 못했습니다. – user2725290

+0

당신이 말하는 코드를 모르겠습니다. 서버에 액세스하여 메시지를 받았는지 확인합니까? 그렇지 않은 경우 다른 SIP UA를 설정하고 코드를 테스트하는 데 사용할 수 있습니다. ('OPTIONS' 메시지에 응답해야합니다.) – yotommy

+0

이 포털에 익숙하지 않아서 답변을 드릴 수 없습니다. 나는 주요 질문을 편집했다. – user2725290

0

.

import java.net.DatagramPacket; 
import java.net.DatagramSocket; 
import java.net.InetAddress; 
import java.util.Random; 

public class CheckSipUdp{ 
    //Check remote SIP service availability 
    public void checkSipUdp(String ipAddress, int outPort)throws Exception{ 
     DatagramSocket sipSocket = new DatagramSocket(0); 
     sipSocket.setSoTimeout(1000); 
     InetAddress inetIpAddress = InetAddress.getByName(ipAddress); 
     byte [] sendData = new byte[1024]; 
     byte [] receiveData = new byte[1024]; 

     //Message/Method which will be used for checking remote server availability. 
     String method = "REGISTER sip:" + ipAddress + ":" + outPort + " SIP/2.0\r\nCall-ID: " + generateCallId() + "@" + InetAddress.getLocalHost().getHostAddress() +"\r\nCSeq: 1 REGISTER\r\nFrom: <sip:" + InetAddress.getLocalHost().getHostAddress() + ":" + sipSocket.getLocalPort() + ">;tag=" + new Random().nextInt() + "\r\nTo: <sip:[email protected]" + ipAddress + ":" + outPort + ">\r\nVia: SIP/2.0/UDP " + InetAddress.getLocalHost().getHostAddress() + ":" + sipSocket.getLocalPort() + ";branch=z9hG4bK-323032-" + generateCallId() + "\r\nMax-Forwards: 70\r\nContact: <sip:" + InetAddress.getLocalHost().getHostAddress()+ ":" + sipSocket.getLocalPort() + ">\r\nContent-Length: 0\r\n\r\n"; 
     sendData = method.getBytes(); 

     DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, inetIpAddress, 5060); 
     sipSocket.send(sendPacket); 

     DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
     sipSocket.receive(receivePacket); 

     String response = new String(receivePacket.getData()); 
     System.out.println(ipAddress + "\n" + response); 
     sipSocket.close(); 
    } 

    //Generating unique callID 
    public static String generateCallId(){ 
     Random r = new Random(); 
     long l1 = r.nextLong() * r.nextLong(); 
     long l2 = r.nextLong() * r.nextLong(); 
     return Long.toHexString(l1) + Long.toHexString(l2); 

    } 

    public static void main(String [] args) throws Exception{ 
     CheckSipUdp sip = new CheckSipUdp(); 
     sip.checkSipUdp(args[0], Integer.parseInt(args[1])); 

    } 
}