サリュテーションはWindows Socketインターフェースを介してIrDAにインプリメントできます。以下では、このテクニックを説明します。
図4は、Salutation
Manager(TM)とIrDA Stackおよびその関連アプリケーションとの関係を示しています。この図はクライアント側でもサーバー側でも同じです。Salutation
ManagerはIrDAプロトコル・スタックに特有のトランスポート・マネージャを備えており、Salutation
APIを介してアプリケーションからアクセスできます。Salutation
ManagerはWindows Socketを介してIrDA用のSalutation Protocolを送受信します。以下では、これらのコンポーネント間の通信を説明します。
図 4: Transport Manager を介した Salutation Manager とI rDA Protocol Stack の関係
Salutation Managerは初期化とともにIrDA Transport Managerを開始し、このTransport ManagerがIRSocket "socket()" APIを呼び出してIRソケットを構築します。サーバー側のTransport Managerは、ソケット・インターフェースを通じてソケットにバインドし、IrDAトランシーバーをlistenモードに設定して、トランシーバーがインバウンド伝送を受け取れるようにします。
クライアント側のTransport Managerとサービス・デバイスは、他のデバイスをサーチしてサリュテーションに対応しているかどうかを判別します。
サービスのTransport Managerは、SetSocketOpt(IAS_SET)コールを使用し、IrDAスタックのIASレジストりー内にSalutation Manager Identifier (SLM-ID) を設定します。IAS_SET構造体の値は次のようになります。
irdaClassName = "SLM"
irdaAttribName = "SLM-ID"
irdaAttribType = 0x00000001
irdaAttribute.irdaAttribInt = デバイスに固有のSLM-IDを示す整数
Salutation Architecture Specificationでは、IrDAのSLM-IDは「IrLAPデバイス・アドレス(4オクテット)あとに、16番目のオクテットを通じたランダムな値を追加したもの」として定義されています。IrLAPデバイス・アドレスは完全に一意ではありませんが、IrDAプロトコルのモーバイルな特性とランダム値の長さ(11オクテット)を考慮すれば、SLM-IDは実質的に一意となります。
クライアントのTransport Managerは次のコマンド・ループを使って他のデバイスをサーチします。
GetSocketOpt(IRLMP_ENUMDEVICES)
他のデバイスが検出されると、GetSocketOptコマンドは応答したデバイスのリストを返します。続いてクライアントのTransport ManagerはGetSockOpt(IAS_QUERY) を使って、検出されたデバイスがサリュテーションに対応しているかどうかを判別します。サリュテーションに対応しているデバイスの場合は、そのSLM-IDの値も検出します。
クライアントのTransport ManagerはSLM-IDと.irdaDeviceIDとの相関関係を確立し、SLM_IDへの要求を.irdaDeviceIDに変換します。
最後にTransport Managerは、検出されたサリュテーション対応の各デバイスに対してIRSockets connect() コマンドを出します。これにより、各サービス・デバイスに新しいソケットハンドルが作成され、このソケットハンドルがクライアントとサービス・デバイスとサービス・デバイスの間にIrDAリンクを確立します。Transport Managerはこのリンクを維持します。
上記以外のデバイス間の通信はSalutation APIを介してSalutation Managerによって行われます。
サービス・アプリケーションはslmRegisterCapabilities()コールを使って、デバイスのファンクショナル・ユニットの機能を確かめます。サービスのSalutation Managerはこの情報を保管し、IrDAインターフェースを介して受け取ったサービス要求と比較します。
クライアント・アプリケーションはslmSearchCapabilities()コールを使って、アプリケーションが定めたサーチ基準を満たすデバイスのSLM-IDを判別します。サーチ基準はslmSearchCapabilities()コールに入っているFunctional Unit Description Recordを通じて指定されます。クライアントのSalutation Managerはこの要求をQUERY_CAPABILITIES Salutation Protocolコマンドにパッケージし、IRSockets send() コマンドを使ってサリュテーション対応のすべてのデバイスに送ります。
要求を受け取ったデバイスは、受信したFunctional Unit Description Recordの属性をそのデバイスに登録してある Functional Unit Description Record と比較します。この比較はSalutation Architecture Specificationに定義されているアルゴリズムによって実行されます。比較の結果が肯定的であれば、サービスのSalutation Managerはその応答をQUERY_RESPONSE Salutation Protocolの応答にパッケージし、IRSockets send() コマンドを使ってクライアント・デバイスに送信します。クライアントのTransport Managerは相関テーブルを使って、slmSearchCapabilities()コールへの応答としてアプリケーションに返されたSLM-IDに肯定応答をマップし、Salutation Managerを通じてその結果をクライアントに送ります。
クライアント・アプリケーションはslmQueryCapabilities()コールを使って、特定のサービス・デバイスの特定の機能を判別します。クライアントはデバイスをSLM-IDによって指定します。ここでもサーチ基準はslmQueryCapabilities()コールに入っているFunctional Unit Description Recordを通じて指定されます。クライアントのSalutation Manager はこの要求をQUERY_CAPABILITIES Salutation Protocolコマンドにパッケージします。クライアントのTransport ManagerはSLM-IDとirdaDeviceIDの相関関係を確立し、IRSockets send()コマンドを使ってQUERY_CAPABILITIESコマンドを指定したデバイスに送ります。
コマンドを受け取ったデバイスは、受信したFunctional Unit Description Recordの属性をそのデバイスに登録してある Functional Unit Description Record と比較します。この比較はSalutation Architecture Specificationに定義されているアルゴリズムによって実行されます。比較の結果が肯定的であれば、サービスのSalutation Managerはその応答をQUERY_RESPONSE Salutation Protocolの応答にパッケージし、IRSockets send() コマンドを使ってクライアント・デバイスに送信します。この情報はクライアントのSalutation Managerを通じてクライアントに返されます。
要求したサービスを検出したクライアントは、IRSockets send()コマンドとIRSockets receive()コマンドを使ってデバイスと他のデータを交換できます。通信が完了したら、クライアント・アプリケーションはIRSockets closeSocket()コマンドを呼び出します。
サービス・アプリケーションはslmUnregisterCapabilities Salutation Managerコールを使って、他のデバイスに機能を使わせないように設定できます。
拡張
上述の例では、WinSocketsを介してサリュテーション・アーキテクチャをIrDAに拡張しました。他のソケット・インターフェースを使えば、同じやり方を他のプロトコルにも拡張できます。
Salutation Service Discovery ProtocolのIrDAへの実装に関する最新情報はサリュテーションのWebサイト (www.salutation.org)に掲載していく予定です。