как мне правильно перерегистрироваться на sip-сервере?

StackOverflow https://stackoverflow.com/questions/2238549

Вопрос

В настоящее время у меня есть регистрация SIP, которая правильно работает с Jain-SIP.

Я получаю вызов, использую MD5 для nonce и т. д. и отправляю ответ.

Затем я получаю сообщение 200 ОК.

Так что все в порядке.

Однако я хочу автоматически перерегистрироваться каждые X секунд в зависимости от времени истечения срока действия.

Для этого я попытался использовать таймер для повторного запуска кода каждые X секунд.

Однако это приводит к нескольким проблемам:

SipProvider уже подключен и не будет запускаться во второй раз.Или я получаю ошибку, в которой говорится, что запрос уже отправлен.

Поэтому мне было интересно, есть ли у кого-нибудь какие-нибудь советы о том, как лучше всего перерегистрироваться на сервере каждые X секунд?Каковы рекомендуемые шаги?


Исходный кодпубличный недействительный регистр () выдает исключение {

    // 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();
    }

ОБНОВЛЯТЬ:

Итак, я решил, что если я буду продолжать создавать новые методы, такие же, как метод Register(), и сохранять тот же идентификатор вызова и жесткий код настройки номера порта, я смогу отправить несколько таких сообщений (не в цикле).

Значит, мне нужно что-то изменить в своем регистрационном коде, чтобы убедиться, что каждый раз отправляется НОВЫЙ запрос или что-то в этом роде?

У кого-нибудь есть идеи?

Это было полезно?

Решение

//Лицо-ладонь!!!!!

Ошибка заключалась в том, что SipProvider был привязан к действию (Android), и у меня в коде был super.finish(), который уничтожил действие в неподходящее время, поэтому регистрация все еще предпринималась, но действие пропало, поэтому sip-провайдер потерял свой контекст.

Спасибо, что уделили время, Calvinscorner, очень ценю это

Другие советы

Хорошо, я потратил довольно много времени на анализ этого материала.И правда, я не понимаю, что мы делаем не так?Мне кажется, все в порядке.Init/Send Register/Start a Timer и по истечении таймера — снова отправьте запрос на регистрацию.Также кажется, что sipProvider — это глобальный объект.Можете ли вы просто ради отладки выполнить следующие две вещи?

Во-первых, вызовите getNewCallId сразу после отправки первого запроса на регистрацию, чтобы убедиться, что все в порядке.

callIdHeader = sipProvider.getNewCallId();

Или, может быть, попытаться сдвинуть

inviteTid = sipProvider.getNewClientTransaction(request);

перед getNewCallId в новом запросе на перерегистрацию, чтобы подтвердить доступность объекта sipProvider.

Я говорю не что иное, как элементарный стиль отладки.

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

  • Инициализировать поставщика услуг
  • Отправьте первый запрос на регистрацию.
  • Как только вы получите 200 OK — получите поле срока действия и запустите таймер на основе этого значения срока действия.
  • После срабатывания таймера отправьте новый запрос на регистрацию. Не инициализируйте поставщика услуг повторно.(Вы можете еще раз проверить указатель sipProvider на NON NULL).
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top