Controller層(続き)
接続開始
Scanが終わると、ScannerはInitiatorとなります。 InitiatorはAdvertiserから再度Advertisingパケットを受信したタイミングで、これに返信する形で接続要求をAdvertiserに送ります。
接続後はInitiatorがMasterに、AdvertiserがSlaveとなり、Master側が通信の主導権を得ます。以降、マスターとスレーブは一定の間隔を置いて送受信を繰り返すことでデータをやり取りします。
図中にいくつか示されているパラメータは、Initiatorの接続要求(CONNECT_REQ)によって決められます。 CONNECT_REQには次表の内容が含まれます。
| パラメータ | 意味 |
|---|---|
|
AA (Access Address) |
接続後のアクセスアドレス |
| CRCInit | CRC[2]チェックサム計算の初期値 |
|
WinSize (transmitWindowSize) |
1.25ミリ秒単位の送信ウインドウサイズ |
|
WinOffset (transmitWindowOffsetvalue) |
1.25ミリ秒単位の送信ウインドウオフセット |
|
Interval (connInterval) |
データパケットをやり取りする周期。1.25ミリ秒単位で、7.5ミリ秒以上4.0秒以下 |
|
Latency (connSlaveLatency) |
スレーブがマスターの接続要求を無視できる回数。値の範囲は0 ~ 499 |
|
Timeout (connSupervisionTimeout) |
接続を確認できない時間がこの値を超えたとき、接続が中断したと判断する |
| ChM | チャンネルマップ。データチャンネル(0 ~ 36)のうち使用するものをビットの1/0で表す |
| Hop | 37個のデータチャンネルをこの値ずつずらして切り替える。値は5 ~ 16の範囲でランダムに決められる |
| SCA | マスターのスリープクロックの精度。スレーブが受信タイミングを同期する際に、この分だけ前倒しで動作を開始する |
省電力を考えるために、connIntervalとconnSlaveLatencyの設定は特に重要です。スレーブはconnIntervalの周期に合わせて受信回路を動かします。この間隔が短いほど高頻度で通信できますが、電力消費は大きくなります。
また、スレーブは自身に返送できるデータを持っていない場合にconnSlaveLatencyの回数だけマスタの要求を無視できます。無視している間は受信回路を動かさなくて済むため、スレーブの電力消費を大幅に小さくできます。
connSlaveLatencyによって、実質的な接続間隔はconnIntervalの(connSlaveLatency+1)倍になります。これをEffective Connection Interval(実効接続インターバル)といい、connSupervisionTimeoutの半分以下にする必要があります。
注
[2]: 巡回冗長検査。誤り検出符号の一種で、主にデータ転送などに伴う偶発的な誤りの検出によく使われている(Wikipediaより抜粋)。
接続確立後の通信
接続開始後はData Channel(0~36チャンネル)を用いてパケットをやり取りします。
Data Channelパケットの種類
Data Channelのパケットには次の3種類があります。
- LL Data PDU (Continuation)
- LL Data PDU (Start)
- LL Control PDU
LL Data PDUは上位層で必要となるデータを複数のパケット分割したものです。 連続するパケットのうち最初のものがStartで、残りはすべてContinuationです。
また、LL Control PDUは通信の状態を制御するために用いられます。 接続開始時にCONNECT_REQで設定した内容の更新や、エラー通知、暗号に関するものがあります。
パケット再送の仕組み
BLEでは信頼性のある通信のために各パケットにSN(Sequence Number)、NESN(Next Expected Sequence Number) という2つの値を持っています。SNとNESNは、それぞれ自分が送信するパケットのシーケンス番号と相手に次に送ってほしいパケットのシーケンス番号を表します。
例えば、マスターがSN=0のパケットをスレーブに送ったとします。スレーブはこのパケットを受信し、問題がなければ次のパケットを要求するためにNESN=1のパケットをマスターに送信します。マスターはこれを見て先ほど送信したSN=0のパケットがスレーブに届いたことを確認し、次はSN=1のパケットを送信します。
もし、スレーブが受信したパケットにビットエラーがあれば、スレーブはNESN=0のパケットを送信し、マスターにパケットの再送を要求します。同じ仕組みはフロー制御にも使えます。もしスレーブの処理が追いつかずバッファがあふれそうなときも同様に、NESN=0のパケットをマスターに送信することができます。
* * *
今回はBLE解説の前編として、BLEの概要と層状アーキテクチャのうちControllerについて解説しました。 次回は、Host層とApplication層について解説します。 お楽しみに。
