как мне правильно перерегистрироваться на sip-сервере?
-
19-09-2019 - |
Вопрос
В настоящее время у меня есть регистрация 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).