開発/サブプロジェクト

※書きかけ。鋭意、バージョンアップ中。しばし、お待ちください。

MultiPacketer?とは

簡単に言えば、汎用的なパケット送受信ツールです。
JavaScript?でシーケンスとパケットを定義することにより、どんなパケット(テキストベース)でも、送受信可能です。(SIPでもHTTPでもなんでもOKです。)
この特性を利用して、簡単なシミュレーションやテストに使用することが出来ます。

使用法

  1. 取得先から、MultiPacketer?を取得します。
  2. 必要なライブラリを取得します。
  3. 上記を、適当なディレクトリに展開します。
  4. JavaScriptファイルの作り方を参考にして、実行したいシーケンスのJavaScript?ファイルを作成します。
  5. 実行法に従って実行します。

必要なライブラリ

ビルドに必要なツール

取得先

ソースファイル

バイナリファイル

実行法

コマンドライン

  1. 下記のライブラリに対して、classpathを通します。
    1. 必要なライブラリのライブラリ
    2. ./lib/内のライブラリ
    3. ./target/multiPacketer.jar
  2. ./js/init.js のパラメータを環境に合わせて変更します。
    1. このファイルの代わりにコマンドの引数として渡すことも出来ます。状況に応じて使い分けてください。
  3. コマンドラインから、下記のコマンドを実行します。
    1. java org.siprop.simulator.multiPacketer.ConsoleMain? -Dmultipacket.config=./conf/multipacket.properties {実行したいJavaScript?ファイル}

Maven2

  1. Maven2をインストールします。
  2. ./install-path.xxx を参考に、必要なライブラリをMaven2にインストールします。
  3. ./build.properties を作成して、必要なパラメータを設定します。
    1. localIP="ローカルIP(待ち受けIP)"
    2. localPort="ローカルポート(待ち受けポート)"
    3. remoteIP="リモートIP(送信先IP)"
    4. remotePort="リモートポート(送信先ポート)"
    5. transportType="トランスポートタイプ:[TCP|UDP]"
    6. ipType="IP種別:[IP4|IP6]"
    7. js="実行したいJavaScript?ファイル"
  4. コマンドラインから、下記のコマンドを実行します。
    1. mvn install

ディレクトリ構造

-conf
 -multipacket.properties     ・・・log4jなどのシステム用設定ファイル
-js                          ・・・サンプルJavaScriptファイル
 -init.js                    ・・・初期パラメータ設定用
 -func_lib_call.js           ・・・SIPメッセージ生成用関数ライブラリ
 -basic_var.js               ・・・基本的なSIPヘッダー変数用ライブラリ
 -basic_message.js           ・・・基本的なSIPメッセージ変数用ライブラリ
 -standard_reg_uac_auth.js   ・・・一般的なREGISTERシーケンス・認証あり
 -standard_call_uac.js       ・・・一般的なUAC通話シーケンス
 -standard_call_uac_auth.js  ・・・一般的なUAC通話シーケンス・認証あり
 -standard_call_uas.js       ・・・一般的なUAS通話シーケンス
-lib
 -JainSipApi1.1.jar          ・・・Jain-SIPライブラリ
 -nist-sdp-1.0.jar           ・・・Jain-SIPライブラリ
 -nist-sip-1.2.jar           ・・・Jain-SIPライブラリ
-log                         ・・・log4j用のログファイル出力先ディレクトリ
-src
 -main                       ・・・本体のソースファイル
 -test                       ・・・test用ソースファイル
-pom.xml                     ・・・Maven2用設定ファイル
-build.xml                   ・・・実行用設定ファイル(ant用ファイル)
-install-path.bat            ・・・Maven2用の外部ライブラリインストール用バッチ
-install-path.sh             ・・・Maven2用の外部ライブラリインストール用バッチ

JavaScript?ファイルの作り方

  1. 必要となるメッセージやヘッダーを作成し、変数にセットします。
    1. ヘッダーやパラメータ(変数)の定義:RequestURIの例
      下記のように定義します。jsEngine.setVar(String,String)で、設定した変数は、{変数名}とすることにより展開されます。
      下記例では、requestLine は、「INVITE sip:2003@agilephone.com SIP/2.0\r\n」と展開されます。
var requestUri = "sip:2003@agilephone.com";
jsEngine.setVar("REQUEST_URI", requestUri);
var requestLine = "INVITE {REQUEST_URI} SIP/2.0\r\n";
jsEngine.setVar("REQUEST_LINE", requestLine);
  1. メッセージの定義:INVITEリクエストの例
    上記のヘッダーやパラメータを設定し、下記のような形で定義します。
    下記のすべての変数は、事前に定義しておく必要がありますが、本プログラムにおいては「basic_var.js」にて定義済みとなっています。
var INVITE_REQUEST = "INVITE {REQUEST_URI} SIP/2.0\r\n" +
                      "Call-ID:{CALL_ID}\r\n" +
                      "CSeq:{CSEQ_NUM} {METHOD}\r\n" +
                      "VIA:SIP/2.0/{TRANSPORT_TYPE} {LOCAL_IP}:{LOCAL_PORT};branch={BRANCH}\r\n" +
                      "From:\"{FROM_DISPLAYNAME}\" <{FROM_URI}>;tag={FROM_TAG}\r\n" +
                      "To:\"{TO_DISPLAYNAME}\" <{TO_URI}>\r\n" +
                      "Contact:<sip:{LOCAL_IP}:{LOCAL_PORT}>\r\n" +
                      "Allow: INVITE,ACK,CANCEL,BYE,NOTIFY,REFER,OPTIONS,MESSAGE\r\n" +
                      "Max-Forwards:70\r\n" +
                      "Content-Type: application/sdp\r\n" +
                      "Content-Length:{CONTENT_LENGTH}\r\n\r\n" +
                      "{STANDARD_SDP}";

JavaScript?内で使用

JavaScript?内で使用できるシステム関数です。最新情報は、こちらを参照してください。jsFunction_XXXとなっているものが、上記の関数に相当します。

メソッド意味
void jsEngine.send(String);Stringを送信します。
String jsEngine.receive();受信待ちをします。受信したメッセージをStringで返します。受信できなかった場合、変数TIMEOUT時間後、タイムアウトします。
void jsEngine.importScript(String);Stringで指定したJavaScript?ファイルをimportします。
void jsEngine.print(String);StringをTracerに表示します。
String1 jsEngine.replaceVariables(String2);String2を変数に従って変換したString1を返します。
void jsEngine.setVar(String1,String2);変数String1にString2をセットします。
String1 jsEngine.getVar(String2);変数String2を取得します。
void jsEngine.setVariablesForSIPByPacket(String);変数StringからSIPヘッダーを取得し、ヘッダー名の大文字を変数名としてセットします。例:Toヘッダーは、変数TOにセットされます。
void jsEngine.sleep(int);intミリ秒停止します。
String jsEngine.calcAuth(String authResponse, String requestUri, String username, String password);401,407応答、request-URI、ユーザ名、パスワードを渡すと、StringにAuthヘッダーを返します。
void jsEngine.setReceiveMode(Boolean b)trueをセットするとjsEngine.receive()がsent-byのポートで待ち受け、falseにするとjsEngine.receive()がLocalポートで待ち受けをします。

システム変数

システムが最初から用意している変数一覧です。最新情報は、こちらを参照してください。

変数名意味
ORIGINAL_PACKET最初に送受信したパケット
CURRENT_PACKET現在の送受信したパケット
RECEIVE_PACKET最後に受信したパケット
SEND_PACKET最後に送信したパケット
LOCAL_IPローカルIP(待ち受けIP)
LOCAL_PORTローカルポート(待ち受けポート)
REMOTE_IPリモートIP(送信先IP)
REMOTE_PORTリモートポート(送信先ポート)
RECEIVE_IPVIAのsent-by相当のIP
RECEIVE_PORTVIAのsent-by相当のポート
TRANSPORT_TYPEトランスポートタイプ
IS_RECEIVE_MODEローカルIPを使用するかsent-byを使用するか
TIMEOUTSocketの待ち受けタイムアウト時間(ms)

拡張するには

JSControllerクラスが外部とのインタフェースを担っています。

〜〜〜〜〜いろいろな処理〜〜〜〜〜
String result = "いろいろな処理の結果";
String jsCode = "jsEngine.setVar(\"RESULT\","\" + result  + "\");" +
               "jsEngine.importScript(\"./mainFunc.js\");";

JSController jsCon = new JSController();
jsCon.execByText(jsCode);

とすることにより、アプリ上からJavaScript?を実行することが出来ます。
mainFunc.jsには、変数RESULTを処理する内容が書かれているものとします。

JavaScript?サンプル

これは、非常に単純なサンプルです。
例えば、下記のようにすることにより、1xx応答が複数回来ることに対応可能となります。

var receivePacket = new String();

// 200OKパケットであるかをチェック。
while(receivePacket.indexOf("SIP/2.0 200") != 1) {
  jsEngine.receive();
  receivePacket = jsEngine.getVar("RECEIVE_PACKET");
}

このように、JavaScript?の関数や機能を使うことにより、さまざまな状況に対応できます。

Maven2コマンド

コマンド意味
mvn compileソースをコンパイルします。
mvn testテストを実行します。
mvn packagejarファイルを作成します。
mvn installbuild.xmlに沿って、実行します。
mvn sitejavadocを作成します。

各種資料