java模拟UAS发包

来源:互联网 发布:agv磁条算法 编辑:程序博客网 时间:2024/06/05 23:53









import java.io.*;
import java.net.*;






public class sdpAbornamal {
   private static final int PORT = 5060;
   private DatagramSocket dataSocket;
   private DatagramPacket dataPacket;
   private byte receiveByte[];
   private String receiveStr;
   private String sipMsgString = null; 
   private String oldString = null;
   private String Trying100 = null;
   private String progress183 = null;
   private String prack200OK = null;
   private String ring180 = null;   
   private String ok200 = null;
   private String invite = null;   
   public String getString(String sipMsg, String header, String strStart)
   {
            //String tempString = null;           
            int indexStr = 0;
            int indexTagStart = 0;
            int indexTagEnd = 0;
            
        indexStr = sipMsg.indexOf(header);//"From:"
        if(indexStr>=0)
        {
        indexTagStart = sipMsg.indexOf(strStart);//"tag="
        if(indexTagStart>=0)
        {
        indexTagEnd = sipMsg.indexOf("\r\n", indexTagStart);
        if(indexTagEnd<0)
        {
            indexTagEnd = sipMsg.indexOf(";", indexTagStart);           
        }
        if(indexTagEnd>=0)
        {
        oldString = sipMsg.substring(indexTagStart, indexTagEnd);        
        return oldString;
        }
        }
        }
        return null;
   }
      
   
   public String sipMsg100Trying(String from, String to, String via, String callID)
   {
    Trying100 = "SIP/2.0 100 Trying\r\n";
    Trying100 = Trying100 + via + "\r\n";
    Trying100 = Trying100 + to + "\r\n";
    Trying100 = Trying100 + from + "\r\n";
    Trying100 = Trying100 + callID + "\r\n";
    Trying100 = Trying100 + "CSeq: 1 INVITE\r\n" + "Content-Length: 0\r\n\r\n";   
    return Trying100;
   }


   public String sipMsg183progress(String from, String to, String via, String callID)
   {
    progress183 = "SIP/2.0 183 Session Progress\r\n";
    progress183 = progress183 + via + "\r\n";
    progress183 = progress183 + to + "\r\n";
    progress183 = progress183 + from + "\r\n";
    progress183 = progress183 + callID + "\r\n";
    progress183 = progress183 + "CSeq: 1 INVITE\r\n" + "Contact: <sip:200@192.168.10.45:5060>\r\n"; 
    progress183 = progress183 + "RSeq: 26048\r\n";   
    progress183 = progress183 + "Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,INFO,REFER,NOTIFY,SUBSCRIBE,PRACK,UPDATE\r\n";
    progress183 = progress183 + "Require: 100rel\r\n";
    progress183 = progress183 + "User-Agent: ZTE Softswitch/1.0.0\r\n";
    progress183 = progress183 + "Content-Length: 0\r\n\r\n";   
    return progress183;
   }    


   public String sipMsgPrack200OK(String from, String to, String via, String callID, int cseq)
   {//PRACK sip:
    prack200OK = "SIP/2.0 200 OK\r\n";
    prack200OK = prack200OK + via + "\r\n";
    prack200OK = prack200OK + to + "\r\n";
    prack200OK = prack200OK + from + "\r\n";
    prack200OK = prack200OK + callID + "\r\n";
    prack200OK = prack200OK + "CSeq: "+cseq+" PRACK\r\n";
    prack200OK = prack200OK + "Content-Length: 0\r\n\r\n";   
    return prack200OK;
   }    
   
   public String sipMsg180ring(String from, String to, String via, String callID)
   {
    ring180 = "SIP/2.0 180 Ringing\r\n";
    ring180 = ring180 + via + "\r\n";
    ring180 = ring180 + to + "\r\n";
    ring180 = ring180 + from + "\r\n";
    ring180 = ring180 + callID + "\r\n";
    ring180 = ring180 + "CSeq: 1 INVITE"+"\r\n";   
    ring180 = ring180 + "Contact: <sip:200@192.168.10.45:5060>"+"\r\n";
    ring180 = ring180 + "Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,INFO,REFER,NOTIFY,SUBSCRIBE,PRACK,UPDATE"+"\r\n";
    ring180 = ring180 + "RSeq: 26049"+"\r\n";
    ring180 = ring180 + "Require: 100rel"+"\r\n";
    ring180 = ring180 + "User-Agent: ZTE Softswitch/1.0.0"+"\r\n";
    ring180 = ring180 + "Content-Type: application/sdp"+"\r\n";
    ring180 = ring180 + "Content-Length: 146\r\n\r\nv=0\r\no=ZTE 143 14676 IN IP4 10.128.0.36\r\ns=phone-call\r\nc=IN IP4 10.128.0.238\r\n";
    ring180 = ring180 + "t=0 0\r\nm=audio 20164 RTP/AVP 0\r\na=ptime:20\r\na=rtpmap:0 PCMU/8000/1\r\n\r\n";
    //ring180 = ring180 + "Content-Length: 145\r\n\r\nv=0\r\no=ZTE 458 8606 IN IP4 10.128.0.36\r\ns=phone-call\r\nc=IN IP4 10.128.0.238\r\n";
    //ring180 = ring180 + "t=0 0\r\nm=audio 18000 RTP/AVP 0\r\na=ptime:20\r\na=rtpmap:0 PCMU/8000/1\r\n\r\n";
    return ring180;
   }
   
   public String sipMsg200OK(String from, String to, String via, String callID)
   {
    ok200 = "SIP/2.0 200 OK\r\n";
    ok200 = ok200 + via + "\r\n";
    ok200 = ok200 + to + "\r\n";
    ok200 = ok200 + from + "\r\n";
    ok200 = ok200 + callID + "\r\n";
    ok200 = ok200 + "CSeq: 1 INVITE"+"\r\n";   
    ok200 = ok200 + "Contact: <sip:200@192.168.10.45:5060>"+"\r\n";
    ok200 = ok200 + "Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,INFO,REFER,NOTIFY,SUBSCRIBE,PRACK,UPDATE"+"\r\n";
    ok200 = ok200 + "RSeq: 1"+"\r\n";
    ok200 = ok200 + "Require: 100rel"+"\r\n";
    ok200 = ok200 + "User-Agent: ZTE Softswitch/1.0.0"+"\r\n";
    ok200 = ok200 + "Content-Type: application/sdp"+"\r\n";
    ok200 = ok200 + "Content-Length: 0\r\n\r\n";   
    return ok200;
   }     
   public String sipMsgInvite(String from, String to, String via, String callID)
   {
    invite = "INVITE sip:"+from.substring(11+5,11+5+32) +" SIP/2.0" + "\r\n";
    invite = invite + "Via: SIP/2.0/UDP 192.168.10.45:5060;branch=z9hG4bK69692f44ca701.0\r\n";
    invite = invite + "To:"+ from.substring(5)+"\r\n";
    invite = invite + "From: "+to.substring(4)+"\r\n";
    invite = invite + callID + "\r\n";
    invite = invite + "CSeq: 3632 INVITE"+"\r\n";   
    invite = invite + "Contact: <sip:200@192.168.10.45:5060>"+"\r\n";
    //invite = invite + "Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,INFO,REFER,NOTIFY,SUBSCRIBE,PRACK,UPDATE"+"\r\n";
    //invite = invite + "RSeq: 1"+"\r\n";
    //invite = invite + "Require: 100rel"+"\r\n";
    invite = invite + "User-Agent: ZTE Softswitch/1.0.0"+"\r\n";
    invite = invite + "Content-Type: application/sdp"+"\r\n";
    invite = invite + "Content-Length: 132\r\n\r\nv=0\r\no=ZTE 458 8607 IN IP4 10.128.0.36\r\ns=phone-call\r\nc=IN IP4 10.128.0.238\r\n";
    invite = invite + "t=0 0\r\nm=audio 18000 RTP/AVP 0\r\na=ptime:20\r\na=Modem\r\n\r\n";
    return invite;
   }    
/*    
   public String sipMsgInvite(String from, String to, String via, String callID)
   {
    invite = "INVITE sip:"+from.substring(11+5,11+5+31) +" SIP/2.0" + "\r\n";
    invite = invite + "Via: SIP/2.0/UDP 192.168.10.45:5060;branch=z9hG4bK69692f44ca701.0\r\n";
    invite = invite + "To:"+ from.substring(5)+"\r\n";
    invite = invite + "From: "+to.substring(5)+"\r\n";
    invite = invite + callID + "\r\n";
    invite = invite + "CSeq: 2 INVITE"+"\r\n";   
    invite = invite + "Contact: <sip:200@192.168.10.45:5060>"+"\r\n";
    //invite = invite + "Allow: INVITE,ACK,OPTIONS,BYE,CANCEL,INFO,REFER,NOTIFY,SUBSCRIBE,PRACK,UPDATE"+"\r\n";
    //invite = invite + "RSeq: 1"+"\r\n";
    //invite = invite + "Require: 100rel"+"\r\n";
    invite = invite + "User-Agent: ZTE Softswitch/1.0.0"+"\r\n";
    invite = invite + "Content-Type: application/sdp"+"\r\n";
    invite = invite + "Content-Length: 132\r\n\r\nv=0\r\no=ZTE 458 8607 IN IP4 10.128.0.36\r\ns=phone-call\r\nc=IN IP4 10.128.0.238\r\n";
    invite = invite + "t=0 0\r\nm=audio 18000 RTP/AVP 0\r\na=ptime:20\r\na=Modem\r\n\r\n";
    return invite;
   }
*/    
/*
   v=0
   o=ZTE 458 8606 IN IP4 10.128.0.36
   s=phone-call
   c=IN IP4 10.128.0.238
   t=0 0
   m=audio 18000 RTP/AVP 0
   a=ptime:20
   a=rtpmap:0 PCMU/8000/1
*/   


   public sdpAbornamal() {   
       Init();
   }


   public void Init() {
       try {
           dataSocket = new DatagramSocket(PORT);
           receiveByte = new byte[10240];
           String fromTag = null;
           String callID = null;
           String viaBranch = null;
           dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
           receiveStr = "";
           String sendStr = "";
           String from = "";
           String to = "";
           String via = "";
           String viaprack = "";           
           
           int i = 0;
           int j = 0;
           while (i == 0)// 无数据,则循环
           {
               dataSocket.receive(dataPacket);
               i = dataPacket.getLength();
               // 接收数据


               if (i > 0) {
                   // 指定接收到数据的长度,可使接收数据正常显示,开始时很容易忽略这一点


                   receiveStr = new String(receiveByte, 0, dataPacket.getLength());
                   System.out.println(receiveStr);       
               if(-1==receiveStr.indexOf("INVITE sip:"))
               {
               i = 0;
               continue;
               }                    
                   byte[] sendBuf;
                   int port = dataPacket.getPort();
                   InetAddress addr = dataPacket.getAddress();
                   
                   fromTag = getString(receiveStr, "From:", "tag=");
                   from = getString(receiveStr, "From:",  "From:");
                   to = getString(receiveStr, "To:", "To:");
                   via = getString(receiveStr, "Via:", "Via:");                   
                   callID = getString(receiveStr, "Call-ID:", "Call-ID:");
                   viaBranch =  getString(receiveStr, "Via:", "branch=");


                   sipMsg100Trying(from, to, via, callID);
                   sendStr = Trying100;
                   sendBuf = sendStr.getBytes();
                   DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);//InetAddress.getByName("192.168.12.250") 
                   dataSocket.send(sendPacket);
                   System.out.println(sendStr);


                   try{
                       Thread thread = Thread.currentThread();
                       thread.sleep(100);//暂停0.1秒后程序继续执行
                   }catch (InterruptedException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                       //return;
                   }                   
                   
                   //String fileName = new String("F:\\project\\java\\sipMsgSimulate\\bin\\sipMsg.log");
                   //sendStr = prepareSipMsg200OK(fileName, fromTag, callID, viaBranch);
                   sendStr = sipMsg183progress(from, to, via, callID);
                   sendBuf = sendStr.getBytes();
                   sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);//InetAddress.getByName("192.168.12.250") 
                   dataSocket.send(sendPacket);
                   System.out.println(sendStr);
                   
                   j = 0;
                   while(j==0)
                   {
                   //receives PRACK sip:
                   dataSocket.receive(dataPacket);
                   j = dataPacket.getLength();
                   dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
                   receiveStr = new String(receiveByte, 0, dataPacket.getLength());
                   
                   System.out.println(receiveStr);
                   }
                   
                   if(receiveStr.indexOf("PRACK sip:")>=0)
                   {
                   fromTag = getString(receiveStr, "From:", "tag=");
                   from = getString(receiveStr, "From:",  "From:");
                   to = getString(receiveStr, "To:", "To:");
                   viaprack = getString(receiveStr, "Via:", "Via:");                   
                   callID = getString(receiveStr, "Call-ID:", "Call-ID:");
                   //viaBranch =  getString(receiveStr, "Via:", "branch=");  
                   
                   sendStr = sipMsgPrack200OK(from, to, viaprack, callID, 2);
                   sendBuf = sendStr.getBytes();
                   sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);//InetAddress.getByName("192.168.12.250") 
                   dataSocket.send(sendPacket);                   
                   }


                   sendStr = sipMsg180ring(from, to, via, callID);
                   sendBuf = sendStr.getBytes();
                   sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);//InetAddress.getByName("192.168.12.250") 
                   dataSocket.send(sendPacket);
                   System.out.println(sendStr);   


                   try{
                       Thread thread = Thread.currentThread();
                       thread.sleep(200);//暂停0.1秒后程序继续执行
                   }catch (InterruptedException e) {
                       // TODO Auto-generated catch block
                       e.printStackTrace();
                       //return;
                   }                   


                   j = 0;
                   while(j==0)
                   {
                   //receives PRACK sip:
                   dataSocket.receive(dataPacket);
                   j = dataPacket.getLength();
                   dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
                   receiveStr = new String(receiveByte, 0, dataPacket.getLength());
                   
                   System.out.println(receiveStr);
                   }
                   
                   if(receiveStr.indexOf("PRACK sip:")>=0)
                   {
                   fromTag = getString(receiveStr, "From:", "tag=");
                   from = getString(receiveStr, "From:",  "From:");
                   to = getString(receiveStr, "To:", "To:");
                   viaprack = getString(receiveStr, "Via:", "Via:");                   
                   callID = getString(receiveStr, "Call-ID:", "Call-ID:");
                   viaBranch =  getString(receiveStr, "Via:", "branch=");  
                   
                   sendStr = sipMsgPrack200OK(from, to, viaprack, callID, 3);
                   sendBuf = sendStr.getBytes();
                   sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);//InetAddress.getByName("192.168.12.250") 
                   dataSocket.send(sendPacket);                   
                   }                   


                    sendStr = sipMsg200OK(from, to, via, callID);
                    sendBuf = sendStr.getBytes();
                    sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);//InetAddress.getByName("192.168.12.250") 
                    dataSocket.send(sendPacket);
                    System.out.println(sendStr);                   
                   
                   //receives PRACK sip:
               dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
                   receiveStr = new String(receiveByte, 0, dataPacket.getLength());
                   System.out.println(receiveStr); 


                   j = 0;
                   while(j==0)
                   {
                   //receives PRACK sip:
                   dataSocket.receive(dataPacket);
                   j = dataPacket.getLength();
                   dataPacket = new DatagramPacket(receiveByte, receiveByte.length);
                   receiveStr = new String(receiveByte, 0, dataPacket.getLength());                   
                   System.out.println(receiveStr);
                   
                   fromTag = getString(receiveStr, "From:", "tag=");
                   from = getString(receiveStr, "From:",  "From:");
                   to = getString(receiveStr, "To:", "To:");
                   via = getString(receiveStr, "Via:", "Via:");                   
                   callID = getString(receiveStr, "Call-ID:", "Call-ID:");
                   viaBranch =  getString(receiveStr, "Via:", "branch=");                   
                   
                   if(receiveStr.indexOf("ACK sip:")>=0)
                   {                   
                   sendStr = sipMsgInvite(from, to, via, callID);
                   sendBuf = sendStr.getBytes();
                   sendPacket = new DatagramPacket(sendBuf, sendBuf.length, addr, port);//InetAddress.getByName("192.168.12.250") 
                   dataSocket.send(sendPacket);
                   System.out.println(sendStr);
                   }  
                   }                   
                                                        
                   i = 0;// 循环接收
                   return;
               }
           }
           dataSocket.close();
       } catch (Exception e) {
           e.printStackTrace();
           return;
       }
   }


   public static void main(String args[]) {
    sdpAbornamal udpserver = new sdpAbornamal();
       //System.out.println(udpserver.);
   }
}

0 0
原创粉丝点击