パケットCメールによるアプリケーション同士の通信機能をEZアプリ通信と呼びます。ここでは、EZアプリ通信のことを「Cメール通信」または「Cメールサービス」などのように表記しています。
以下にCメールについて説明します。
「単発モード」によるCメール通信が可能です。
Cメールサービスにより通信できるのは、同じ種類のJavaアプリケーション同士のみです。ここで、同じ種類のアプリケーションとは、JadファイルまたはJARファイル中のマニフェストファイル中に記載されるデスクリプタのうち、MIDlet-Name、MIDlet-Version、MIDlet-Vendorが一致するアプリケーションです。
単発モードでの発信側と着信側の移動機の処理を図1に示します。
図1. Cメール単発モード処理
単発モードでは、通信先の移動機上のJavaアプリケーションに対して一つメッセージを送信できます。このとき、発信側のJavaアプリケーションは下記のパラメータを指定します。
発信側の移動機は、発信の許可を求めるGUIをユーザーに表示します。ユーザーが許可したときにのみ発信されます。このとき、起動を要求するアプリケーション情報として、発信側Javaアプリケーションの名前、ベンダ名、バージョン情報を着信側に伝えます。
着信側では、起動を要求されたJavaアプリケーションの情報をもとに、移動機内部でアプリケーションの存在を確認します。存在すると「Ack」メッセージを発信側に返します。
着信側は、ユーザーに起動の許可を求めたうえで、アプリケーションを起動します。着信側で起動されたJavaアプリケーションは、自身がCメール起動要求によって起動されたことを検知します。そして、下記の情報を取得します。
発信側、着信側とも、すべてのJavaアプリケーションが単発モードの通信機能を使用できます。
Cメール通信機能を使用するJavaアプリケーションは、起動された時点で起動要因を調べる必要があります。起動要因は、MIDPのスタティックメソッドSystem.getProperty()に"kddi.system.wakeupMode"キーを与えて取得します。
System.getProperty()が"1"を返したときは、Cメール起動要求によって起動されたことを前提としてプログラムを実行しなくてはなりません。発信側の情報を取得するためには、CMailConnectionインタフェースが実装されたオブジェクトを取得し、そのメソッドを使用します。
CMailConnectionインタフェースは、DatagramConnectionインタフェースから導出されています。MIDPのConnector.open()スタティックメソッドに、"cmail"スキームのURLを指定すると、CMailConnectionインタフェースを実装したオブジェクトが得られます。Cメール通信機能を使用するためには、このオブジェクトのメソッドを使用します。
Connector.open()に与えるurlのフォーマットで、発信側の機能を使用するのか、着信側の機能を使用するのかが決定されます。発信側機能、着信側機能、連続モード時のチャット送受信機能それぞれについて使用するメソッドを下記に示します。
| 機能 | メソッド |
|---|---|
| Cメール単発モードを設定する | void setSingleMode() |
| 移動機のニックネームを設定する | void setNickName(java.lang.String nickname) |
| 起動要求するアプリケーションへのメッセージを設定する | void setMessage(java.lang.String message) |
| ユーザーに許可を得てから、単発モードで起動要求を送信する | void sendTo() |
| 機能 | メソッド |
|---|---|
| Cメールサービスモードを取得する | void getMode() |
| 通信相手の電話番号を取得する | java.lang.String getTelNo() |
| 通信相手のニックネームを取得する | java.lang.String getNickName(java.lang.String message) |
| 通信相手から送られたメッセージを取得する | java.lang.String getMessage(java.lang.String message) |
Cメール関連で扱う項目の最大長について表4に示します。
| 項目 | 最大長(バイト) |
|---|---|
| ニックネーム | 12 |
| 送信メッセージ(起動要求メッセージ) | 81 |
| チャット(Datagramオブジェクトに格納するデータ) | 354 |
ニックネーム、送信メッセージ、およびJadファイルに指定するMIDlet-Name, MIDlet-Vendor, MIDlet-Versionの長さの総和は90バイトを超えないこととします。上記の表の数値はこの条件下において有効です。
Cメール関連のメソッドで発生する概略のタイムアウト時間を表5に示します。表に示すタイムアウト時間の間、メソッドが戻らない可能性があります。このタイムアウト時間はCメールパケットサービスのプロトコルに関連しており、将来変更される可能性があります。
| 項目 | タイムアウト時間(分) |
|---|---|
| CMailConnection.sendTo() | 5 |
| CMailConnection.close() | 4 |
| Datagram.send() | 1 |
| Datagram.receive() | 1 |
| 起動要求を受けていないJavaアプリケーションが、相手(発信側)からの起動要求を待つ場合に呼び出される下記のメソッド CMailConnection.getMode() CMailConnection.getTelNo() CMailConnection.getNickName() CMailConnection.getMessage() |
5 |
"cmail"スキームのurlに着信側の電話番号を加えて、Connector.open()スタティックメソッドに指定し、CMailConnection インタフェースを実装したオブジェクトを取得します。以下に例を示します。
String partnerTelNo = "090-1111-2222";
//注) 番号中のハイフン'-'は必要ではありません(無視されます)。
// この他、スペース(空白)及び 'P' も無視されます。
// 通常は AddressBook.getAddressByGUI()によって取得したPersonalInfoオブジェクト
// から 電話番号を得ます。
CMailConnection con = null;
// CMailConnectionを実装したオブジェクトを取得
con = (CMailConnection)Connector.open( "cmail://" + partnerTelNo );
次に、CMailConnectionを実装したオブジェクトに、Cメールサービスモードを単発モードに設定します。また、発信側ニックネーム、着信側に送る単発モードメッセージを設定し発信します。以下に例を示します。
// 単発モードに設定
con.setSingleMode();
// 発信側ニックネームを設定con.setNickName( "Tom" );
// 着信側に送るメッセージを設定
con.setMessage( "MESSAGE" );
con.sendTo(); // 単発モードメッセージの発信:着信側から「Ack」または「Nack」を受信、
//またはタイムアウトするまでJavaアプリケーションはブロックされます。
con.sendTo()は、ユーザーに発信の許可を求め、ユーザーが許可すると発信します。着信側がJavaアプリケーションの存在を確認すると、「Ack」メッセージを発信側に返します。この「Ack」メッセージを発信側が検出すると、con.SendTo()メソッドの呼び出しが戻ります。ユーザーが許可しなかったり、着信側との通信に失敗すると、SendTo()メソッドではIOException例外がスローされます。
sendTo()メソッドが戻ったら、close()メソッドで接続を閉じます。
Cメール通信機能を使用するJavaアプリケーションは、起動されたときに起動要因を調べる必要があります。起動要因は、MIDPのスタティックメソッドSystem.getProperty()に"kddi.system.wakeupMode"キーを与えて取得します。以下に例を示します。
try{
String wakeupMode = System.getProperty( "kddi.system.wakeupMode" );
if ( wakeupMode != null && wakeupMode.equals( "1" ) ) {
// 要求受付側。モードは要求送信側に依存する。
CMailConnection con = (CMailConnection)Connector.open( "cmail://" );
int mode = con.getMode();
String nickName = con.getNickName();
String message = con.getMessage();
...
}else{
}
con.close()
}
}catch ( IOException ioe ){
...
System.getProperty()が"1"を返したときは、Cメール起動要求によって起動されたとみなします。Javaアプリケーションは、Connector.open()メソッドで、CMailConnectionインタフェースの実装オブジェクトを取得します。このとき"cmail://"をurlとして指定します。open()が成功したら、発信側が要求しているCメールサービスモードをgetMode()メソッドで、発信側のニックネームをgetNickName()メソッドで、発信側からのメッセージをgetMessage()メソッドで取得します。
CメールサービスモードがSINGLE_MODEのときは、発信側は単発モードの通信を要求してきています。Javaアプリケーションは、getMessage()メソッドで発信側からのメッセージを取得し、close()メソッドで接続を閉じます。
Cメールで起動要求を受けていないJavaアプリケーションが、起動要求を待ち受けることも可能です。この場合、Connector.open()からclose()までの処理は、下記のように、Cメール起動要求を受けた場合と同様になります。
起動要求を受信していなくても、open()メソッドはすぐに戻ります。ただし、発信側が通知する項目を取得するためのメソッドを呼び出すと(下記の例ではcon.getMode())、発信側が起動要求してくるか、またはタイムアウトするまで呼び出し元に戻りません。
try{
// 要求受付側。モードは要求送信側に依存する。
CMailConnection con = (CMailConnection)Connector.open( "cmail://" );
int mode = con.getMode();
// 発信側から起動要求を受信する、または
// タイムアウトするまで
// Javaアプリケーションはブロックされます。
String nickName = con.getNickName();
String message = con.getMessage();
con.close()
} catch ( IOException ioe ){
...