2015-10-12 18 views
1

我已经尝试过Mobisents中的jainsip示例restcomm-android-sdk.Its为我工作,但我无法正确地从客户端创建再见消息。如何在jainsip android中创建并发送从客户端到服务器的再见消息?

我创建了一个BYE消息类这样

public class Bye { 

public Request MakeRequest(SipManager sipManager) throws ParseException, 
     InvalidArgumentException { 

    AddressFactory addressFactory = sipManager.addressFactory; 
    SipProvider sipProvider = sipManager.sipProvider; 
    MessageFactory messageFactory = sipManager.messageFactory; 
    HeaderFactory headerFactory = sipManager.headerFactory; 
    // Create addresses and via header for the request 
    Address fromAddress = addressFactory.createAddress("sip:" 
      + sipManager.getSipProfile().getSipUserName() + "@" 
      + sipManager.getSipProfile().getRemoteIp()); 
    fromAddress.setDisplayName(sipManager.getSipProfile().getSipUserName()); 
    Address toAddress = addressFactory.createAddress("sip:" 
      + sipManager.getSipProfile().getSipUserName() + "@" 
      + sipManager.getSipProfile().getRemoteIp()); 
    toAddress.setDisplayName(sipManager.getSipProfile().getSipUserName()); 

    Address contactAddress = sipManager.createContactAddress(); 
    ArrayList<ViaHeader> viaHeaders = sipManager.createViaHeader(); 
    URI requestURI = addressFactory.createAddress(
      "sip:" + sipManager.getSipProfile().getRemoteEndpoint()) 
      .getURI(); 
    // Build the request 
    CallIdHeader callIdHeader = sipManager.sipProvider.; 
    final Request request = messageFactory.createRequest(requestURI, 
      Request.BYE, sipProvider.getNewCallId(), 
      headerFactory.createCSeqHeader(1l, Request.BYE), 
      headerFactory.createFromHeader(fromAddress, "c3ff411e"), 
      headerFactory.createToHeader(toAddress, null), viaHeaders, 
      headerFactory.createMaxForwardsHeader(70)); 

    // Add the contact header 
    request.addHeader(headerFactory.createContactHeader(contactAddress)); 
    ExpiresHeader eh = headerFactory.createExpiresHeader(300); 
    request.addHeader(eh); 
    // Print the request 
    System.out.println(request.toString()); 
    return request; 
    // Send the request --- triggers an IOException 
    // sipProvider.sendRequest(request); 
    // ClientTransaction transaction = sipProvider 
    // .getNewClientTransaction(request); 
    // Send the request statefully, through the client transaction. 
    // transaction.sendRequest(); 

} 
} 

说它从SipManager类作为

public void disconnectCall() throws NotInitializedException { 
    // TODO Auto-generated method stub 
    if (!initialized) 
     throw new NotInitializedException("Sip Stack not initialized"); 
    this.sipManagerState = SipManagerState.BYE; 
    Bye byeRequest = new Bye(); 
    Request r=null ; 
    try{ 
    r = byeRequest.MakeRequest(this);//byeRequest.MakeRequest(SipManager.this); 

     final ClientTransaction transaction = this.sipProvider 
       .getNewClientTransaction(r); 
     Thread thread = new Thread() { 
      public void run() { 
       try { 
        transaction.sendRequest(); 
       } catch (SipException e) { 
        e.printStackTrace(); 
       } 
      } 
     }; 
     thread.start(); 
    } catch (TransactionUnavailableException e) { 
     e.printStackTrace(); 
    }catch (InvalidArgumentException e) { 
     e.printStackTrace(); 
    } catch (ParseException e) { 
     e.printStackTrace(); 
    } 

} 

我有481错误代码response.I想我已经错过了当前呼叫字段中的再见消息。我已经搜索过它,但没有从sipmanager class.pls帮助中找到。

回答

3

Nidhin,

BYE的消息始终是一个SIP对话里面,这样你就不必从头开始创建一个新的消息。相反,您只需要查看要终止的对话框,从中创建一个类型为BYE的请求并发送它。 JAIN将负责其余的事情。

举个例子,你可以检查在Mobicents restcomm-Android的SDK回购的代码,方法sendByeClient():

https://github.com/Mobicents/restcomm-android-sdk/blob/master/sipua/src/main/java/org/mobicents/restcomm/android/sipua/impl/SipManager.java#L931

也请记住,在JAIN SIP例子已过时通过使用Restcomm Android客户端SDK的Messenger例子,它提供了一个更简单的API。以下代码供您参考:

https://github.com/Mobicents/restcomm-android-sdk/tree/master/Examples/restcomm-messenger

相关问题