Skip to content

Instantly share code, notes, and snippets.

@gilberto-009199
Last active October 21, 2023 19:54
Show Gist options
  • Save gilberto-009199/9df0b3053eb2673982a558d9e34e397a to your computer and use it in GitHub Desktop.
Save gilberto-009199/9df0b3053eb2673982a558d9e34e397a to your computer and use it in GitHub Desktop.
package main;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.Socket;
import java.util.List;
import java.util.Map;
import org.apache.commons.collections.map.HashedMap;
import ch.qos.logback.core.recovery.ResilientSyslogOutputStream;
import lombok.Data;
public class ClientRTSP {
public static final String host = "192.168.0.39";
public static final String user = "admin";
public static final String password = "OGcl7Ybh";// base64 password
public static void main(String[] args) throws IOException {
ClientRTSP client = new ClientRTSP();
client.test();
}
public void test() throws IOException {
connect();
connectUDP(2000);
connectUDP(2001);
Pocket pacote = new Pocket();
/*
Request: DESCRIBE rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream RTSP/1.0\r\n
Method: DESCRIBE
URL: rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream
CSeq: 0\r\n
Accept: application/sdp\r\n
\r\n
*/
pacote.setUrl("rtsp://"+host+"/user="+user+"_password="+password+"_channel=0_stream=0.sdp?real_stream");
pacote.setCSeq("0");
pacote.setMethod("DESCRIBE");
pacote.setKey_value(new HashedMap());
pacote.getKey_value().put("Accept","application/sdp");
pacote.setListener(new call() {
@Override
public void recieve(String retorno ,Map<String, String[]> menssage) throws IOException {
System.out.println("recieve DESCRIBE: \n" + retorno);
/*
Real Time Streaming Protocol
Request: SETUP rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream/trackID=3 RTSP/1.0\r\n
Method: SETUP
URL: rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream/trackID=3
CSeq: 1\r\n
Transport: RTP/AVP;unicast;client_port=2000-2001
\r\n
*/
pacote.setUrl("rtsp://"+host+"/user="+user+"_password="+password+"_channel=0_stream=0.sdp?real_stream/trackID=3");
pacote.setCSeq("1");
pacote.setMethod("SETUP");
pacote.setKey_value(new HashedMap());
pacote.getKey_value().put("Transporte","RTP/AVP;unicast;client_port=2000-2001");
pacote.setListener(new call() {
@Override
public void recieve(String res, Map<String, String[]> menssage) throws IOException {
System.out.println("recieve SETUP 1: \n" + res);
String Session = readMapKey( menssage, "Session")[0]+";"+readMapKey( menssage, "Session")[1];
/*
Real Time Streaming Protocol
Request: SETUP rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream/trackID=4 RTSP/1.0\r\n
Method: SETUP
URL: rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream/trackID=4
CSeq: 2\r\n
Transport: RTP/AVP;unicast;client_port=2002-2003
Session: 83618340;timeout=60
\r\n
*/
pacote.setUrl("rtsp://"+host+"/user="+user+"_password="+password+"_channel=0_stream=0.sdp?real_stream/trackID=4");
pacote.setCSeq("2");
pacote.setMethod("SETUP");
pacote.setKey_value(new HashedMap());
pacote.getKey_value().put("Transporte","RTP/AVP;unicast;client_port=2002-2003");
pacote.getKey_value().put("Session", Session);
//pacote.getKey_value().put("User-Agent", "ONVIF Filter (LIVE555 Streaming Media v2009.11.27)");
pacote.setListener(new call() {
@Override
public void recieve(String res, Map<String, String[]> menssage) throws IOException {
System.out.println("recieve SETUP 2: \n" + res);
/*
Real Time Streaming Protocol
Request: PLAY rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream RTSP/1.0\r\n
Method: PLAY
URL: rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=0.sdp?real_stream
CSeq: 3\r\n
Session: 83618360;timeout=60
\r\n
*/
pacote.setUrl("rtsp://"+host+"/user="+user+"_password="+password+"_channel=0_stream=0.sdp?real_stream");
pacote.setCSeq("3");
pacote.setMethod("play");
pacote.setKey_value(new HashedMap());
pacote.getKey_value().put("Session", Session);
//pacote.getKey_value().put("Range", "npt=0.000-");
//pacote.getKey_value().put("Transporte","RTP/AVP;unicast;client_port=7500-7501");
//pacote.getKey_value().put("User-Agent", "ONVIF Filter (LIVE555 Streaming Media v2009.11.27)");
pacote.setListener(new call() {
@Override
public void recieve(String res, Map<String, String[]> menssage) throws IOException {
System.out.println("recieve Play 1: \n" + res);
}
});
send(pacote);
}
});
send(pacote);
}
});
send(pacote);
}
});
send(pacote);
}
public void test01() throws IOException {
connect();
connectUDP(2000);
connectUDP(2001);
Pocket pacote = new Pocket();
/*
Real Time Streaming Protocol
Request: OPTIONS rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=1.sdp?real_stream RTSP/1.0\r\n
CSeq: 0\r\n
User-Agent: ONVIF Filter (LIVE555 Streaming Media v2009.11.27)\r\n
\r\n
*/
pacote.setCSeq("0");
pacote.setMethod("OPTIONS");
pacote.setUrl("rtsp://"+host+"/user="+user+"_password="+password+"_channel=0_stream=0.sdp?real_stream");
Map<String,String> map = new HashedMap();
map.put("Require","implicit-play");
map.put("Proxy-Require","gzipped-messages");
pacote.setKey_value(map);
pacote.setListener(new call() {
@Override
public void recieve(String retorno ,Map<String, String[]> menssage) throws IOException {
System.out.println("recieve OPTIONS: \n" + retorno);
/*
Real Time Streaming Protocol
Request: SETUP rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=1.sdp/trackID=3 RTSP/1.0\r\n
CSeq: 2\r\n
Transport: RTP/AVP/TCP;unicast;interleaved=0-1
User-Agent: ONVIF Filter (LIVE555 Streaming Media v2009.11.27)\r\n
\r\n
*/
pacote.setUrl("rtsp://"+host+"/user="+user+"_password="+password+"_channel=0_stream=0.sdp?real_stream/trackID=3");
pacote.setCSeq("1");
pacote.setMethod("SETUP");
pacote.setKey_value(new HashedMap());
pacote.getKey_value().put("Transporte","RTP/AVP;unicast;client_port=2000-2001");
pacote.setListener(new call() {
@Override
public void recieve(String res, Map<String, String[]> menssage) throws IOException {
System.out.println("recieve SETUP 1: \n" + res);
String Session = readMapKey( menssage, "Session")[0]+";"+readMapKey( menssage, "Session")[1];
/*
Real Time Streaming Protocol
Request: SETUP rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=1.sdp/trackID=4 RTSP/1.0\r\n
CSeq: 3\r\n
Session: 24599580
Transport: RTP/AVP/TCP;unicast;interleaved=2-3
User-Agent: ONVIF Filter (LIVE555 Streaming Media v2009.11.27)\r\n
\r\n
*/
pacote.setCSeq("2");
pacote.setMethod("SETUP");
pacote.setKey_value(new HashedMap());
pacote.getKey_value().put("Transporte","RTP/AVP;unicast;client_port=2000-2001");
pacote.getKey_value().put("Session", Session);
//pacote.getKey_value().put("User-Agent", "ONVIF Filter (LIVE555 Streaming Media v2009.11.27)");
pacote.setListener(new call() {
@Override
public void recieve(String res, Map<String, String[]> menssage) throws IOException {
System.out.println("recieve SETUP 2: \n" + res);
/*
Real Time Streaming Protocol
Request: PLAY rtsp://192.168.0.21:554/user=admin_password=EO0ea0Fd_channel=0_stream=1.sdp RTSP/1.0\r\n
CSeq: 4\r\n
Session: 24599580
Range: npt=0.000-\r\n
User-Agent: ONVIF Filter (LIVE555 Streaming Media v2009.11.27)\r\n
\r\n
*/
pacote.setUrl("rtsp://"+host+"/user="+user+"_password="+password+"_channel=0_stream=0.sdp?real_stream");
pacote.setCSeq("3");
pacote.setMethod("play");
pacote.setKey_value(new HashedMap());
pacote.getKey_value().put("Session", Session);
//pacote.getKey_value().put("Range", "npt=0.000-");
//pacote.getKey_value().put("Transporte","RTP/AVP;unicast;client_port=7500-7501");
//pacote.getKey_value().put("User-Agent", "ONVIF Filter (LIVE555 Streaming Media v2009.11.27)");
pacote.setListener(new call() {
@Override
public void recieve(String res, Map<String, String[]> menssage) throws IOException {
System.out.println("recieve Play 1: \n" + res);
}
});
send(pacote);
}
});
send(pacote);
}
});
send(pacote);
}
});
send(pacote);
}
private Map<String,Pocket> mapListerner = new HashedMap();
interface call{
public void recieve(String res, Map<String, String[]> menssage)throws IOException;
}
@Data
public class Pocket{
public String CSeq;
public String Method;
public String Url;
public Map<String,String> key_value;
public call listener;
}
public void send( Pocket pocket ) throws IOException {
StringBuilder message = new StringBuilder();
message.append(pocket.Method.toUpperCase() + " " + pocket.Url + " RTSP/1.0").append("\r\n");
message.append("CSeq: " + pocket.CSeq).append("\r\n");
for(String key : pocket.key_value.keySet()) {
if( pocket.key_value.get(key) != null && pocket.key_value.get(key).length() > 0 ) {
message.append(key+": " + pocket.key_value.get(key)).append("\r\n");
}
}
message.append("\r\n");
System.out.println("SEND:\n"+message);
mapListerner.put(pocket.CSeq, pocket);
out.write(message.toString().getBytes());
}
public class Receive extends Thread{
private InputStream in;
private OutputStream out;
public Receive( InputStream in, OutputStream out ) {
super();
this.in = in;
this.out = out;
}
@Override
public void run(){
StringBuilder pocket = new StringBuilder();
while(true){
try{
String retorno = readLine(in);
if( retorno != null && retorno.length() > 0 ) {
pocket.append(retorno).append("\n");
}else if(pocket.length() > 0 ) {
retorno = pocket.toString();
Map<String,String[]> map = readMap(retorno);
pocket = new StringBuilder();
System.out.println("\t + Recieve packet");
String CSeq = readMapKey(map, "CSeq")[0];
mapListerner.get( CSeq ).listener.recieve( retorno, map);
}
} catch(IOException e) {
e.printStackTrace();
}
}
}
}
public class ReceiveMidia extends Thread{
private int port;
public ReceiveMidia( int port ) {
this.port = port;
}
@Override
public void run(){
byte[] receiveData = new byte[2048];
try {
DatagramSocket serverSocket = new DatagramSocket(port);
while( true ) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
System.out.write(receivePacket.getData());
//String sentence = new String(receivePacket.getData());
//System.out.println(sentence);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static InputStream in;
public static OutputStream out;
// connect RTSP 554
public void connect() {
try {
Socket socket = new Socket("192.168.0.21", 554);
in = socket.getInputStream();
out = socket.getOutputStream();
Receive receive = new Receive(in, out);
receive.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// create socket udp port
public void connectUDP(int port) {
ReceiveMidia receive = new ReceiveMidia( port );
receive.start();
}
// SETUP
// PLAY
// RECIEVE DATA
// DESCRIBE
// TEARDOWN
private String readLine(InputStream in) throws IOException {
int ch = 0;
StringBuilder b = new StringBuilder();
// != -1, != 0x0d, != 0x0a
for(ch = in.read(); ch != -1 && ch != 0x0d && ch != 0x0a; ch = in.read())
b.append((char) ch);
if(ch == -1)
return null;
in.read();
return b.toString();
}
private static Map<String, String[]> readMap(String proto){
Map<String, String[]> map = new HashedMap();
String[] lines = proto.split("\n");
for(String line : lines) {
String[] keyValues = line.split(":");
String key = keyValues[0].trim();
if( keyValues.length > 1 ) {
String[] values = keyValues[1].trim().split(";");
map.put(key.trim(), values);
} else map.put(key.trim(), null);
}
return map;
}
private static String[] readMapKey( Map<String,String[]> map, String proto){
for(String key : map.keySet()) {
if(key.toLowerCase().equals(proto.toLowerCase())) {
String[] values = map.get(key);
if(values == null || values.length < 1) return null;
else return values;
}
}
return null;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment