как мне правильно зарегистрироваться на sip-сервере? - PullRequest
4 голосов
/ 10 февраля 2010

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

Я получаю вызов, использую MD5 для одноразового номера и т. Д. И отправляю свой ответ.

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

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

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

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

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

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

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


Исходный код public void register () создает исключение {

    // 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:

Итак, я решил, что если я продолжу создавать новые методы, такие же, как метод register (), и сохраню тот же Call Id и жесткий код, то настройку номера порта я могу отправить несколько сообщений, подобных этому (Не в петля). * +1027 *

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

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

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

// Лицо Ладони !!!!!

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

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

2 голосов
/ 11 февраля 2010

Хорошо, я потратил довольно много времени на анализ этого материала. И правда, я не понимаю, что мы делаем не так? Все выглядит хорошо для меня. Инициирование / отправка регистрации / запуск таймера и истечение таймера - снова отправьте запрос на регистрацию. Также кажется, что sipProvider - это глобальный объект. Можете ли вы просто ради цели отладки выполнить следующие две вещи

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

callIdHeader = sipProvider.getNewCallId();

Или, может быть, попытаться переместить

inviteTid = sipProvider.getNewClientTransaction(request);

перед getNewCallId в новом запросе Re-register, чтобы проверить, доступен ли объект sipProvider.

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

1 голос
/ 11 февраля 2010

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

  • Инициализация поставщика услуг
  • Отправьте первый запрос на регистрацию.
  • Как только вы получите 200 OK - получите поле expires и запустите таймер на основе значения expires.
  • После срабатывания таймера отправьте новый запрос на регистрацию. Не инициализируйте поставщика услуг повторно. (Вы можете снова проверить указатель sipProvider на NON NULL).
...