簡単に言えば、汎用的なパケット送受信ツールです。
JavaScriptでシーケンスとパケットを定義することにより、どんなパケット(テキストベース)でも、送受信可能です。(SIPでもHTTPでもなんでもOKです。)
この特性を利用して、簡単なシミュレーションやテストに使用することが出来ます。
-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用の外部ライブラリインストール用バッチ
var requestUri = "sip:req@siprop.org";
jsEngine.setVar("REQUEST_URI", requestUri);
var requestLine = "INVITE {REQUEST_URI} SIP/2.0\r\n";
jsEngine.setVar("REQUEST_LINE", requestLine);
1. メッセージの定義:INVITEリクエストの例<br>
上記のヘッダーやパラメータを設定し、下記のような形で定義します。
下記のすべての変数は、事前に定義しておく必要がありますが、本プログラムにおいては「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}";
// createACK()関数が定義されたライブラリの呼び出し
jsEngine.importScript("./js/func_lib_call.js");
// INVITEを送信
jsEngine.send(INVITE_REQUEST);
// 200OKを受信して、OK_RESPONSEにその内容をセットする。
var OK_RESPONSE = jsEngine.receive();
// 200OKから、ACKリクエストを生成する。
var ACK_REQUEST = createACK(OK_RESPONSE);
// 上記で、生成したACKを送信する。
jsEngine.send(ACK_REQUEST);
以上で、終了です。あとは、実行してください。
Tips
// 200OKパケットであるかをチェック。
var OK_RESPONSE = new String();
while(OK_RESPONSE.indexOf("SIP/2.0 200") != 1) {
OK_RESPONSE = jsEngine.receive();
}
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_IP
| VIAのsent-by相当のIP | | RECEIVE_PORT
| VIAのsent-by相当のポート | | TRANSPORT_TYPE
| トランスポートタイプ | | IS_RECEIVE_MODE
| ローカルIPを使用するかsent-byを使用するか | | TIMEOUT
| Socketの待ち受けタイムアウト時間(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を処理する内容が書かれているものとします。
| コマンド | 意味 |
| mvn compile | ソースをコンパイルします。 |
| mvn test | テストを実行します。 |
| mvn package | jarファイルを作成します。 |
| mvn install | build.xmlに沿って、実行します。 |
| mvn site | javadocを作成します。 |