私が登録で見つけた最良の例はここにあります。リンクがいつか枯渇した場合の要点は次のとおりです。
REGISTERリクエストは、REGISTRARサーバー上のユーザーの現在の場所を更新するために使用されます。アプリケーションはREGISTERメッセージを送信して、サーバーに現在の場所を通知します。現在の場所は、場所サーバーに保存されます。発信者がユーザーに電話をかけると、プロキシサーバーはこの情報を使用して着信者の場所を検索します。
登録リクエストは、クライアントから定期的に送信される必要があります。REGISTERリクエストの有効性は、Expiresヘッダーによって決定されます。
フロー

サンプルリクエスト
REGISTER sip:sip.linphone.org SIP/2.0
Call-ID: 0a0f14355fa76ae6435b98bfe085baf9@223.1.1.128
CSeq: 1 REGISTER
From: <sip:vkslabs@sip.linphone.org>;tag=-1427592833
To: <sip:vkslabs@sip.linphone.org>
Max-Forwards: 70
Via: SIP/2.0/TCP 223.1.1.128:5060;branch=z9hG4bK-323532-2a454f4ec2a4213f6d6928eba479521d
Contact: <sip:vkslabs@223.1.1.128;transport=tcp>
Content-Length: 0
次に、NISTSIPスタックを使用して上記のリクエストを作成する方法を見てみましょう。
最初のステップは、SIPListenerを実装するクラスを作成することです。SIPスタックがNISTJAINSIPスタックを初期化していることを確認してください。
Call-IDヘッダーを作成する
CallIdHeader callIdHeader = this.sipProvider.getNewCallId();
CSeqヘッダーを作成する
CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq、 "REGISTER");
ヘッダーから作成
アドレスfromAddress=addressFactory.createAddress( "sip:"+ユーザー名+'@' +サーバー); FromHeader fromHeader = this.headerFactory.createFromHeader(fromAddress、String.valueOf(this.tag));
ヘッダーに作成
ToHeader toHeader = this.headerFactory.createToHeader(fromAddress、null);
Max-Forwardsヘッダーを作成する
MaxForwardsHeader maxForwardsHeader = this.headerFactory.createMaxForwardsHeader(70);
Viaヘッダーを作成する
ArrayList viaHeaders = new ArrayList(); ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip、this.port、 "tcp"、null); viaHeaders.add(viaHeader);
連絡先ヘッダーを作成する
this.contactAddress = this.addressFactory.createAddress( "sip:" + this.username +'@' + this.ip + "transport = tcp");
//すべてのSIPメッセージに使用される連絡先ヘッダーを作成します。this.contactHeader = this.headerFactory.createContactHeader(contactAddress);
すべてのヘッダーが作成されたら、リクエスト自体を作成します。
request = this.messageFactory.createRequest("REGISTER sip:" + server + "SIP/2.0\r\n\r\n");
request.addHeader(callIdHeader);
request.addHeader(cSeqHeader);
request.addHeader(fromHeader);
request.addHeader(toHeader);
request.addHeader(maxForwardsHeader);
request.addHeader(viaHeader);
request.addHeader(contactHeader);
必要なすべてのヘッダーを使用してリクエストオブジェクトが作成されたので、リクエストを送信します。
inviteTid = sipProvider.getNewClientTransaction(request); // send the request out.
inviteTid.sendRequest();
リクエストが正常に送信されると、SIPListenerのprocessResponseコールバックを使用してレスポンスがアプリケーションに渡されます。
public void processResponse(ResponseEvent responseEvent) {
int statusCode = responseEvent.getResponse().getStatusCode();
}
コード
public void register(Response response) {
try {
cseq++;
ArrayList viaHeaders = new ArrayList();
ViaHeader viaHeader = this.headerFactory.createViaHeader(this.ip,
this.port, "tcp", null);
viaHeaders.add(viaHeader);
// The "Max-Forwards" header.
MaxForwardsHeader maxForwardsHeader = this.headerFactory
.createMaxForwardsHeader(70);
// The "Call-Id" header.
CallIdHeader callIdHeader = this.sipProvider.getNewCallId();
// The "CSeq" header.
CSeqHeader cSeqHeader = this.headerFactory.createCSeqHeader(cseq,
"REGISTER");
Address fromAddress = addressFactory.createAddress("sip:"
+ username + '@' + server);
FromHeader fromHeader = this.headerFactory.createFromHeader(
fromAddress, String.valueOf(this.tag));
// The "To" header.
ToHeader toHeader = this.headerFactory.createToHeader(fromAddress,
null);
// this.contactHeader = this.headerFactory
// .createContactHeader(contactAddress);
request = this.messageFactory.createRequest("REGISTER sip:"
+ server + " SIP/2.0\r\n\r\n");
request.addHeader(callIdHeader);
request.addHeader(cSeqHeader);
request.addHeader(fromHeader);
request.addHeader(toHeader);
request.addHeader(maxForwardsHeader);
request.addHeader(viaHeader);
request.addHeader(contactHeader);
if (response != null) {
retry = true;
AuthorizationHeader authHeader = Utils.makeAuthHeader(headerFactory, response,
request, username, password);
request.addHeader(authHeader);
}
inviteTid = sipProvider.getNewClientTransaction(request);
// send the request out.
inviteTid.sendRequest();
this.dialog = inviteTid.getDialog();
// Send the request statelessly through the SIP provider.
// this.sipProvider.sendRequest(request);
// Display the message in the text area.
logger.debug("Request sent:\n" + request.toString() + "\n\n");
} catch (Exception e) {
// If an error occurred, display the error.
e.printStackTrace();
logger.debug("Request sent failed: " + e.getMessage() + "\n");
}
}
ここで認証に関するリファレンス投稿を表示することもできます。リンクがいつか枯渇した場合の要点は次のとおりです。
SIP要求中に、サーバーが401 Proxy AuthenticationRequiredまたは401Unauthorizedで応答した場合、クライアントはMD5チャレンジで同じ要求を再度再生する必要があることを意味します。
クライアントは、応答ヘッダーWWW-Authenticateのnonce値を使用する必要があります。
WWW-認証:ダイジェストrealm = "sip.linphone.org"、nonce = "JbAO1QAAAAA3aDI0AADMobiT7toAAAAA"、opaque = "+ GNywA =="、algorithm = MD5、qop = "auth"
クライアントはnonceを使用してMD5チャレンジを生成し、Authorizationヘッダーを使用して元の要求を再度行う必要があります。
MD5チャレンジを作成する手順
ユーザー名+「:」+レルム+「:」+パスワードを使用して最初のMD5ハッシュを作成します
文字列a1=ユーザー名+":"+レルム+":"+パスワード; 文字列ha1=toHexString(mdigest.digest(a1.getBytes()));
request_method +“:”+request_uriを使用して2番目のMD5ハッシュを作成します
文字列a2=request_method.toUpperCase()+ ":" + request_uri; 文字列ha2=toHexString(mdigest.digest(a2.getBytes()));
応答ヘッダーのqopが「auth」の場合、最終的なMD5ハッシュはステップ3aを使用して計算されます。それ以外の場合、未定義または空の場合は、ステップ3bを参照してください。
3a。ha1 +“:” + nonce +“:” + nonceCount +“:” + cNonce +“:” + qop +“:”+ha2を使用して最終的なMD5文字列を作成します
String finalStr = ha1 + ":" + nonce + ":" + nonceCount + ":" + cNonce + ":" + qop + ":" + ha2;
String response = toHexString(mdigest.digest(finalStr.getBytes()));
3b。ha1 +“:” + nonce +“:”+ha2を使用して最終的なMD5文字列を作成します
String finalStr = ha1 + ":" + nonce + ":" + ha2;
String response = toHexString(mdigest.digest(finalStr.getBytes()));