私は現在、Jain-SIP で適切に機能する SIP 登録を行っています。
私は挑戦を受け、ノンスなどで MD5 を使用し、返信を送信します。
その後、200 OK メッセージが表示されます。
それで、すべて問題ありません。
ただし、有効期限に応じて X 秒ごとに自動的に再登録したいと考えています。
これを行うために、タイマーを使用して X 秒ごとにコードを再実行しようとしました。
ただし、いくつかの問題が発生します。
SipProvider は既にアタッチされており、2 回目は実行されません。または、リクエストが既に送信されているというエラーが表示されます。
それで、X秒ごとにサーバーに再登録する最善の方法について誰かアドバイスがあるかどうか疑問に思っていましたか? 推奨される手順のように?
ソース コード public void register() 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();
}
アップデート:
したがって、 register() メソッドと同じように新しいメソッドを作成し続け、同じ Call Id を保持し、ポート番号の設定をハードコードすると、このようないくつかのメッセージを送信できることがわかりました (ループではありません)。
したがって、登録コードの何かを変更して、毎回送信される NEW 要求またはそのようなものであることを確認する必要がありますか?
誰にもアイデアはありますか?