JavaとWindowsで赤外線OBEX通信をする試み

はじめに

NTTドコモが発売している携帯電話504iシリーズ以降にはIrDA規格に準拠した赤外線デバイスが備えられています。この赤外線デバイスを使用してWindows上で稼動するJava SEとOBEXプロトコル(IrMCもこのプロトコルを使用します)による赤外線を行えればいろいろと便利ではないかと思い、実装を行ってみました。このページではそのライブラリについて取り扱います。

なお、同社の携帯電話に限らず、OBEXにて通信を行うPalm OS機や他社携帯電話とも接続可能です。その他にも任意のデバイスで通信を行うことができるため、その部分の実装を追加すれば赤外線以外の通信経路でOBEXプロトコルを扱う機器と通信を行うことも可能です。

OBEXプロトコルを扱うWindows用Javaライブラリ

APIの概要

Java SEには、現在のところ標準でOBEXプロトコルを扱うAPIというものが存在しません。そこでNTTドコモが同社の携帯電話504iシリーズに搭載したOBEXプロトコルを扱うAPIを設計の下敷きとして、Java SEで504i/505iシリーズと赤外線による通信を行うためのライブラリを作成してみました(このライブラリは赤外線による通信の他、TCP/IPによるOBEX通信もサポートしています)。

504i向け赤外線によるOBEX通信APIを元にした設計を採用したのは以下の理由からです。

前述のように、現在のJava SE仕様にはOBEXプロトコルおよび赤外線デバイスを扱うAPIが存在しないため、今回の実装では筆者が独自に仕様を策定することになります。この際に候補となるAPIはBluetooth向けのOBEX仕様とNTTドコモによる504iシリーズ向けの仕様の二つが存在しました。このうち後者の方が実際に使用している開発者が多いのではないかという判断から、504iシリーズに搭載されている赤外線OBEX通信APIを概ね継承した設計としました。しかしそのままでは汎用性に欠ける部分および実装上必ずしも真似る必要がないと判断した部分については独自の実装を行いました。

ただし、あくまで下敷きにしただけで完全に互換性があるわけではないこと、Java SE上で動作するiアプリエミュレータに邪魔にならないこと、NTTドコモが使用すべきパッケージ名を汚染すべきではないことから、独自のパッケージ名personal.sakaki.ioの中に実装することにしました。ご存知のようにパッケージ名はドメイン名をひっくり返したものを使用すべきなのですが、筆者は独自のドメイン名を持っていないため、このようなパッケージ名を採用しました。

想定する実行環境

このOBEXライブラリは赤外線通信部分にネイティブコードを含んでいるため、該当する処理はWindows2000/XPおよび98/98SE/Meでのみ動作します。作者はWindowsXPのみで動作確認を行っていることから、その他の環境では正常に動作しない可能性があります。

その他の動作条件については以下の通りです。なお、赤外線通信を行わないのであれば、環境を問わずJava 1.1以降で動作するものと思います。

必須動作環境
OS Windows2000/XPを推奨、Windows98/98SE/Meでも動作すると思われます。
Java実行環境 Java 1.1をフルスペックでサポートするWindows上のJava
VM Microsoft VM for Java Build 3154以降(それ以前は不可)
IrDAデバイス WindowsがIrDAデバイスとして認識するもの(CIRおよびConsumer IRとして認識されているものは不可)。

作者は以下の環境で動作確認を行いました。

作者の動作確認環境
OS Windows XP Professional / Service Pack 2
Java実行環境 Java SE 1.6.0_07のみ
IrDAデバイス リンク・エボリューション製 IrSTICK(旧Sigmatel Inc社製チップ採用)
株式会社クエスト製 USB IrDA(KC Technology, Inc社製チップ採用)
マシン Intel D875PBZ / Pentium 4 630 / RAM 2GB
赤外線対応機器 504i各機種および504iS各機種、505i~506iSの一部、FOMA P2101V/N2051/F2051/P2102V、FOMA 900i~905iシリーズの一部、PalmIIIc、その他

パッケージ構成内容

赤外線OBEX通信ライブラリには同ライブラリとそのAPIリファレンスの他、以下のようなサンプルアプリケーションが付属しています。

  • OBEX通信をコマンドラインから制御するJavaアプリケーション“obex”(ソース公開)赤外線OBEX通信ライブラリの動作テストが主な目的のアプリケーションです。コマンドベースでファイルを転送することができるため、ちょっとしたファイルの転送時にも便利に使えると思います。
  • OBEX通信によるTCP/IPと赤外線の間のブリッジを行うJavaアプリケーション“inbridge”(ソース公開)このブリッジを使用することで、NTTドコモのiアプリ開発ツールであるiαppli Development Kitを使用して、実際の504i/505iシリーズと赤外線通信を行うことができるようになります(最新のiDKでは本処理は不要です。iDKの一部ファイルを所定のマニュアル記載の方法で置き換えるだけで通信可能です)。

使用条件

このOBEXライブラリは以下の使用条件に同意する場合に限って使用することができます。これらの使用条件は配布パッケージに同梱される全てのファイルに対して適用されます。

  1. 使用目的はこのソフトウェアの評価目的に限ります。その他の目的に転用することはできません。
  2. 配布パッケージは自己責任によってのみ使用することができます。使用した結果何らかの損害を生じたとしても作者(さかきけい)は一切責任を負いません。
  3. この配布パッケージ全体および一部をいかなる手段を用いても転載および再配布することを禁じます。
  4. 配布パッケージの所有権および著作権他、全ての権利は作者(さかきけい)が保持しています。使用者に対して各種権利等が移転することはありません。

上記の他、筆者が必要だと判断して追加および変更する使用条件は全ての配布パッケージにさかのぼって適用されます。

ダウンロード

上記の使用条件に同意する場合に限ってOBEXライブラリをダウンロードして条件の範囲内で使用することができます。同意する場合は以下のリンクをクリックしてダウンロードしてください。

使用条件に同意して赤外線OBEX通信ライブラリをダウンロードします。

このOBEXライブラリを実行した結果、動作したか否かという情報およびここはこうした方がいいのではないかという提案等がありましたら Overflow!コミュニケーションボード へ書き込んでください。よろしくお願いします。現在掲示板は設置しておりません。

その他

詳しくはOBEXライブラリに付属するドキュメントを参照してください。使用条件について本ページとドキュメントの間で差がある場合はより限定的な条件を優先することとします。

OBEXライブラリ付属のドキュメントはこちらのページに、APIリファレンスはこちらのページにてそれぞれ参照することができます。これらのページは常に配布パッケージに含まれるものと同一であるわけではありません。異なることもあります。

最後に

OBEX認証関連を機能制限で使用不可能にしていた点を修正し、動作可能なように変更したバージョンを公開しました。今回は環境を含めてかなり色々と変わったので新たな不具合が発生している可能性を排除できません。何か問題があるようでしたらメールにてお知らせいただければと思います。

更新履歴

  • 2002/11/14 初版
    • とりあえずの公開版を作成し、同時にこのページを作成して公開しました。
    • 現在多忙にてあまり詳しいページおよびドキュメントを作成することができません。今後折をみて拡張、更新等を行っていければと考えています。
  • 2002/11/16 第2版
    • IrShot の GUI モードにおける操作方法とエラー時の確認事項を追加しました。
  • 2002/11/17 第3版
    • サンプルアプリケーションの紹介に一言コメントを加えました。
  • 2002/11/18
    • 赤外線OBEX通信ライブラリを更新しました。
    • 変更点は付属のドキュメントを参照してください。
  • 2003/02/07
    • 赤外線OBEX通信ライブラリを更新しました。
    • 変更点は以下のとおりです。
      • OBEXCommon クラスに追加した getLength メソッドを getCount メソッドへ名前を変更しました。
      • ネイティブ処理を行う obexnative.dll のAccpet系処理でバッファオーバーフローが発生していた不具合を修正しました。
    • 次のバージョンでは API を大幅に変更する予定です。
  • 2003/02/16 第4版
  • 2003/05/12 第5版
    • OBEXライブラリを完全にリライトしました。
    • この関係で従来のOBEXライブラリとは互換性がなくなっています。必要に応じて新しいAPIに移行する必要があります。
    • APIリファレンスをWebサイトに載せました。
  • 2003/05/29 第6版
    • リライト後のβ5があまりにも不出来だったので臨時公開です。
    • 認証系のAPIを追加しましたが臨時公開のために急遽公開することにしたため、まだ正常に動作しないので使わないでください。
  • 2003/08/07 第7版
    • 受信したTYPEヘッダにゴミがついていた不具合を修正しました。
    • 送信する際のTYPEおよびTIME、HTTPヘッダが規定どおりではなかった不具合を修正しました。
    • 受信したパケットにHTTPヘッダが含まれる場合に正しく解釈できない不具合を修正しました。
    • APIリファレンスの内容をいくつか修正しました。
  • 2003/11/14 第8版
    • ObexConnectionクラスのopenOutputStream()メソッドが返すOutputStreamオブジェクトのclose()メソッドを呼び出すとクラッシュする不具合を修正しました。ご指摘下さった じぇいむす さん、ありがとうございました。
  • 2008/05/08 第9版
    • OBEX認証を機能制限にて使用できないようにしていたのを使用できる様にしました。
    • Javaの環境をJava SE 6に移しました。この環境でコンパイルおよびドキュメント生成を行っています(ターゲットは1.2を指定しています)。
    • 細かい不具合の修正をしました。
    • ライブラリとして同梱するコードを調整しました。
    • 今後ドキュメントを書きなおしたほうがいいかと考え中です。とりあえず公開するために書いたドキュメントなので色々とアラが目立ちます。
  • 2008/07/16 第10版
    • OBEX認証におけるRealmの文字コードの扱いに問題があったのを修正しました。
    • SETPATHオペレーションが正常に動作しなかった点および細かなパラメータの指定および取得ができなかった問題に対応しました。
      • ObexServerConnectionにSETPATHオペレーションで受け取ったflagsの状態を返すisSetPath_????系のメソッドを追加しました。
      • ObexClientConnectionにSETPATHオペレーションで送信するflagsの状態を設定するsetSetPath_????系のメソッドを追加しました。
    • Javadocの不具合のためにAPIリファレンスの「使用」ページのフレーム制御が正常に行えませんが、原因が原因なので仕様とさせていただきます。