Pergunta

Eu tenho atualmente um registro SIP trabalhar proprly com Jain-SIP.

Eu recebo o desafio, use MD5 no nonce etc e enviar minha resposta.

Eu, então, passar a mensagem 200 OK.

Então, isso é tudo bem.

No entanto eu quero registar automaticamente a cada X segundos, dependendo do tempo expirar.

Para fazer isso eu tentei usar um temporizador para re executar o código a cada X segundos.

No entanto, leva a um par de problemas:

O SipProvider já está ligado e não vai executar uma segunda vez. Ou Eu recebo um erro dizendo que o pedido já foi enviado.

Então, eu queria saber se alguém tem algum conselho sobre a melhor forma para registrar novamente com o servidor a cada X segundos? Como nas etapas recomendado tomar?


O código-fonte registo public void () throws Exception {

    // all this into a create request method
    String fromName = "xxxxxxxx";
    String fromSipAddress = "sip.network.com";

    String toSipAddress = "sip.network.com";
    String toUser = "xxxxxxxx";

    SipURI fromAddress = addressFactory.createSipURI(fromName,
            fromSipAddress);

    Address fromNameAddress = addressFactory.createAddress(fromAddress);
    FromHeader fromHeader = headerFactory.createFromHeader(
            fromNameAddress, null);

    SipURI toAddress = addressFactory
            .createSipURI(toUser, toSipAddress);
    Address toNameAddress = addressFactory.createAddress(toAddress);
    ToHeader toHeader = headerFactory.createToHeader(toNameAddress,
            null);

    URI requestURI = addressFactory.createURI(
            "sip:" + "sip.network.com");

    List<ViaHeader> viaHeaders = new ArrayList<ViaHeader>();
    String ipAddress = lp.getIPAddress();
    ViaHeader viaHeader = headerFactory.createViaHeader(ipAddress,
            lp.getPort(),
            lp.getTransport(), null);

    viaHeaders.add(viaHeader);

    CallIdHeader callIdHeader = sipProvider.getNewCallId();

    CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1L,
            Request.REGISTER);

    MaxForwardsHeader maxForwards = headerFactory
            .createMaxForwardsHeader(70);

    Request request = messageFactory.createRequest(requestURI,
            Request.REGISTER, callIdHeader, cSeqHeader, fromHeader,
            toHeader, viaHeaders, maxForwards);

    SipURI contactUrl = addressFactory.createSipURI(fromName, fromSipAddress);
    contactUrl.setPort(8002);
    contactUrl.setLrParam();

    SipURI contactURI = addressFactory.createSipURI(fromName, "sip.network.com");
    contactURI.setPort(sipProvider.getListeningPoint(lp.getTransport())
            .getPort());

    Address contactAddress = addressFactory.createAddress(contactURI);

    contactHeader = headerFactory.createContactHeader(contactAddress);
    request.addHeader(contactHeader);
    Header extensionHeader = headerFactory.createHeader("Expires",
        "120");
    request.addHeader(extensionHeader);

    inviteTid = sipProvider.getNewClientTransaction(request);
    inviteTid.sendRequest();
    Log.d("AFTERSENDREQUEST", "SipProvider = : " + sipProvider.toString());

    Log.d("INVITETID", "inviteTid = " + inviteTid.getState());

    dialog = inviteTid.getDialog();

}
public void processResponse(ResponseEvent responseEvent) {
    Message message = Message.obtain();
    message.obj = "received response "+responseEvent.getResponse();
    handler.sendMessage(message);   
    Response response = (Response) responseEvent.getResponse();
    ClientTransaction tid = responseEvent.getClientTransaction();
    CSeqHeader cseq = (CSeqHeader) response.getHeader(CSeqHeader.NAME);

    if (response.getStatusCode() == Response.UNAUTHORIZED){
    try {
        createAuthReply(authHeader, callid);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

UPDATE:

Então, eu percebi que se eu continuar a criar novos métodos o mesmo que o registo () Método e manter a mesma ID da chamada e código rígido a configuração do número da porta eu posso enviar algumas mensagens como esta (não em um loop).

Então eu devo ter que mudar alguma coisa no meu código de registro para se certificar de que é um novo pedido ser enviado a cada vez ou algo parecido?

Alguém tem alguma idéia?

Foi útil?

Solução

// face palma !!!!!

Erro foi o SipProvider se apega à Actividade (Android) e eu tive super.finish () no código que matou a atividade no momento errado para que o ainda registrar tentou, mas a atividade foi embora assim que o provedor SIP perdeu sua contexto.

Obrigado por sua calvinscorner tempo, realmente aprecio isso

Outras dicas

Ok, eu passei algum tempo na análise deste material. E realmente eu estou fora-de-pista sobre o que estamos fazendo de errado? Tudo parece bem para mim. Init / Enviar Register / iniciar um temporizador e no temporizador de expiração - Mais uma vez enviar um pedido de registo. Parece também que sipProvider é um objeto global. Você pode apenas por uma questão de depuração finalidade realizar as seguintes duas coisas

Punho, Invoke getNewCallId apenas depois de enviar primeiro pedido Register, para ver que está tudo bem.

callIdHeader = sipProvider.getNewCallId();

Ou pode ser tentativa de mudança

inviteTid = sipProvider.getNewClientTransaction(request);

à frente do getNewCallId in new Volte a registar requst, para veify sipProvider objeto está disponível.

O que estou dizendo nada mais é do estilo elementar de depuração.

Você pode não exigir a inicialização do prestador de serviços cada vez que você quiser enviar uma nova solicitação Register. Aqui estão os passos que eu sugiro que você deve seguir.

  • provedor de serviços de inicialização
  • Enviar a solicitação de primeiro registo.
  • Depois de receber 200 OK -. Recuperar expira campo e iniciar um temporizador baseado em que expira o valor
  • Uma vez que o temporizador é disparado enviar um novo pedido Register - não inicializar provedor de serviço novamente. (Você pode verificar se há ponteiro sipProvider novamente para não NULL).
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top