HCI (Bluetooth)
読み:エイチスィーアイ
外語:HCI: Host Controller Interface

 Bluetoothにおいて、コントローラーとホストの間で使われる通信プロトコル
目次

概要
 Bluetoothモジュールを制御したり、データを無線で送受信するために使う、一番最下層のインターフェイスである。
 有線でも例えばEthernetならEthernetコントローラーICなどを使い、その上にEthernetのプロトコルから上を実装することになるが、Bluetoothのような無線でも同様にハードウェアとソフトウェアの分担があり、その境界となるのがHCIである。
 HCIで使用する物理層は、Bluetoothチップとホストの都合に合わせて選択されるため、様々なものがある。
 UARTUSBなどが使われることが多いようで、規格上このレイヤーをHCI Transportレイヤーという。UARTの場合、速度は実装依存だが、いわゆるRS-232Cで、データ長8ビット・ストップビット1ビット・パリティチェックなしの「N81」で、フロー制御はS制御というのが一般的のようである。
 数値データはリトルエンディアンで表現されている。

特徴

種類
 フレームは4種類存在する。

コマンドとイベント
 ホストがBluetoothを使うためには、Bluetoothコントローラーに対してHCIコマンドを発行する。
 コントローラーは順次コマンドを実行するが、同時に複数のコマンドを実行でき、さらにコマンドの処理時間はコマンドごとに違う。したがって、コマンドを送った順に処理が完了するわけではない。
 そこで、コマンドの終了通知はイベントとして発行される。

トランスポート層

HCI UARTトランスポートレイヤー
 UARTの場合、フレームの種類を表わすオクテットがあり、続いて実際のデータがある。
 indicatorは、フレームの種類(4種類)に応じて、次のように定義されている。
 HCI packet部の詳細なフォーマットは後述されるが、例えばコマンドをモジュールに送る時は、まず0x01をUARTに送り、次いで16ビットのOpcodeを送り、さらにLength、そしてParameter、という形式になる。

HCI USBトランスポートレイヤー
 USBの場合、フレームの種類はエンドポイントアドレスで表わす。
 エンドポイントアドレスは、フレームの種類に応じて、次のように定義されている。
 ACLデータは、USBのバルク転送に対応する。また他に、0x83/0x03を使うアイソクロナス転送も定義されている。

フレームの構造

0x01 HCIコマンド

0x02 ACLデータ

0x03 SCOデータ

0x04 HCIイベント

再検索