Команда отправки параметров на SIP UDP-сервер
Я работаю над программой, которая должна выяснить, доступен ли удаленный SIP UDP-порт 5060 с клиентского компьютера.
Так как прямого способа проверить наличие UDP-порта нет. Я хочу создать простой класс Java, который будет отправлять сообщение ОПЦИИ на сервер 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 ) ;
Но это не сработало.
2 ответа
Чтобы проверить доступность удаленного sip-сервиса UDP sip методом REGISTER, вы можете использовать следующий код.
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]));
}
}
Чтобы сделать это в соответствии с книгой (в соответствии с RFC 3261), вам нужно либо создать довольно много механизмов для обработки повторных передач и т. Д., Либо использовать библиотеку, такую как JAIN-SIP.
Тем не менее, вы можете получить большую часть пути, просто открыв сокет UDP, отправив строку, содержащую соответственно отформатированный OPTIONS
сообщение через сокет, а затем подождать некоторое время, чтобы увидеть, если вы получите ответ SIP на этом сокете. Любой старый ответ SIP (успех или ошибка) будет проверять, что сервер доступен.
Вот пример OPTIONS
сообщение из RFC:
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