OnDO SIP Server Session-Plugin for Accountingの 暫定ドキュメント -- OnDO SIP Server version 1.4.0.1 以降用 1. HOW TO MAKE A PLUG-IN アカウンティング・プラグインはAccountingBaseクラスから派生させてください。 パッケージは com.brekeke.net.sip.sv.session.plugins です。 AccountingBaseクラスは InviteSessionクラスから派生しているだけで、 中身はありません。 クラス構成は以下の通りです。 SIPex // セッションごとのスレッド・クラス | +--- SessionPlugin // セッション・プラグインのベース | +--- InviteSession // INVITE用セッション・プラグイン | +--- AccountingBase // アカウンティング・プラグインのベース | +--- このドキュメントで対象とするプラグイン 以下をインポートしてください。 import com.brekeke.net.sip.sv.session.*; import com.brekeke.net.sip.sv.session.plugins.*; 2. EVENT METHOD イベント・メソッドとは、セッションの開始・終了、通話の開始・終了時などに 呼ばれるメソッドです。 プラグインで必要に応じて実装してください。 1) eventSessionStart public int eventSessionStart( EventStat evstat, String[] argprm ) セッションの開始要求時に呼ばれるイベント・メソッドです。 INVITEの受信時に呼ばれます。 argprmにはダイヤルプランで指定されたパラメータが渡されます。 引数: EventStat evstat - ステイタス String[] argprm - パラメータ 戻り値: このセッションを受け入れる場合は 0。 セッションを拒絶する場合は エラー・コード(400以上のレスポンス・コード)を 返します。 エラー・コードを返した場合は、該当するレスポンス・パケットがクライアントに送られ、 セッションは開始されません。 2) eventTalkStart public void eventTalkStart( EventStat evstat ) 通話開始時に呼ばれるイベント・メソッドです。 INVITEに対する 2xxレスポンスの受信時に呼ばれます。 引数: EventStat evstat - ステイタス 3) eventTalkEnd public void eventTalkEnd( EventStat evstat ) 通話終了時に呼ばれるイベント・メソッドです。 BYEの受信時に呼ばれます。 引数: EventStat evstat - ステイタス 4) eventSessionEnd public void eventSessionEnd( EventStat evstat ) セッション終了時に呼ばれる・イベント・メソッドです。 通話が行われたセッションであれば BYEに対する 2xxレスポンスの受信後、 そうでなければ、INVITEに対するエラー・レスポンスの受信後に、RTPなどの リソースを解放してから呼ばれます。 5) eventTimerup public void eventTimerup( EventStat evstat, long id ) 指定されたタイマー時間後に呼ばれるイベント・メソッドです。 タイマーは setSchedule()で設定します。 引数: EventStat evstat - ステイタス long id - timer ID 3. SIP-METHOD PROCEDURE SIPメソッド・プロシージャとは、受信したSIPメソッドごとに呼ばれるメソッドです。 プラグインで必要に応じて実装してください。 どのようなSIPメソッドでも実装することができますが、通常の課金用プラグインであれば SIPメソッド・プロシージャを実装する必要はありません。 たとえば、INFOメソッドについてプロシージャを実装する場合は、以下のような インターフェイスになります。 public void procINFO( ClientStat cs, SIPpacket sippacket, boolean bRequest ) このメソッドはサーバがINFOのリクエスト または レスポンスを受信したときに呼ばれます。 引数: ClientStat cs - パケット送信側クライアント・ステイタス SIPpacket sippacket - 該当するSIPパケット boolean bRequest - trueの場合はリクエスト、falseの場合はレスポンス 同様に、TESTTESTという未知のSIPメソッドの処理を実装する場合は、 以下のように書くことができます。 public void procTESTTEST( ClientStat cs, SIPpacket sippacket, boolean bRequest ) 4. CONTROL METHOD プラグインから呼び出し可能な制御用メソッドです。 1) doTerminate public void doTerminate() セッションを安全に終了させます。 状況に応じて BYE/CANCEL または レスポンスを各UAに送信します。 2) setSchedule public void setSchedule( long id, long secdelay ) 指定時間後に eventTimerup()を呼びます。 引数: long id - timer ID long secdelay - タイマ時間(sec) 3) setScheduleTerminate public void setScheduleTerminate( long secdelay ) 指定時間後にセッションを安全に終了させます。 引数: long secdelay - タイマ時間(sec) 4) getTalkLength public long getTalkLength() 通話時間を返します。 戻り値: 通話時間(msec) 5. EventStat - EVENT STATUS イベント・メソッドに渡される EventStatオブジェクトは 以下の変数を持ちます。 int sid // Session-ID String callid // Call-ID: String username // 発信者のユーザ名 String usernameAuth // 発信者の認証用ユーザ名 String urlCaller // 発信者のSIP-URI String tagCaller // 発信者のtagパラメータ AddrPort apCaller // 発信者のIPアドレス/ポート String urlCallee // 着信者のSIP-URI String tagCallee // 着信者のtagパラメータ AddrPort apCallee // 着信者のIPアドレス/ポート String methodStart // セッション開始メソッド long seqStart // セッション開始メソッドのシーケンス番号 String methodEnd // セッション終了メソッド long seqEnd // セッション終了メソッドのシーケンス番号 int senderEnd // セッション終了メソッドの送信者 (1=発信者, 2=着信者) long timeSessionStart // セッション開始時間 long timeSessionEnd // セッション終了時間 long timeTalkStart // 通話開始時間 long timeTalkEnd // 通話終了時間 int result // 結果 // 0 = 成功 // 1 = BUSY // 2 = CANCEL // 3 = 失敗 // 4 = タイムアウト // 5 = サーバによる切断(シャットダウンなど) // 6 = その他 int errorcode // エラーコード (SIPのレスポンス・コード) 6. HOW TO INSTALL THE PLUG-IN プラグインはダイヤル・プランの Deploy Patterns内で $session変数で指定します。 たとえば、CDRsampleというプラグインを指定する場合は、以下のように記述できます。 ============================= Matching Patterns: $request = ^INVITE Deploy Patterns: $session = CDRsample $continue = true ============================= このとき、CDRsampleクラスは プロパティ変数 net.sip.session.plugins.pkgで指定された パッケージから検索されます。 指定されたパッケージ内に無い場合は パッケージ com.brekeke.net.sip.sv.session.pluginsから検索されます。 ダイヤルプランでは以下のようにパッケージ名を含んだプラグイン名を指定することもできます。 $session = com.test.CDRsample また、プラグインに引数を渡したい場合は、以下のように記述できます。 $session = CDRsample arg1 arg2 ここで指定された引数は eventSessionStart()に渡されます。