右図はBluetoothのプロトコル・レイヤー(プロトコル層)を簡易的に図示したものです。Bluetooth-HIDプロファイルはどこにも有りません。Bluetoothのプロトコルそのものではないからです。例えば、2つのBluetooth機器を考え、一方はHCIプロトコル上でHIDを実現しており、他方はL2CAP上でHIDを実現していると仮定します。前者はL2CAPを理解しませんので、これら2つの機器は繋がりません。つまり、HIDレベルでは同じでも、下位のプロトコルレベルが互いに異なれば、通信できないことになります。そこで、HIDの様に高いレベルでの通信サービスを実現するときに、使用するプロトコルの種類と、それらをどの様に利用するかの手順が規格化されています。この規格化された手順をプロファイルと呼びます。使用するプロトコルに関して言えば、Bluetooth-HIDプロファイルは右図で①、②、③を使用します。また、SPP(Serial Port Profile)の場合は①、②、③、④を使用します。
プロトコルの役割の1つは、Bluetoothに使うデータ・パケットの構造形式(フォーマット)を決めることです。プロファイルはプロトコルではありませんので、データ・パケットの構造形式を決めはしません。
データ・パケットの構造形式については、たとえばL2CAP(プロトコル)によるチャンネルの確保の章を復習しましょう。
さて、HCI ACL データ・パケットは、
(Connection Handle+PB Flag+BC Flag)、ACLデータ長、ACLデータ列
の形式を持つことは、HCIプロトコルの章で書きました。この様なデータ・パケット構造形式にするということを決めているのが、HCIというプロトコルです。
また、L2CAP データ・パケットは、HCI ACL データ・パケットなのですが、その中のACLデータ列がさらに構造化されており、
i) 最初に送信するパケット(PB Flag=10)の場合
ACLデータ列=L2CAP全データ長、チャンネルID、L2CAPデータ列
ii) 分割された2番以降のパケット(PB Flag=01)の場合
ACLデータ列=L2CAPデータ列
なる構造を持っています。この様なL2CAPデータ列の構造形式を決めているのが、L2CAPというプロトコルです。
以上に見てきたように、L2CAP(プロトコル)では、HCIプロトコルで決めたデータ・パケット(HCI ACL データ・パケット)の構造の中を、さらに構造化しています。構造の中にまた構造を定義しているという訳です。これを模式的に、HCIプロトコルが下位で、L2CAP(プロトコル)がその上に乗っていると考えるのです。上図を参照すると、そのような図になっていることが分かります。さて、次に、図中のSDP(プロトコル)とRFCOMMプロトコルを見ると、L2CAP(プロトコル)の上に乗っかっています。これが意味するところは、SDP(プロトコル)とRFCOMMプロトコルでは、L2CAP データ・パケットの中身(L2CAPデータ列)がさらに構造化されているということです。