Sametime 3.1 では、テレフォニーのサポートが実装されました。つまり、サーバーでテレフォニーが有効なとき、Sametime API を利用する Sametime クライアントとアプリケーションはこのことを検出できます。テレフォニーが有効な場合は、クライアントにテレフォニー・ボタンとメニュー項目が表示されるので、ユーザーは Sametime サーバーにコール要求を送信できます。
developerWorks の Lotus 記事『Lotus Instant Messaging telephony extension(US)』には、テレフォニー・サーバー・アプリケーションを使用して、隠されているテレフォニー拡張機能を有効にする方法が記載されています。これを補足して、今回の記事では、Java Telephone Application Programming Interface (JTAPI) を使用して Sametime クライアントのコール要求を管理する Sametime サーバー・アプリケーションの実装について説明します。
この記事に書かれているソリューションを実装するには、Sametime 3.1 以降の Sametime サーバー (3.1 以降のバージョンは「Lotus Instant Messaging/Web Conferencing」という名前に変更) と ISDN 音声モデムが必要です。実装のテストとして、コンタクトリストから電話をかけるためにユーザーを選択すると、テレフォニー・サーバー・アプリケーションは ISDN 音声モデムを使用して、指定された ISDN 電話をコールします。コードは JTAPI を使用するため (JTAPI も複数の参加者間でのコールの管理をサポート)、この実装は JTAPI が有効になっている PBX システムにも接続しなければなりません。このため、すべての Sametime ユーザーは、他のユーザーの名前をクリックするだけで、PBX システムによってそのユーザーへのコールを確立することができます。
ユーザーのマシンで H.323 クライアント (詳細については、後の「H.323 クライアント」セクションを参照) が実行されていて、H.323 ゲートキーパーに登録されている場合は、そのユーザーはコンタクトリストで相手の名前をクリックするだけで、コールを確立できます。この場合、Sametime テレフォニー・サーバー・アプリケーションは、JTAPI H.323 サービス・プロバイダーを使用して、ユーザーの H.323 クライアントを目的の H.323 クライアントに接続したり、ゲートウェイを介して目的の電話に接続できます。コールされたユーザーの H.323 クライアントは、着信を表示するか、電話のベルを鳴らします。目的のエンドポイントがコールを受け入れると、接続が確立されます。
Sametime サーバー・アプリケーションを正しく実行させるための条件として、Domino Server と、当然ながら Sametime サーバーが必要です。通常、Sametime サーバーは Domino Server 上で実行されています。Sametime サーバーはコンタクトリストなどのデータを保存するために Domino Server を使用するのに対し、Sametime サーバー・アプリケーションは Sametime サーバーとメッセージを交換します (図 1 参照)。
図 1. データの交換

Sametime テレフォニー・サーバー・アプリケーションは Sametime サーバーにログインし、自分自身のサービス・タイプとインスタント・メッセージング・チャネルを登録します。次に、Sametime サーバーは Sametime クライアントに対して、テレフォニー・サポートが利用可能であることを伝えます。
Sametime クライアントは、隠されているテレフォニー拡張機能を有効にします。この拡張機能は、バージョン 3.1 以降で使用できます。基本的にこの拡張機能は、改善されたグラフィカル・ユーザー・インターフェースとランタイム・アプリケーションの強化で構成されます。ユーザー・インターフェースの強化には、通話用の新しいセットアップ・メニュー項目とボタンが含まれています。ランタイム・アプリケーションの機能強化によって、クライアントはコール設定メッセージを生成し、Sametime テレフォニー・サーバー・アプリケーションに送信できます。
ユーザーの立場から見ると、テレフォニー拡張機能はチャット機能に似ています。ユーザーはコンタクトリストで複数のユーザーを選択し、[通話の開始] メニュー項目を選択するか、電話ボタンをクリックします。ユーザーがいずれかの操作を実行すると、クライアントは要求されたコールに関するメッセージを Sametime サーバーを介してテレフォニー・サーバー・アプリケーションに送信します。
図 2. Sametime Connect クライアント

Sametime クライアントから要求されたコールを確立するため、Sametime テレフォニー・サーバー・アプリケーションには、ダイヤルする電話番号を導き出すための連絡先情報が必要です。まず、Sametime サーバーから受け取った XML 文字列から必要な連絡先情報を抽出します。この XML 文字列は次のフォーマットになっています。
<call_request_info> <user> <user_id> CN=Stefan Mueller/OU=germany/O=ibm</user_id> <user_on_mobile_device>0</user_on_mobile_device> <external_user>0</external_user> </user> </call_request_info> |
Sametime クライアントでは複数のユーザーを選択できます。この場合、XML 文字列に複数のユーザーがリストされることになります。完全修飾ユーザー名は、<user_id> タグと </user_id> タグによって囲まれています。Sametime テレフォニー・サーバー・アプリケーションの現在のバージョンでは、このタグだけが意味を持ちます。<user_on_mobile_device> タグと <external_user> タグはこのサンプル実装では使用されていませんが、将来的には使用される予定です。
ディレクトリー・インターフェース
完全修飾ユーザー名をベースとして、サーバー・アプリケーションは対応する電話番号をディレクトリーで照会します。Sametime テレフォニー・サーバー・アプリケーションは、任意のディレクトリー・アダプターと容易に統合できるディレクトリー・インターフェースを持ちます。ディレクトリー・インターフェースは、アクセス方法の違いを吸収するためにディレクトリー・アダプターを抽象化したものを提供します。
public interface IFDirectoryAdapter
{
public String getTel(String notesID);
} |
IFDirectoryAdapter インターフェースは、パブリック・メソッドの getTel で構成されます。このメソッドは、電話番号を文字列として返します。Sametime テレフォニー・サーバー・アプリケーションの現在のバージョンでは、このメソッドの引数は notesID だけです。これはユーザーを表し、このユーザーの電話番号が返されます。サーバー・アプリケーションのメインクラスは notesID パラメーターを介して完全修飾ユーザー名を渡します。インターフェースを実装しているディレクトリー・アダプターは、これに基づいて対応する電話番号を返します。
実際に、IFDirectoryAdapter インターフェースを実装し、getTel メソッドを介して電話番号を返す限り、どのようなディレクトリー・アダプターが使用されていても、またどのような方法で特定のディレクトリーにアクセスしてもかまいません。アプリケーションの現在のバージョンには、次のディレクトリー・アダプターがすでに実装されています。
Domino アダプター
Domin アダプターは、Domin ディレクトリーにアクセスするために Domino Toolkit for Java によって開発されました。Domino Toolkit for Java は developerWorks の「Lotus Toolkits and Drivers(US)」ページから入手できます。
lotus.domino.NotesFactory を使用してセッションを作成した後、データベース (TelephonySA.ini で指定されている) が開かれ、[$NamesFieldLookup] ビューが選択されます。
s = NotesFactory.createSession(dominoHost, dominoUserName, dominoPassword);
db = s.getDatabase(s.getServerName(), dominoDBName);
myView = db.getView("$NamesFieldLookup");
|
このビューは、Notes 名によって文書を取得するために使用されます。Notes 名は、完全修飾ユーザー名から抽出されます。
Document myDocument = myView.getDocumentByKey(notesName.getAbbreviated()); |
最後に、文書の OfficePhoneNumber 項目の値にアクセスすることにより、電話番号が見つけられます。
telnum = myDocument.getItemValueString("OfficePhoneNumber"); |
LDAP 互換ディレクトリー用アダプター
標準の Java SDK 1.4.2 には、Sun の Java Naming and Directory Interface (JNDI) が含まれています。これは、ディレクトリーとネーミングの機能を Java アプリケーションに提供します。JNDI は特定のディレクトリー・サービス実装に依存しないため、LDAP 互換ディレクトリーへのアクセスに使用できます。
JNDI を介して LDAP を使用するには、「javax.naming.*」をインポートします。
import javax.naming.*; |
初期コンテキストで hashtable が作成されます。
env = new Hashtable(11); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, ldapUrl); |
LDAP サーバーでの認証用のユーザー名とパスワードが追加されます。
env.put(Context.SECURITY_AUTHENTICATION, ldapAuthentication); env.put(Context.SECURITY_PRINCIPAL, ldapUserName); env.put(Context.SECURITY_CREDENTIALS, ldapPassword); |
初期ディレクトリー・コンテキストが作成されます。
DirContext ctx = new InitialDirContext(env); |
Notes ID の共通名 (CN) の部分が抽出されます。
String cn = notesID.substring(0, notesID.indexOf("/O")); |
Notes ID によって指定された LDAP オブジェクトのすべての属性が取得されます。
Attributes attrs = ctx.getAttributes(cn); |
最後に、電話番号が取得されます。
telnum = attrs.get("telephonenumber").get().toString(); |
フィルタリング
通常、ゲートウェイ (後で説明します) は、国別コードを含むすべてのダイヤル番号を扱うことができます。しかし、ISDN 音声モデム経由で国内へダイヤルするときは、国内通話用に国別コードをフィルターする必要があります。Sametime テレフォニー・サーバー・アプリケーションは、電話番号を正しい形式に変換するフィルターを適用します。たとえば、「49-1234 x5678 / 1234-5678」は「004912345678」に変換されます。あるいは、国別コードのフィルターが有効な場合は、「012345678」となります。国別コードが検出された場合、フィルターはすべての「-」、「 」、「x」、および「/」を削除し、「00」を電話番号に追加します。
Sametime テレフォニー・サーバー・アプリケーションは、JTAPI を使用してコールを確立します。JTAPI は、Java ベースのテレフォニー・アプリケーション用のオブジェクト指向プログラミング・インターフェースです。JTAPI は、API のセットで構成されています。Sametime テレフォニー・サーバー・アプリケーションの現在のバージョンは、コア API だけを使用します。これは、基本のコール・モデルと、電話をかける、受ける、切断するといった初歩的なテレフォニー機能を提供します。コア API を取り巻くのは、コール・センターやメディア・ストリーム・アクセスなどの特定のテレフォニー・ドメインに関する機能を提供する標準拡張 API です。
すべての JTAPI クラスは JAR ファイルで使用できます。このファイルは、必要な JTAPI クラスを Java ソース・コードにインポートする前に、Java クラスパスに追加しなければなりません。Sametime テレフォニー・サーバー・アプリケーションの Caller クラスでは、次の JTAPI クラスが使用されています。
javax.telephony.Address; javax.telephony.Call; javax.telephony.Connection; javax.telephony.JtapiPeer; javax.telephony.JtapiPeerFactory; javax.telephony.Provider; javax.telephony.Terminal; javax.telephony.TerminalConnection; javax.telephony.events.CallEv; javax.telephony.events.TermConnEv; javax.telephony.media.MediaCallObserver; javax.telephony.media.MediaTerminalConnection; javax.telephony.media.events.MediaTermConnAvailableEv; javax.telephony.media.events.MediaTermConnUnavailableEv; |
Caller クラスは、JTAPI のコール制御 (呼制御) メソッドを使用してコールを確立します。
コール制御
JTAPI は第一者コール制御と第三者コール制御の両方をサポートします。
第一者コール制御
第一者コール制御とは、クライアント・アプリケーションがコールを制御することを意味します。コールの確立については、Sametime テレフォニー・サーバー・アプリケーションがクライアントの役割を果たします。つまり、リモートの H.323 クライアントまたは電話に対し、直接の接続を確立します。同じ回線上にある市内電話を使用して、相手と話すことができます。
コールを確立するために、Sametime テレフォニー・サーバー・アプリケーションは JTAPI の Call.connect() メソッドを使用します。このメソッドには、次の 3 つの引数があります。
- terminal : 電話をかける発信側のターミナル
- address : 電話をかける発信側のアドレス
- toCall : 電話の着信側のアドレス
terminal と address はコールの発信点を指定するのに対し、toCall はコール先の電話番号を表します。
mycall.connect(terminal, address, toCall); |
Sametime テレフォニー・サーバー・アプリケーションを実行中のコンピューターに装備されているサウンド・デバイスを使用して、リモートのユーザーと通話することもできます。この場合、Sametime テレフォニー・サーバー・アプリケーションは、オーディオ信号を伝送するために、MediaTerminalConnection を確立する必要があります。
MediaTerminalConnection mtc = (MediaTerminalConnection)tc; |
MediaTerminalConnection 上でのオーディオの送受信には、コンピューターのデフォルトのマイクとスピーカーが使用されます。
mtc.useDefaultSpeaker(); mtc.useDefaultMicrophone(); |
第三者コール制御
第三者コール制御では、カンファレンス・サーバーや PBX システムなどの第三者がコールを制御します。このケースでは、Sametime テレフォニー・サーバー・アプリケーションは、コール要求をカンファレンス・サーバーに送信します。
第三者コール制御でも、Call.connect() メソッドが使用されます。違いは、terminal と address によって指定された発信点が、Sametime テレフォニー・サーバー・アプリケーションが実行されているコンピューターにはならず、コールの最初の電話機になる点です。address パラメーターが最初の電話機の番号を含むのに対し、toCall は 2 番目の電話機の番号を含みます。terminal パラメーターは、address から抽出されます。
mycall.connect(terminal, address, toCall); |
カンファレンス・サーバーまたは PBX システムがシングル・ステップ・カンファレンスをサポートするときは、JTAPI Call Control Package の CallControlCall.addParty() を使用することで、別のパーティをコールに追加することができます。
サービス・プロバイダー
第一者コール制御と第三者コール制御のどちらの場合でも、JTAPI にはサービス・プロバイダーが必要です。サービス・プロバイダーは、JTAPI に特定の機能を追加するドライバーにたとえられます。第一者コール制御の場合、JTAPI には、装着された音声モデムを制御するためのテレフォニー API (TAPI) サービス・プロバイダー、またはネットワーク・デバイス経由で H.323 コマンドを送信するための H.323 サービス・プロバイダーが必要となります。第三者コール制御では、カンファレンス・サーバーまたは PBX システムのサービス・プロバーダーがコール要求に必要となります。
JTAPI レイヤー・アーキテクチャーを下図に示します。
図 3. JTAPI レイヤー・アーキテクチャー

インターフェースとして、JTAPI は双方のサイドで実装される必要があります。Sametime テレフォニー・サーバー・アプリケーションは、JTAPI を一方のサイドから実装します。もう一方のサイドでは、いわゆるピアーが JTAPI とサービス・プロバイダー間のブリッジとして機能します。
このレイヤー・アーキテクチャーにより、JTAPI ベースのアプリケーションは、サービス・プロバイダーを交換するだけで、音声モデムの制御、H.323 コマンドの送信、または PBX システムとの通信が可能になります。
H.323 テレフォニー環境
VoIP (voice over IP) については、Sametime テレフォニー・サーバー・アプリケーションは H.323 を使用します。H.323 は ITU が勧告した標準で、未保証の LAN 上でのマルチディア通信をカバーします。
典型的な H.323 テレフォニー環境とその重要なエンティティーを下図に示します。
図 4. H.323 テレフォニー環境

H.323 クライアント
H.323 クライアントは、ターミナル、デスクトップ・コンピューター上のソフトフォン、または IP 電話のいずれかです。通常、この H.323 エンドポイントは、他の H.323 エンティティーとの双方向同時通信をサポートします。
ゲートキーパー
ゲートキーパーは、電話番号と IP アドレスを変換する役割を持つオプションのコンポーネントです。この目的で、H.323 エンドポイントは、手動または自動検出を介し、ゲートキーパーに登録します。ゲートキーパーが「routed」モードの場合は、ゲートキーパーはコール・シグナリングとコール制御も処理します。
この他にも、ゲートキーパーには次の機能があります。
- アドミッション制御
- ゾーン管理
- コール認証
- バンド幅管理
Multipoint Control Unit (MCU) |
Multipoint Control Unit (MCU) は、カンファレンス・サーバーと呼ばれることもあり、2 つ以上のエンドポイント間のカンファレンスをサポートします。MCU はスタンドアロン・デバイスであるか、ゲートウェイ、ゲートキーパー、またはターミナルに組み込まれています。通常、MCU は、マルチ・ポイント・コントローラー (MC) およびマルチ・ポイント・プロセッサー (MP) によって構成されます。MC がコール・シグナリングとコール制御を行うのに対し、MP はエンドポイントからメディア・ストリームを受信し、これを処理して、カンファレンス内のエンドポイントに返します。
第三者コール制御では、Sametime テレフォニー・サーバー・アプリケーションは MCU を使用してコールを管理します。この場合、Sametime テレフォニー・サーバー・アプリケーションは接続要求を MCU に送信し、MCUは指定されたデバイスを接続します。カンファレンスが確立されると、Sametime テレフォニー・サーバー・アプリケーションは、別のパーティをコールに追加するよう MCU に依頼できます。
ゲートウェイ
ゲートウェイは、異なるネットワーク間での接続を可能にするために、メディア・ストリーム、コール・シグナリング、およびコール制御を変換します。たとえば、H.323 ネットワークと公衆 ISDN ネットワークの間でコールを確立するときにゲートウェイが使用されます。
今後の開発
Sametime テレフォニー・サーバー・アプリケーションの現在のバージョンは、音声モデムまたは H.323 を介したコールをサポートする第一者コール制御に基づいています。「第三者コール制御」と「サービス・プロバイダー」のセクションで説明したように、コードを少し変更し、適切なサービス・プロバイダーを使用することで、アプリケーションが第三者のカンファレンス・サーバーや PBX システムを制御できるようになります。
XML サーバーから受け取った XML 文字列には、<user_on_mobile_device> タグと <external_user> タグ内に、追加のコール設定情報が含まれています。<user_on_mobile_device> タグは、コール先のユーザーはオフィス内にはいないが、モバイル・フォンに出られることを示します。この場合、Sametime テレフォニー・サーバー・アプリケーションは、オフィスの電話番号の代わりに、ユーザーのモバイル・フォンの番号を使用することができます。<external_user> タグは、ユーザーが外部の人間であることを示します。ユーザーが Sametime コミュニティに属さず、ゲートウェイを介して統合されるコミュニティに属している場合、そのユーザーは外部というステータスになります。このタグを使用することで、外部への電話を禁止できます。
今後のバージョンの追加機能として、コールの確立プロセスを視覚化し、コールを直接制御する機能をユーザーに与えることが考えられます。この機能は、Sametime テレフォニー・サーバー・アプリケーションと Sametime クライアントとの間で、チャット・ウィンドウを介してインスタント・メッセージを交換することで実現できるでしょう。たとえば、ユーザーがコール制御コマンドを Sametime サーバーに送信する機能も考えられます。さらに、Sametime サーバーが、ユーザーのブラウザーでコール制御アプレットを起動する URL リンクを Sametime クライアントに送信するといった可能性もあります。
この記事では、Sametime のテレフォニー・サポートを示す Sametime テレフォニー・サーバー・アプリケーションを実装するプロジェクトについて記述しました。アプリケーションを実際に実装する前に、計画と情報の調査が入念に行われました。この結果、Sametime によるテレフォニー・サポートの有効化、ディレクトリーの照会、およびコールの確立をまとめて扱うという概念が考案されました。この概念に従い、音声モデムを介した第一者コール設定をサポートする Sametime テレフォニー・サーバー・アプリケーションの実現化に成功しました。
また、H.323 を含むさまざまな JTAPI テレフォニー・サービス・プロバイダーとの互換性を保つために、多くのレイヤーでアプリケーションの透過性が維持されています。H.323 サービス・プロバイダーのテスト用には、ゲートキーパーをともなう高度な H.323 テレフォニー環境と H.323 - ISDN ゲートウェイがセットアップされています。さらに、Domino ディレクトリーおよび LDAP 互換ディレクトリーにアクセスするアダプターと共に、透過的なディレクトリー・アクセスのためのオープン・インターフェースも実装されています。
プロジェクトには多くの調査が必要でしたが、最終的には、すべての要件を満たし、Sametime におけるテレフォニー・サポートの実装の参考となる概念とアプリケーションが得られました。しかし、前のセクションでも説明したように、今後のさらなる開発の余地も残されています。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| An Introduction to the Java Telephony API (JTAPI) | jtapi-tutorial.pdf | 84KB | HTTP |
ダウンロード形式について Adobe® Reader® が必要
- Sametime のテレフォニーに関する情報については、developerWorks の Lotus 記事『Lotus Instant Messaging telephony extension(US)』を参照してください。
- Definition of Java interface(US)
- Java Telephony API(US)
- An Introduction to the Java Telephony API (JTAPI) (84KB)
- Computer Telephony Integration and Its Applications(US)
- H.323: ITU-T VOIP Protocols Overview(US)
- International Telecommunication Union(US)のホームページ
- developerWorks Japan: Lotus: Lotusの日本の技術情報サイトです
- developerWorks: Lotus(US) : Lotusの英語の技術情報サイトです
Stefan Mueller : ドイツ、マンハイムの University of Cooperative Education の Applied Computer Science の学生。学外では、3 年間の契約で IBM Germany のインターンとして勤務。この記事は、彼の最初のインターンシップ・プロジェクトから引用されている。現在、Lotus Web Conferencing 6.5.1 用の Siemens アダプターを開発する別のインターンシップ・プロジェクトに携わっている。
Volker Juergensen : ドイツ IBM の Technical Sales IT Specialist。1998 年より Lotus で Sametime をベースとしたソリューションに携わる。Redbook『Working with Sametime Client Toolkits(US)』の著者。