後編 SIPアプリケーションを拡張する

高山義泉
2006/1/21

 前編では、SIPアプリケーションの構築を試み、SIPの役割を理解しました。後編では、前編で構築した環境に、SIPレジストリサーバ、SIPプロキシサーバを配置し、そこでユーザーの位置情報や状態を管理します。相手のアドレスを知らなくても、相互に相手を見つけてコミュニケーションできるようシステムを拡張してみましょう。

図1 bob@abc.comがtom@abc.comと通話する場合、JSLEEサーバに対してtom@abc.comの呼び出しをリクエストする。tom@abc.comはJSLEEサーバからのリクエストに応答することでbob@abc.comとの間で通話が開始される

環境の構築

 本稿では、環境の構築を以下の順序で行います。

  1. JSLEEサーバ環境に必要なソフトウェアの準備
  2. Jakarta-antのインストールと設定
  3. PostgreSQLのインストールと設定
  4. JSLEEサーバのインストール
  5. アプリケーションの配布

 なお、筆者はOS環境にRed Hat Enterprise Linux AS3を利用しました。

■JSLEEサーバ環境の構築

 JSLEEサーバの環境を構築するには、下記のソフトウェアを用意します。

  • Opencloud Rhino SDK
    JSLEEアプリケーションサーバ(Rhino SDKを動作させるためには、Linux、Solaris、HP-UX環境が必要になります)

  • JDK 1.4以上

  • PostgreSQL
    フリーのRDBMS(Rhino SDKの設定情報などを格納します)

  • Jakarta Ant
    アプリケーションのコンパイル、配備を容易に行うためのツール

  • NIST SIP Communicator
    SIP VoIPコミュニケーションクライアントツール

■Jakarta-antのインストール

 これはOpenCloud Rhino SDKが提供しているSIPサンプルアプリケーションを容易に配備するために必要になります。

 Apache Antは、Apacheプロジェクトが提供する、Javaベースのコマンドラインビルドツールです。 Antはアプリケーションプロジェクトの構造やコマンドの発行に関する定義をbuild.xmlに定義し、実行することになります。J2EEアプリケーションサーバやJSLEEアプリケーションサーバなどに付属しているサンプルアプリケーションの多くはApache Ant形式で提供されており、これらサンプルアプリケーションをコンパイル、配備する際には非常に役立ちます。

  http://ant.apache.org/から「Download」をクリックし、「apache-ant-1.6.5-bin.X」をダウンロードします(ダウンロードファイルの圧縮形式は何でも結構です)。ダウンロード完了後、圧縮ファイルを展開します。本稿ではCドライブのルート上に下図のようなディレクトリ構成で展開されています。

■Jakarta-antの設定

 下記を参考に、OSに合った環境設定を行ってください(それぞれの環境に応じて、ディレクトリ位置を読み替えてください)。

  • Windowsの場合
    set ANT_HOME=c:\apache-ant-1.6.2
    set JAVA_HOME=c:\jdk1.4.2
    set PATH=%PATH%;%ANT_HOME%\bin

  • Linux/UNIX(bash)の場合
    export ANT_HOME=/usr/local/apache-ant-1.6.2
    export JAVA_HOME=/usr/local/jdk-1.4.2
    export PATH=${PATH}:${ANT_HOME}/bin

  • Linux/UNIX(csh)の場合
    setenv ANT_HOME /usr/local/apache-ant-1.6.2
    setenv JAVA_HOME /usr/local/jdk-1.4.2
    set path=( $path $ANT_HOME/bin )

■PostgreSQLのインストール

 Rhino SDKはコンテナの設定情報やアプリケーションの配備情報をすべてRDBに格納します。Rhino SDKは標準でPostgreSQLをサポートしています。PostgreSQLは、Rhino SDKと同一マシンまたリモートマシン上にインストールすることができます。Rhino SDKとPostgreSQLはJDBCを用いて通信を行います。

 PostgreSQLのダウンロード、インストールについては、次のサイトに関連する情報が記載されているので、そちらを参考にインストールを行ってください。

■PostgreSQLの設定

・データベースユーザーの作成

 PostgreSQLを起動後、Rhino SDKからPostgreSQL DBにアクセスするためのユーザーを作成します。下記のようにコマンドを実行します。

$ createuser
Enter name of user to add: postgres
Shall the new user be allowed to create databases? (y/n) y
Shall the new user be allowed to create more new users? (y/n) n
CREATE USE
R

・TCP接続の設定

 Rhino SDKとPostgreSQLサーバは、JDBCを用いて接続を行います。JDBCは、TCP/IP上で通信を行うため、PostgreSQLサーバに外部からアクセスするためのプロトコルとしてTCP/IPをサポートするように設定する必要があります。すでに設定されている場合には必要ありません。

設定ファイル
$PGDATA/postgresql.conf
tcpip_socket = True (or 1) 

・アクセスコントロールの設定

 この設定は、Rhino SDKとPostgreSQLを別のマシンにインストールした場合に必要になります。同一マシンにインストールしている場合には、必要ありません。

 リモートマシン上からPostgreSQLサーバにアクセスをする際に、アクセス元のマシン名、アクセスするDBやその際のユーザー名を設定する必要があります。

設定ファイル:
 $PGDATA/pg_hba.conf
デフォルト:
 #TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
local all all trust
host all all 127.0.0.1 255.255.255.255 trust
変更後:
#TYPE DATABASE USER IP-ADDRESS IP-MASK METHOD
local all all trust
host all all 127.0.0.1 255.255.255.255 trust
host rhino postgres 192.168.0.5 255.255.255.0 password

要素 概要
rhino:
アクセスするデータベース名
postgres:
データベースサーバへのアクセスユーザー名
192.168.0.5:
アクセス元マシンIPアドレス
255.255.255.0:
アクセス元マシンネットマスク
password:
データベースサーバへのアクセスパスワード

■JSLEEサーバのインストール

 本稿ではJSLEEのアプリケーションサーバとして、OpenCloud Rhino SDKを用います。Rhino SDKは、Opencloud社が提供するJSLEEアプリケーションサーバ、Rhinoの開発、評価版バイナリです。Rhino SDKは、評価版としてフリーでダウンロードすることができます。

 Opencloud Rhinoは、JSLEE1.0に完全準拠かつフェイルオーバ機能やWeb管理インターフェイスを提供する製品です。加えてOpencloud社は、ここで紹介するSIPを操作するためのアダプタや、その他プロトコルを操作するための各種リソースアダプタを提供しています。それでは、まずバイナリをダウンロードしましょう(https://stampede.opencloud.com/public/)。

 「RhinoSDK-1.4.0-ga.tar」をダウンロードします。併せて「RhinoSDK-1.4.0-admin-manual.pdf.gz」もダウンロードしておくとよいでしょう。ダウンロードしたバイナリを解凍します。次に、解凍したディレクトリ以下にあるインストーラを実行します。

% ./rhino-install.sh
Open Cloud Rhino SDK Installation

The Rhino SDK install requires access to a PostgreSQL database server,
for storing persistent configuration and deployment information.
The database settings you enter here are required for the Rhino SLEE
config files. The install script can optionally configure the database
for you, you will be prompted for this later in the install process.

Postgres host [localhost]:      ←  PostgreSQLをインストールしたホスト名
Postgres port [5432]:  ← PostgreSQLをインストールしたポート
Postgres user [jain]: postgres ← PostgreSQLの起動ユーザー
Postgres password:  ← PostgreSQLの起動ユーザーパスワード
Postgres password (again):

The SDK installation needs to use the PostgreSQL interactive client, psql.
Enter the full path to your local psql client here.

Location of psql client [/bin/psql]: /opt/OCpgsql/bin/psql
← PostgreSQL Client、psqlコマンドのフルパス

The database name you specify below will be created in your Postgres
server and configured with the default tables for Rhino SLEE support.

Database name [rhino_sdk]:  ← 任意のデータベース名


Enter the directory where you want to install the Rhino SDK.

Directory to install Rhino SDK [/home/jain/rhino]:  
← サーバのインストールディレクトリ

These two ports are used for accessing the Management MBeans from a
browser client.

Management Interface HTTP Dynamic Content Port [8055]:
Management Interface HTTP Static Content Port [8056]:
← 管理サーバのポート

These two ports are used for accessing the Management MBeans from a
Java RMI (Remote Method Invocation) client, such as the Rhino SLEE
command-line utilities.

Management Interface RMI Registry Port [1199]:
Management Interface RMI Object Port [1200]:
← 管理モジュールを操作するために必要なRMIポート

Enter the location of your Java J2SE/JDK installation.
This must be at least version 1.4.2.

JAVA_HOME directory []: /usr/j2sdk1.4.2_03  ← Java実行環境のフルパス
Found Java version 1.4.2_03.  

*** Confirm Settings ***

Postgres host:     localhost
Postgres port:     5432
Postgres user:     postgres
Postgres password: ** not shown **
Database name:     rhino_sdk

Directory to install Rhino SDK:  /home/jain/rhino
Management Interface HTTP Ports: 8055,8056
Management Interface RMI Ports:  1199,1200
JAVA_HOME directory:             /usr/j2sdk1.4.2_03

Are these settings correct (y/n)? y ← 設定の確認、「y」にてインストール開始
Creating Rhino SDK directory
Do you want me to create the rhino_sdk database? 
(y or n, n means you must do this manually) y
DROP DATABASE
CREATE DATABASE
You are now connected to database rhino_sdk.
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 
……
The Open Cloud Rhino SDK is now installed in /home/jain/rhino.

Next Steps:

- Start the Rhino SDK SLEE by running "/home/jain/rhino/start-rhino.sh".
- Access the Rhino management console at http://Server1:8433/
- Deploy the example SIP services, see the file
  /home/jain/rhino/examples/sip/README for more information.

Open Cloud Rhino SDK 
inst
allation complete.

■アプリケーションサーバの起動

 JSLEEサーバを以下のコマンドを実行して起動します。

<JAIN SLEEサーバホームディレクトリ>/start-rhino.sh
% ./start-rhino.sh
Starting Rhino SLEE
…..
INFO   [rhino.sleestate]  SLEE successfully started

■アプリケーションのデプロイ

 まず、環境に合わせ設定を行います。次のディレクトリに移動し、設定ファイルを変更します。

サンプルアプリケーションディレクトリ: 
<JAIN SLEEサーバホームディレクトリ>/examples/sip
設定ファイル:sip.properties
PROXY_HOSTNAMES = server1.abc.com    ← 自ホスト名を入力する
PROXY_DOMAINS = server1.abc.com,abc.com
← <ドメイン名>および<サーバ名.ドメイン名>

 <ドメイン名>および<サーバ名.ドメイン名>の2つのエントリをカンマ区切りで入力するドメイン名は、sipアドレス呼び出しに対して操作できるドメインを定義するものになります。ここにエントリされていないドメインを持つsipアドレスに対しての呼び出しがあっても、PROXYサービスは動作しません。

 下記のコマンドを実行してアプリケーションのデプロイを行います。

実行
%cd <JAIN SLEEサーバホームディレクトリ>/examples/sip
% ant deployexamples
Buildfile: build.xml

find-rhino-jar:

init:
     [copy] Copying 1 file to /home/jain/rhino/examples/sip
    [mkdir] Created dir: /home/jain/rhino/examples/sip/jars
    [mkdir] Created dir: /home/jain/rhino/examples/sip/classes

deployexamples:

BUILD SUCCESSFUL
Total time: 1 minute 49 seconds

■動作確認

・JAIN SIPクライアントの設定を変更する


 SIPアドレスを用い相手を呼び出すため、SIP Proxyサーバの指定を行います。

 設定ファイル:<sip-communicatorホームディレクトリ>/sip-communicator.xml
<OUTBOUND_PROXY value="server1.abc.com:5060/udp"/>
← JSLEEサーバを指定する
<DEFAULT_DOMAIN_NAME value="abc.com"/>
← sipアドレスのドメインを指定する
<DEFAULT_AUTHENTICATION_REALM value="abc.com"/>
← sipアドレスのドメインを指定する

・JAIN SIPクライアントを起動する

 前編と同様にJAIN SIPクライアントを起動します。

 ログイン画面が表示されるので、sipアドレスのユーザー名(@より左)を入力し、「Login」ボタンをクリックします。SIPコミュニケータが設定のSIPアドレスおよびIPアドレスをSIPレジストラサーバに登録します。ログイン時、JSLEEサーバには以下のログが表示されます。

- sent request= REGISTER sip:server1.abc.com:15060;
transport=udp SIP/2.0(実際には1行)
Call-ID: 8c83d6ce76c4abde3a666ecaf35f82c9@200.1.1.1
CSeq: 1 REGISTER
From: "Bob" <sip:bob@abc.com:5060;transport=udp>;tag=6848169
To: "Bob" <sip: bob@abc.com:5060;transport=udp>
Via: SIP/2.0/UDP 200.1.1.1:5060;
branch=z9hG4bK02dab2e49d4c57a223be398ebb72d110
Max-Forwards: 70
Expires: 3600
Contact: "Bob" <sip: 200.1.1.1:5060;transport=udp>
Content-Length: 0

 ログインが完了すると以下の画面が表示されます。

■通信する

  いよいよ、通信を行ってみましょう。リストから相手を選び「Dial」をクリックします。

 ダイアル時、JSLEEサーバには以下のログが表示されます。

Call-ID: 436445551eb78c863115d5d53d9755be@200.1.1.1
CSeq: 1 INVITE
From: "Bob" <sip:bob@abc.com:5060;transport=udp>;tag=18923308
To: <sip:tom@abc.com>;tag=22364723
Via: SIP/2.0/UDP 200.1.1.1:5060;branch=
z9hG4bK1aceefebac830a4bafa34a4507bd5ebf (実際には1行)
Max-Forwards: 69
Record-Route: <sip:Server1.abc.com:5060;lr;transport=UDP>
Content-Type: application/sdp
Contact: "Tom" <sip:200.1.1.6:5060;transport=udp>
Content-Length: 153

 相手先への接続が確立されると、以下の画面が表示されます。

 さて、それでは、JSLEEサーバ上にどのようなSIPメッセージが届いているのかを確認してみましょう。そこで、まずは、JSLEEサーバのロギング設定を変更します。

 まず、管理サーバにアクセスします。ログインのページが表示されたら、次のデフォルトユーザー、パスワードでログインします。

アクセスURL
https://hostname: <ポート番号>
ユーザー名/パスワード
rhino/rhino

 ポート番号は、rhinoインストールディレクトリ/config/config_variablesファイルのWEB_CONSOLE_HTTPS_PORTエントリを確認してください。

 メインページから「Container Configuration」の「View Logging MBean」をクリックします。次に、「setLogLevel」の項目にあるプルダウンメニューから「sip.transport.manager」を選択し、その下のテキストボックスに「DEBUG」と入力します。最後に、「setLogLevel」ボタンをクリックし完了です。

 さて、それでは、もう1度、SIP Communicatorを用い、JSLEEサーバにアクセスしてみましょう。今度は、次のようなSIPメッセージが、JSLEEサーバ起動ウィンドウに表示されたでしょう。

2005-08-05 18:08:01.771  DEBUG  [sip.transport.manager]  incomingSipResponse:
SIP/2.0 200 OK
Call-ID: 436445551eb78c863115d5d53d9755be@200.1.1.1
CSeq: 1 INVITE
From: "Bob" <sip:bob@abc.com:5060;transport=udp>;tag=18923308
To: <sip:tom@abc.com>;tag=22364723
Via: SIP/2.0/UDP Server1.abc.com:5060;branch=
z9hG4bK9cbccc8064eb68fc7ea9b9fda40a9c22,SIP/2.0/UDP(実際には1行)200.1.1.1:5060;branch=z9hG4bK1aceefebac830a4bafa34a4507bd5ebf
Max-Forwards: 69
Record-Route: <sip:Server1.abc.com:5060;lr;transport=UDP>
Content-Type: application/sdp
Contact: "Tom" <sip:200.1.1.6:5060;transport=udp>
Content-Length: 153

1/2

 INDEX

Javaで音声チャットアプリを作ろう(後編)
Page1
環境の構築
  Page2
SIP Communicatorを評価すると?
次世代コミュニケーションのかたちを考える



Javaで音声チャットアプリを作ろう バックナンバー



Java Solution全記事一覧



Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Java Agile 記事ランキング

本日 月間
ソリューションFLASH