Bluetooth Low Energyの接続(★)

ここでは、セントラル機器とペリフェラル機器の、接続、切断について説明します。


接続

ペリフェラルの機器がビーコンを出している状態で、セントラルの機器が接続に行くことで、セントラルがマスターになり、ペリフェラルがスレーブになります。

このとき、アドバータイズチャネルからデータチャネルに移動します。
接続が確立されると、マスター側のタイミングで定期的にパケットを出し、それにスレーブが応答するというやり取りが切断されるまで続きます。マスター側は、送る内容が無い場合であっても、空のパケット(Empty Packet)を送ります。応答するスレーブ側も同様で、送る内容が無い場合であっても、空のパケット(Empty Packet)を送ります。

1つのセントラルは複数のペリフェラルと接続することができます。Bluetooth Low Energyの仕様としては、1つのセントラルは、無限の数のペリフェラルと接続が可能です。Classic Bluetoothでは、7台に制限されていましたが、そのような制限はありません。また、ペリフェラルとしては、1つのセントラルにしか接続できません(複数の相手では受信のタイミングが重なったら通信できなくなるため)。
実際には、Bluetooth Low Energyの半導体のメモリや処理速度の制限があり、1つのセントラルは、ペリフェラル8台までなどの仕様になっています。


Connection Event

データチャネルに移ると、マスターのタイミングで一定間隔でデータパケットを出していきますが、このタイミングをConnection Eventといいます。間隔のことをConnection Intervalといいます。値は、7.5ms〜4secの間で設定ができます(1.25ms単位)。
Connection Intervalは、マスターとスレーブで共有しています。
Connection Intervalごとに、送る内容が有る無しに関わらず、必ず通信しなければなりません。どちらかがデータパケットを送らない時間が続くと切断とみなされてしまいます。

Connection Intervalが短いと、反応速度は上がり、通信速度も上がりますが、消費電力が上がってしまいます。
Connection Intervalは長いと、反応速度が落ち、通信速度も落ちますが、消費電力は抑えられます。
利用するアプリケーションによって、決まってきます。ただし、このConnection Intervalパラメータは、通信中にも変更できますので、最初は高スループットで、途中から低消費電力にしたいという切り替えも可能です。

1回のConnection Eventで、どれくらいのデータパケットがやり取りされるかは、マスターによって決まってきます。Androidの場合ですと、1回のConnection Eventで6パケットのやり取りができます。このConnection Eventの間は、チャネルは変更してはいけない(ホッピングしてはいけない)ことになっており、同じチャネルですべてのデータパケットをやり取りします。

Bluetooth Low Energyの場合は、通信はマスターが主導していますので、スレーブからデータを送る場合であっても、マスターがConnection Eventでどれだけデータパケットを送ってくるかによって、スレーブ側からの通信容量が決まってしまいます。スレーブ側にどんなに処理能力があっても、マスターに依存してしまうのが、特徴です。


切断

切断には、明示的にTERMINATEパケットを送って切断するケースと、相手のデータパケットが届かないことにより自分の判断で切断するケースの2つがあります。
2つ目の切断ケースは、SuperVision Timeの間を待っても、相手のデータパケットが届かない場合に実施されます。SuperVision Timeはマスターとスレーブで接続時に共有されています。通常は、4secくらいに設定されています。
このケースが起こる原因は、相手のプログラムが停止した場合もありますし、相手との距離が遠くなってデータパケットを受信できなくなった場合もありますし、無線環境が悪くデータエラーが発生している場合などさまざまです。


再送

データパケットは、CRCによってパケットが正しいかのチェックをしています。データパケットが壊れていて、CRCが正しくない場合は再送をします。一般的な無線通信では再送回数に上限があるのですが、Bluetooth Low Energyは上限がありません。
そのため、Supervision Timeに達するまで、再送を続けます。それでもエラーの場合は切断となります。