このタスクについて
B2BUA は、SIP 呼び出しの真ん中に位置する Session Initiation Protocol (SIP) アプリケーションで、2 つ以上の SIP ダイアログ間で要求および応答を転送します。標準的な B2BUA アプリケーションは、2 つのユーザー・エージェント間の SIP セッションを管理します。ただし、B2BUA アプリケーションは、ダウンストリーム・フォーキングのさまざまなブランチからの応答の管理が必要となる、より複雑なシナリオも処理できます。ダウンストリーム・フォーキングは、要求がさまざまなブランチに分割され、メッセージがユーザー・エージェント・クライアントからユーザー・エージェント・サーバーに転送される時に発生します。
B2buaHelper クラスには、そのような B2BUA アプリケーションの作成に必要なすべてのメソッドが含まれています。
B2buaHelper クラスの動作、および新規要求の作成に使用されるルールは、JSR289 仕様のセクション 12.2 に定義されています。SIP バックツーバック・ユーザー・エージェント呼び出しの 2 つのレグ (着信呼び出しレグと発信呼び出しレグ) をリンクするために
B2buaHelper クラスの機能を使用できます。
- SipServletRequest.getB2buaHelper() メソッドを呼び出して B2buaHelper インスタンスを取得します。
- このインスタンスを取得した後は、B2buaHelper.createRequest() を呼び出して新規 SIP 要求を作成できます。
private void doInvite(SipServletRequest req) {
B2buaHelper b2buaHelper = req.getB2buaHelper();
SipServletRequest newRequest = b2buaHelper.createRequest(req, true, headerMap);
}
作成される newRequest は、このメソッドの最初のパラメーターに元の要求として提供されている SipServletRequest req と同一です。Boolean パラメーターは、元の要求の req と newRequest がリンクしているかどうかを示します。headerMap は、newRequest でオーバーライドする非システム・ヘッダーのマップを提供します。
- 2 つのレグがリンクしていることを確認します。false 属性を指定して createRequest メソッドを呼び出した場合は、以下を呼び出すことにより SIP セッションを明示的にリンクできます。
B2buaHelper.linkSipSessions(session1, session2)
- SIP セッションと SIP 要求をリンクしたら、以下を呼び出すことにより、リンクしたセッションを取得できます。
SipSession linkedSession = B2buaHelper.getLinkedSession(req.getSession());
注: B2BUA のフォーキング・シナリオではアプリケーションは複数の SIP 要求を作成するため、すべての SIP セッションがリンクしているわけではありません。それらは明示的にリンクする必要があります。
- ユーザー・エージェント・サーバー (UAS) から応答を受信したら、そのレグへの応答を作成します。応答にリンクしたセッションが存在するかどうかを判別し、存在する場合は、リンクした要求を使用してユーザー・エージェント・クライアント (UAC) への応答を作成します。
SipServletRequest linked = b2bHelper.getLinkedSipServletRequest(resp.getRequest());
linked.createResponse(resp.getStatus(),resp.getReasonPhrase()).send();
リンクしたセッションで、応答に関連付けられたものがない場合、アプリケーションは、B2buaHelper.createResponseToOriginalRequest を呼び出し、元の要求に関連付けられている SipSession のコピーである、新しい派生セッションを作成する必要があります。
注: JSR289 仕様のセクション 12.5 には、元の要求への、複数の正常な応答を作成する方法が記載されています。元の INVITE メッセージに関連付けられている SipSession が複数あり、INVITE メッセージに複数の正常な応答を送信する必要がある場合は、B2buaHelper.createResponseToOriginalRequest メソッドを使用します。
- createResponseToOriginalRequest メソッドを使用する場合は、確実に 2 つのレグをリンクするようにします。アプリケーションは、新しい派生セッションをそのペアのセッションにリンクする責任があります。それにより、アプリケーションは、そのセッションに対するその後の応答を送信するために、リンクしたセッションを取得することができます。