Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> RTP, SRTP, SIP, SDP, работа с протоколами, совмещение 
:(
    Опции темы
Invisible
Дата 29.7.2010, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Здравствуйте, появилась необходимость использования протоколов RTP, SRTP, SIP, SDP. С RTP все, вроде как, было ясно, использовал JMF. Однако слышал что JMF был заброшен компанией SUN приличное время назад. Так же в JMF я не нашел ничего для работы с SRTP. К сожалению на оф сайте oracle все примеры связанные с необходимой мне информацией не работают.

Так же очень хотелось бы узнать: где можно посмотреть\ почитать про то, как в JAVA обстоят дела с SIP и SDP, как их вообще использовать в сочетании с RTP. 

Есть ли на сегодняшний день библиотеки, которые в себе содержат функционал для работы с вышеперечисленными протоколами?

Спасибо.
PM MAIL   Вверх
Invisible
Дата 30.7.2010, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Если никто не знает про адекватные библиотеки, ответьте мне хотя бы на такой вопрос:

Можно ли в ручную заполнять пакеты так как указано в стандарте RTP. Далее отсылая их в канал.


В подобных темах от 2005 года сообщалось что все что связано с сетью (пакетами и прочим добром) скрыто от программиста.
PM MAIL   Вверх
Asal
Дата 30.7.2010, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 288
Регистрация: 26.12.2006
Где: Минск

Репутация: нет
Всего: 7



Цитата(Invisible @  29.7.2010,  16:15 Найти цитируемый пост)
Так же очень хотелось бы узнать: где можно посмотреть\ почитать про то, как в JAVA обстоят дела с SIP и SDP, как их вообще использовать в сочетании с RTP.

Никак не обстоят! Гамно а не либы!
OPAL тебе в зубы!
посмотри как пример ASG Phone я его не доделал, но как пример пойдет.


--------------------
PM MAIL ICQ   Вверх
Invisible
Дата 2.8.2010, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Все еще пытаюсь решить проблему. 

С использованием JMF пытаюсь собрать свой RTP пакет, но при подключении через плеер VLC слышу шипение вместо того что записано в файл mp3. Могу предположить что заполняю пакет не верно, возможно формат не тот. 

Код

public static void run()  {
         
        try {
        DatagramSocket socket = new DatagramSocket(localPort);
        
        Random r = new Random();
        int sequenceNumber = r.nextInt();
        int syncId = r.nextInt();
        int timeStamp = 0;
        
        int len = 256;
        byte[] buf = new byte[len];
        
        int code = 0;
        int headerLength = 12;
        while ((code = is.read(buf, headerLength, len - headerLength)) > -1) {
            int i = 0;
            buf[i++] = (byte) 0x80; // version info
            buf[i++] = (byte) 0x08;    // вот тут хз , выставлен для alaw
            sequenceNumber++;
            buf[i++] = (byte) (sequenceNumber / 0x100);
            buf[i++] = (byte) (sequenceNumber % 0x100);
            
            timeStamp += (len - 12);
            int timeStampTop = (timeStamp / 0x10000);
            buf[i++] = (byte) (timeStampTop / 0x100);
            buf[i++] = (byte) (timeStampTop % 0x100);
            int timeStampBottom = (timeStamp % 0x10000);
            buf[i++] = (byte) (timeStampBottom / 0x100);
            buf[i++] = (byte) (timeStampBottom % 0x100);
            
            
            int syncIdTop = (syncId / 0x10000);
            buf[i++] = (byte) (syncIdTop / 0x100);
            buf[i++] = (byte) (syncIdTop % 0x100);
            int syncIdBottom = (syncId % 0x10000);
            buf[i++] = (byte) (syncIdBottom / 0x100);
            buf[i++] = (byte) (syncIdBottom % 0x100);
            
            DatagramPacket packet = new DatagramPacket(buf, code+headerLength, InetAddress.getByName(address), port);
            socket.send(packet);
            Thread.sleep(1); // this sets the speed of delivery "faster than real time"
        }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }



Это сообщение отредактировал(а) Invisible - 2.8.2010, 11:15
PM MAIL   Вверх
kkorsakoff
Дата 2.8.2010, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 4
Всего: 14



Я использую jain-sip по работе. В принципе справляется с SIP, SDP. Для RTP ничего вменяемого не нашел, а JMF полная беда.
PM MAIL WWW ICQ   Вверх
Invisible
Дата 4.8.2010, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Увы но все еще не решена задача, хотя я уже довольно далеко продвинулся. В данный момент основная проблема с заполнением заголовка пакета. Никак не могу найти подробную информацию о том какой он должен быть, с подробным описанием того какие поля необходимо заполнять и как это делается в java.

В одном из примеров было предложено очень близкое но увы не правильное решение.

Приведу кусок кода
Код

//Bitstream of the RTP header
  public byte[] header;

  public int Version;
  public int Padding;
  public int Extension;
  public int CC;
  public int Marker;
  public int PayloadType;
  public int SequenceNumber;
  public int TimeStamp;
  public int Ssrc;

...

    Version = 2;
    Padding = 0;
    Extension = 0;
    CC = 0;
    Marker = 0;
    Ssrc = 0;

Само заполнение

header[0] = (byte) (header[0] | Version << 7);
    header[0] = (byte) (header[0] | Padding << 5);
    header[0] = (byte) (header[0] | Extension << 4);
    header[0] = (byte) (header[0] | CC << 3);

    header[1] = (byte) (header[1] | Marker << 7);
    header[1] = (byte) (header[1] | PayloadType << 6);
    
    header[2] = (byte) (SequenceNumber >> 8);

    header[3] = (byte) (SequenceNumber & 0xFF);

    header[4] = (byte) (TimeStamp >> 24);
    
    header[5] = (byte) (TimeStamp >> 16);

    header[6] = (byte) (TimeStamp >> 8);

    header[7] = (byte) (TimeStamp & 0xFF);

    header[8] = (byte) (Ssrc >> 24);
    
    header[9] = (byte) (Ssrc >> 16);

    header[10] = (byte) (Ssrc >> 8);

    header[11] = (byte) (Ssrc & 0xFF);



Увы но не читается ни одном из плееров. Поставил Wireshark, сравнил пакеты которые идут из JMF с данной реализацией:

Из этого сделал вывод что не правильно заполняется заголовок пакета. Очень жду вашей помощи.  



Это сообщение отредактировал(а) Invisible - 4.8.2010, 16:05

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  123.JPG 15,86 Kb
PM MAIL   Вверх
Invisible
Дата 9.8.2010, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Долго думал что же это может быть. Решил попробовать заполнить заголовок пакета с помощью BitSet, а так же нашел метод unsigned int. Заполнил и все получилось. Не знаю почему со сдвигами не работало, но при сравнении действительно заметна разница. 

Код

import java.util.BitSet;

public class RTPpacket{

  //size of the RTP header:
  static int HEADER_SIZE = 12;

  //Fields that compose the RTP header
  public int Version;
  public int Padding;
  public int Extension;
  public int CC;
  public int Marker;
  public int PayloadType;
  public int SequenceNumber;
  public int TimeStamp;
  public int Ssrc;
  
  //Bitstream of the RTP header
  public byte[] header;

  //size of the RTP payload
  public int payload_size;
  //Bitstream of the RTP payload
  public byte[] payload; 

  //--------------------------
  //Constructor of an RTPpacket object from header fields and payload bitstream
  //--------------------------
  public RTPpacket(int PType, int Framenb, int Time, byte[] data, int data_length, int ssrc){
    //fill by default header fields:
    Version = 2;
    Padding = 0;
    Extension = 0;
    CC = 0;
    Marker = 0;
    this.Ssrc = ssrc;

    //fill changing header fields:
    SequenceNumber = Framenb;
    TimeStamp = Time;
    PayloadType = PType;
    
    //build the header bistream:
    //--------------------------
    header = new byte[HEADER_SIZE];

    
    BitSet bset = new BitSet();
    bset.flip(15);//version always 2

    bset.flip(3);//payload type 14 (for mp3)
    bset.flip(2);
    bset.flip(1);

//http://ru.wikipedia.org/wiki/RTP
//bit set:
//100000000001110
//10 = version 2
//1110 = 14 (mp3)
//bitset size == 16 bit == 2 bytes 
    
    byte[] header1 = toByteArray(bset);        
    header[0] = header1[1];//first byte -> 8 bits
    header[1] = header1[2];//second byte -> 8 bits
    
    byte[] header3 = intToByteArray1(SequenceNumber);
    header[2] = header3[0];
    header[3] = header3[1];

    byte[] header4 = intToByteArray2(TimeStamp);
    header[4] = header4[0];
    header[5] = header4[1];
    header[6] = header4[2];
    header[7] = header4[3];    
    
    byte[] header5 = intToByteArray2(Ssrc);    
    header[8]  = header5[0];    
    header[9]  = header5[1];
    header[10] = header5[2];
    header[11] = header5[3];     

    //fill the payload bitstream:
    //--------------------------
    payload_size = data_length;
    payload = new byte[data_length];
    
    payload = data;
  }    


  //--------------------------
  //getpayload: return the payload bistream of the RTPpacket and its size
  //--------------------------
  public int getpayload(byte[] data) {

    for (int i=0; i < payload_size; i++)
      data[i] = payload[i];

    return(payload_size);
  }

  //--------------------------
  //getpayload_length: return the length of the payload
  //--------------------------
  public int getpayload_length() {
    return(payload_size);
  }

  //--------------------------
  //getlength: return the total length of the RTP packet
  //--------------------------
  public int getlength() {
    return(payload_size + HEADER_SIZE);
  }

  //--------------------------
  //getpacket: returns the packet bitstream and its length
  //--------------------------
  public int getpacket(byte[] packet)
  {
    //construct the packet = header + payload
    for (int i=0; i < HEADER_SIZE; i++){
     packet[i] = header[i];
    }
    
    for (int i=0; i < payload_size; i++){
     packet[i + HEADER_SIZE] = payload[i];
    }

    //return total size of the packet
    return(payload_size + HEADER_SIZE);
  }

  //--------------------------
  //gettimestamp
  //--------------------------

  public int gettimestamp() {
    return(TimeStamp);
  }

  //--------------------------
  //getsequencenumber
  //--------------------------
  public int getsequencenumber() {
    return(SequenceNumber);
  }

  //--------------------------
  //getpayloadtype
  //--------------------------
  public int getpayloadtype() {
    return(PayloadType);
  }


  //--------------------------
  //print headers without the SSRC
  //--------------------------
  public void printheader()
  {
    //TO DO: uncomment
    
//    for (int i=0; i < (HEADER_SIZE-4); i++)
//      {
//    for (int j = 7; j>=0 ; j--)
//      if (((1<<j) & header[i] ) != 0)
//        System.out.print("1");
//    else
//      System.out.print("0");
//    System.out.print(" ");
//      }
//
//    System.out.println();
    
  }

  //return the unsigned value of 8-bit integer nb
  static int unsigned_int(int nb) {
    if (nb >= 0)
      return(nb);
    else
      return(256+nb);
  }
  
  public byte[] toByteArray(BitSet bits) {
        byte[] bytes = new byte[bits.length()/8+1];
        for (int i=0; i<bits.length(); i++) {
            if (bits.get(i)) {
                bytes[bytes.length-i/8-1] |= 1<<(i%8);
            }
        }
        return bytes;
    }
  
  //returned bytes size max size of 65535 (2 bytes of 4)
  public static final byte[] intToByteArray1(int value) {
      return new byte[] {(byte) (value >>> 8), (byte) value };
    }
  
  public static final byte[] intToByteArray2(int value) {
        return new byte[] { (byte) (value >>> 24), (byte) (value >>> 16),
                (byte) (value >>> 8), (byte) value };
    }

}




Это сообщение отредактировал(а) Invisible - 9.8.2010, 16:10
PM MAIL   Вверх
Invisible
Дата 10.8.2010, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Скажите а каким образом проигрывать поток rtp ? Знаю что в ServerSocket есть возможность получения InputStream, на основе которого построены все примеры плееров. Но в случае с Datagram все иначе. Там только пакетами получать по видимому. Что с данными то далее делать? Именно со звуком, потому что пример с видео имеется. Там с каждого пакета формировалась картинка и просто выводилась на экран.

Это сообщение отредактировал(а) Invisible - 10.8.2010, 11:59
PM MAIL   Вверх
Invisible
Дата 30.8.2010, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 26.5.2005

Репутация: нет
Всего: нет



Продолжаю свой монолог. Возможно кому - то в будущем понадобится.

Необходимо: jain - Sip, log4j
Код

package examples.simplecallsetup;

import java.util.Properties;

import javax.sip.*;

import javax.sip.address.*;

import javax.sip.header.*;

import javax.sip.message.*;

public class SipServer implements SipListener {
    
    private static MessageFactory messageFactory;
    private static AddressFactory addressFactory;
    private static HeaderFactory headerFactory;
    private static SipProvider sipProvider;
    
    private static final String myAddress = "127.0.0.1";
    private static final int myPort = 5070;
    
    private Dialog dialog;

    @Override
    public void processDialogTerminated(DialogTerminatedEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void processIOException(IOExceptionEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void processRequest(RequestEvent requestEvent) {
        Request clientRequest = requestEvent.getRequest();
        
        if (clientRequest.getMethod().equals(Request.INVITE)) {
            processInvite(requestEvent);
        } else if (clientRequest.getMethod().equals(Request.ACK)) {
            processAck(requestEvent);
        } else {
            //do nothing
        }
    }

    @Override
    public void processResponse(ResponseEvent responseReceivedEvent) {
        Response response = (Response) responseReceivedEvent.getResponse();        
        CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
        
        if (response.getStatusCode() == Response.OK) {
            if (cseq.getMethod().equals(Request.BYE)) {
                System.out.println("User disconnected.");
            }
        }

    }

    @Override
    public void processTimeout(TimeoutEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void processTransactionTerminated(TransactionTerminatedEvent arg0) {
        // TODO Auto-generated method stub

    }
    
    public static void main(String args[]) {        
        SipServer server = new SipServer();
        server.init();
    }
    
    public void init() {
        SipFactory sipFactory = SipFactory.getInstance();
        sipFactory.setPathName("gov.nist");
        
        try {
            messageFactory = sipFactory.createMessageFactory();
            addressFactory = sipFactory.createAddressFactory();
            headerFactory = sipFactory.createHeaderFactory();
        } catch (PeerUnavailableException e) {
            e.printStackTrace();
        }
        
        SipServer listener = this;

        SipStack sipStack = getSipStack();
        
        ListeningPoint listeningPort = null;
        try{
            listeningPort = sipStack.createListeningPoint("127.0.0.1", 5070, "udp");
            sipProvider = sipStack.createSipProvider(listeningPort);        
            sipProvider.addSipListener(listener);            
        } catch(Exception e){
            e.printStackTrace();
        }
        
        System.out.println("Server started.");        
    }
    
    private SipStack getSipStack() {
        SipFactory sipFactory = SipFactory.getInstance();
        sipFactory.setPathName("gov.nist");
        
        Properties properties = new Properties();
        properties.setProperty("javax.sip.STACK_NAME", "shootme");        
        properties.setProperty("gov.nist.javax.sip.TRACE_LEVEL", "32");
        properties.setProperty("gov.nist.javax.sip.DEBUG_LOG", "sipstackdebug.txt");
        properties.setProperty("gov.nist.javax.sip.SERVER_LOG", "sipstacklog.txt");
        
        SipStack sipStack = null;
        try {            
            sipStack = sipFactory.createSipStack(properties);            
        } catch (PeerUnavailableException e) {            
            e.printStackTrace();            
        }
        
        return sipStack;
    }
    
    private void processInvite(RequestEvent requestEvent) {
        System.out.println("processInvite");        
        
        SipProvider sipProvider = (SipProvider) requestEvent.getSource();
        Request request = requestEvent.getRequest();
        
        try {            
            Response responseRing = messageFactory.createResponse(Response.RINGING, request);
            Response responseOk = messageFactory.createResponse(Response.OK, request);
            
            ServerTransaction st = requestEvent.getServerTransaction();

            if (st == null) {
                st = sipProvider.getNewServerTransaction(request);
            }
            dialog = st.getDialog();            
            
            String strAddress = "<sip:"+ myAddress + ":" + myPort + ">";
            Address address = addressFactory.createAddress(strAddress);
            
            ContactHeader contactHeader = headerFactory.createContactHeader(address);
            
            responseRing.addHeader(contactHeader);
            responseOk.addHeader(contactHeader);
            
            st.sendResponse(responseRing);
            st.sendResponse(responseOk);
                
        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(0);
        }
    }
    
    private void processAck(RequestEvent requestEvent) {
        System.out.println("");
        System.out.println("processAck");
        System.out.println("Dialog State = " + dialog.getState());    
        
        startTransmition();
    }
    
    private void startTransmition(){
        System.out.println("Starting the transmition.");
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {            
            e.printStackTrace();
        }
        System.out.println("Transmittion ended.");
        System.out.println("Sending BYE.");
        sendBye();
    }
    
    private void sendBye(){
        Request byeRequest;
        try {
            byeRequest = dialog.createRequest(Request.BYE);
            ClientTransaction ct = sipProvider.getNewClientTransaction(byeRequest);
            dialog.sendRequest(ct);
        } catch (SipException e) {            
            e.printStackTrace();
        }
    }

}


Код

package examples.simplecallsetup;

import java.util.ArrayList;
import java.util.Properties;

import javax.sip.*;

import javax.sip.address.*;

import javax.sip.header.*;

import javax.sip.message.*;


public class SipClient implements SipListener{

    private static SipStack sipStack;
    private static SipProvider sipProvider;
    private static MessageFactory messageFactory;
    
    private Dialog dialog = null;
    
    @Override
    public void processDialogTerminated(DialogTerminatedEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void processIOException(IOExceptionEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void processRequest(RequestEvent requestReceivedEvent) {
        Request request = requestReceivedEvent.getRequest();
        ServerTransaction serverTransactionId = requestReceivedEvent
                .getServerTransaction();    

        if (request.getMethod().equals(Request.BYE)){
            processBye(request, serverTransactionId);
        }        
    }

    @Override
    public void processResponse(ResponseEvent responseReceivedEvent) {
        Response response = (Response) responseReceivedEvent.getResponse();
        CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);
        
        if (response.getStatusCode() == Response.OK) {
            
            if (cseq.getMethod().equals(Request.INVITE)) {
                
                try{
                    String name = CSeqHeader.NAME;
                    CSeqHeader header = (CSeqHeader) response.getHeader(name);
                    long seqNumber = header.getSeqNumber();
                    Request ackRequest = dialog.createAck(seqNumber);
                    dialog.sendAck(ackRequest);
                    System.out.println("Sending ACK.");
                } catch(Exception e){
                    e.printStackTrace();
                }
                
            } else if (cseq.getMethod().equals(Request.CANCEL)) {
                
                if (dialog.getState() == DialogState.CONFIRMED) {
                    String message = "Sending BYE -- cancel went in too late";
                    System.out.println(message);
                    
                    Request byeRequest = null;
                    ClientTransaction ct = null;
                    try {
                        byeRequest = dialog.createRequest(Request.BYE);                    
                        ct = sipProvider
                                .getNewClientTransaction(byeRequest);
                        dialog.sendRequest(ct);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }                    

                }
                
            } else if (cseq.getMethod().equals(Request.BYE)) {
                System.out.println("\n\n Got BYE! \n\n");
            }
            
        } 
        
    }

    @Override
    public void processTimeout(TimeoutEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    @Override
    public void processTransactionTerminated(TransactionTerminatedEvent arg0) {
        // TODO Auto-generated method stub
        
    }
    
    public static void main(String args[]) {
        new SipClient().init();
    }
    
    public void init() {
        SipFactory sipFactory = SipFactory.getInstance();
        sipFactory.setPathName("gov.nist");
        
        Properties properties = new Properties();
        
        
        String transport = "udp";
        String peerHostPort = "127.0.0.1:5070";        
        String peerTrans = peerHostPort + "/" + transport;
        
        properties.setProperty("javax.sip.OUTBOUND_PROXY", peerTrans);        
        properties.setProperty("javax.sip.STACK_NAME", "shootist");
        
        String sipPack = "gov.nist.javax.sip";
        properties.setProperty(sipPack + ".DEBUG_LOG","shootistdebug.txt");
        properties.setProperty(sipPack + ".SERVER_LOG","shootistlog.txt");        
        properties.setProperty(sipPack + ".CACHE_CLIENT_CONNECTIONS","false");    
        properties.setProperty(sipPack + ".TRACE_LEVEL", "DEBUG");
        
        try {            
            sipStack = sipFactory.createSipStack(properties);
            System.out.println("createSipStack " + sipStack);
        } catch (PeerUnavailableException e) {            
            e.printStackTrace();
            System.err.println(e.getMessage());
            System.exit(0);
        }
        
        try {
            HeaderFactory headerFactory = sipFactory.createHeaderFactory();
            AddressFactory addressFactory = sipFactory.createAddressFactory();
            messageFactory = sipFactory.createMessageFactory();
            ListeningPoint udpListeningPoint = sipStack.createListeningPoint("127.0.0.1", 5060, "udp");
            sipProvider = sipStack.createSipProvider(udpListeningPoint);
            SipClient listener = this;
            sipProvider.addSipListener(listener);
            
            
            String fromName = "BigGuy";
            String fromSipAddress = "here.com";
            
            // create >From Header
            SipURI fromAddress = addressFactory.createSipURI(fromName,
                    fromSipAddress);
                        
            String fromDisplayName = "The Master Blaster";
            Address fromNameAddress = addressFactory.createAddress(fromAddress);
            fromNameAddress.setDisplayName(fromDisplayName);
            
            FromHeader fromHeader = headerFactory.createFromHeader(
                    fromNameAddress, "12345");
            
            String toSipAddress = "there.com";
            String toUser = "LittleGuy";
            String toDisplayName = "The Little Blister";            

            // create To Header
            SipURI toAddress = addressFactory
                    .createSipURI(toUser, toSipAddress);
            
            Address toNameAddress = addressFactory.createAddress(toAddress);
            toNameAddress.setDisplayName(toDisplayName);
            
            ToHeader toHeader = headerFactory.createToHeader(toNameAddress,
                    null);
            
            // create Request URI
            SipURI requestURI = addressFactory.createSipURI(toUser,
                    peerHostPort);

            // Create ViaHeaders
            ArrayList<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
            String ipAddress = udpListeningPoint.getIPAddress();
            ViaHeader viaHeader = headerFactory.createViaHeader(ipAddress,
                    sipProvider.getListeningPoint(transport).getPort(),
                    transport, null);

            // add via headers
            viaHeaders.add(viaHeader);            

            // Create a new CallId header
            CallIdHeader callIdHeader = sipProvider.getNewCallId();

            // Create a new Cseq header
            CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L,
                    Request.INVITE);

            // Create a new MaxForwardsHeader
            MaxForwardsHeader maxForwards = headerFactory
                    .createMaxForwardsHeader(70);

            // Create the request.
            Request request = messageFactory.createRequest(requestURI,
                    Request.INVITE, callIdHeader, cSeqHeader, fromHeader,
                    toHeader, viaHeaders, maxForwards);
            

            // Create contact headers
            String host = "127.0.0.1";

            SipURI contactUrl = addressFactory.createSipURI(fromName, host);
            contactUrl.setPort(udpListeningPoint.getPort());
            contactUrl.setLrParam();

            // Create the contact name address.
            SipURI contactURI = addressFactory.createSipURI(fromName, host);
            contactURI.setPort(sipProvider.getListeningPoint(transport)
                    .getPort());

            Address contactAddress = addressFactory.createAddress(contactURI);

            // Add the contact address.
            contactAddress.setDisplayName(fromName);

            ContactHeader contactHeader = headerFactory.createContactHeader(contactAddress);
            request.addHeader(contactHeader);

            // You can add extension headers of your own making
            // to the outgoing SIP request.
            // Add the extension header.
            Header extensionHeader = headerFactory.createHeader("My-Header",
                    "my header value");
            request.addHeader(extensionHeader);

            String sdpData = "v=0\r\n"
                    // o - owner/creator and session identifier
                    // o=<username> <session id> <version> <network type> <address type> <address>
                    //<address> is the globally unique address of the machine from which 
                    //the session was created.
                    + "o=4855 13760799956958020 13760799956958020 IN IP4  129.6.55.78\r\n" 
                    
                    // s - session name
                    // s=<session name>
                    + "s=mysession session\r\n" 
                    
                    // p - phone number
                    // p=<phone number>
                    + "p=+46 8 52018010\r\n" 
                    
                    // c - connection information - not required if included in all media
                    // c=<network type> <address type> <connection address>
                    + "c=IN IP4  129.6.55.78\r\n" // IN - internet
                    
                    // t - time the session is active
                    // t=<start time>  <stop time>
                    //If the stop-time is set to zero, then the session is not bounded,
                    //though it will not become active until after the start-time.  If
                    // the start-time is also zero, the session is regarded as permanent.
                    + "t=0 0\r\n" 
                    
                    // m - media name and transport address
                    // m=<media> <port>/<number of ports> <transport> <fmt list>
                    //0 4 18 - formats
                    + "m=audio 6022 RTP/AVP 0 4 18\r\n"
                    
                    // a - zero or more media attribute lines
                    + "a=rtpmap:0 PCMU/8000\r\n" 
                    + "a=rtpmap:4 G723/8000\r\n"
                    + "a=rtpmap:18 G729A/8000\r\n" 
                    + "a=ptime:20\r\n";
            
            byte[] contents = sdpData.getBytes();
            
            // Create ContentTypeHeader
            ContentTypeHeader contentTypeHeader = headerFactory
                    .createContentTypeHeader("application", "sdp");
            request.setContent(contents, contentTypeHeader);
            
            // You can add as many extension headers as you
            // want.
            extensionHeader = headerFactory.createHeader("My-Other-Header",
                    "my new header value ");
            request.addHeader(extensionHeader);

            Header callInfoHeader = headerFactory.createHeader("Call-Info",
                    "<http://www.antd.nist.gov>");

            request.addHeader(callInfoHeader);

            // Create the client transaction.
            ClientTransaction inviteTid = sipProvider.getNewClientTransaction(request);
            dialog = inviteTid.getDialog();
            // send the request out.
            inviteTid.sendRequest();
            System.out.println("Sending INVITE.");

        } catch(Exception e){
            e.printStackTrace();
        }
        
    }
    
    private void processBye(Request request, ServerTransaction serverTransactionId) {
        try {
            if (serverTransactionId == null) {
                return;
            }            
            
            System.out.println("Got BYE.");
            System.out.println("Sending OK.");
                        
            Response response = messageFactory.createResponse(200, request);
            serverTransactionId.sendResponse(response);
            
            System.out.println("Exit.");
            System.exit(0);

        } catch (Exception ex) {
            ex.printStackTrace();
            System.exit(0);

        }
    }

}



PM MAIL   Вверх
Flashed
Дата 15.6.2011, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 61
Регистрация: 3.6.2010

Репутация: нет
Всего: 1



А в JFM есть средства для проигрывания медиа файлов от источника, передающего rtp?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0691 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.