【问题标题】:Sending Options command to SIP UDP server向 SIP UDP 服务器发送选项命令
【发布时间】:2013-08-28 12:13:10
【问题描述】:

我正在开发一个程序,该程序需要确定远程 SIP UDP 端口 5060 是否可以从客户端计算机访问。

由于没有直接的方法来检查 UDP 端口的可用性。我想创建一个简单的 java 类,它将 OPTIONS 消息发送到 SIP UDP 服务器,然后服务器将在 java 中回复客户端。

任何帮助/指导都会有很大帮助!

谢谢, 阿努帕姆

感谢您的回复,我尝试了下面的代码,但没有得到服务器的任何回复:

String message = "OPTIONS sip:opensips@host;transport=udp SIP/2.0\r\nCall-ID: 7df5e96c6b1b98af25ad6c7845d48f5d@49.249.132.30\r\nCSeq: 1 OPTIONS\r\nFrom: \"Anupam\" <sip:Anupam@localhost:5080>;tag=textclientv1.0\r\nTo: \"opensips\" <sip:opensips@host>\r\nVia: SIP/2.0/UDP 49.249.132.30:5080;branch=z9hG4bK-3938-f66aaa8dda2fe3b863b4acde5fbcab67\r\nMax-Forwards: 70\r\nContact: \"Anupam\" <sip:Anupam@localhost: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 ) ;

但是没有用。

【问题讨论】:

    标签: java udp sip datagram udpclient


    【解决方案1】:

    要按本书执行此操作(符合RFC 3261),您将需要创建相当多的机制来处理重传等,或者使用像JAIN-SIP 这样的库。

    但是,您可以通过简单地打开一个 UDP 套接字,通过套接字发送一个包含适当格式的 OPTIONS 消息的字符串,然后等待一段时间看看您是否得到一个该套接字上的 SIP 响应。任何旧的 SIP 响应(成功或错误)都将验证服务器是否可访问。

    这是来自 RFC 的 OPTIONS 消息示例:

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

    【讨论】:

    • 感谢您的回复,我尝试了下面的代码,但没有得到服务器的任何回复:
    • 我不知道你指的是什么代码。您是否有权访问服务器以查看它是否收到消息?如果没有,您可以设置另一个 SIP UA 并使用它来测试您的代码。 (它应该回复OPTIONS 消息。)
    • 我无法回答,因为我是这个门户的新手。我已经编辑了主要问题。
    • 我的建议还是一样:设置一个你可以控制的 SIP UA,然后使用你的程序向它发送 OPTIONS 看看会发生什么。
    • 谢谢!您能帮我了解一下 SIP UA 吗?我该如何设置?
    【解决方案2】:

    为了使用 REGISTER 方法检查远程端 UDP sip 服务的可用性,您可以使用以下代码。

    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:alice@" + 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]));
    
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-01-23
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-27
      • 2018-01-03
      • 2019-01-15
      • 2013-08-22
      相关资源
      最近更新 更多