我目前正在与Jain-SIP合作进行SIP注册。
我接受了挑战,在nonce等上使用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();
}
更新:
所以我认为如果我继续创建与register()方法相同的新方法并保持相同的Call Id和硬编码端口号的设置我可以发送一些这样的消息(不在循环)。
所以我必须在我的注册码中更改一些内容,以确保每次都发送一个新的请求或类似的东西?
有没有人有任何想法?
答案 0 :(得分:3)
// Face Palm !!!!!
错误是SipProvider附加到Activity(Android)并且我在代码中有super.finish(),它在错误的时间杀死了活动,因此注册仍然尝试但活动已经消失所以sip提供程序丢失了上下文。
感谢您的时间calvinscorner,非常感谢
答案 1 :(得分:2)
好的,我花了很多时间分析这些东西。我真的不知道我们做错了什么?一切看起来都很好。初始化/发送寄存器/启动定时器和定时器到期 - 再次发送寄存器请求。似乎sipProvider也是一个全局对象。你是否只是为了调试目的而执行以下两件事
Fist,刚发送第一个Register请求后调用getNewCallId,看看一切正常。
callIdHeader = sipProvider.getNewCallId();
或者可能会尝试转移
inviteTid = sipProvider.getNewClientTransaction(request);
在新的重新注册请求之前的getNewCallId之前,可以使用sipProvider对象来实现。
我所说的只不过是基本的调试方式。
答案 2 :(得分:1)
每次要发送新的注册请求时,都不需要初始化服务提供者。以下是我建议您应遵循的步骤。