Bluetooth Low Energyのアドバータイズとスキャン(★)

アドバータイズとは、ペリフェラル機器が自分の情報を知らせるために、アドバータイズチャネルでパケットを送ることです。スキャンとは、セントラル機器が受信状態になり、周りにいるペリフェラル機器の情報を取得することす。

アドバータイズ

アドバータイズは、Advertising Eventごとに自分の機器の情報が入ったアドバータイズフレームを送信します。その間隔をAdvertising Intervalといい、20ms〜10,240msの間で調整できます(0.625ms単位)。
Advertising Intervalは長ければ長いほど、消費電力を抑えられ、電池の持ちは良くなりますが、相手がパケットを取り逃す確率が高くなったり、接続に時間がかかります。通常は、消費電力を抑え、すばやく接続できる、300msくらいに設定されています。

アドバータイズフレームは、3つのアドバータイズチャネル(37ch, 38ch, 39ch)に1つずつ送信していきます。そのため、相手がどのアドバータイズチャネルで受信していても、確実に伝わるようになっています。

ちなみに、同じAdvertising Intervalを持つ2つのペリフェラル装置が同じタイミングでフレームを送信すると、一生、フレームがぶつかりあってしまいます。そうならないように微妙にランダム時間ずらす決まりになっています。


スキャン

スキャンには、下記の2種類があります。

  • パッシブスキャン
  • アクティブスキャン

パッシブスキャンは、受信状態にして、周りのアドバータイズフレームを受信する方法です。アクティブスキャンは自らSCAN_REQフレームを送信して、SCAN_RSPフレームを受信する方法です。Bluetooth Low Energyで、一般的にスキャンといったら、パッシブスキャンのことをいいます。
Wi-Fiなども上記の2つのスキャンがありますが、Bluetooth Low Energyの場合は用途が異なります。
Bluetooth Low Energyの場合は、アドバタイズフレームでの情報は、31Byteしかないため、これ以上の情報を取得できません。そのため、追加の情報はアクティブスキャンにて取得できるSCAN_RSPフレームに入れることになっています。これにより、合計62Byteの情報を得ることができます。
アドバータイズしている機器は、アドバータイズが終わったらすぐにスリープに入ってしまうため、一般的には、SCAN_REQフレームは、アドバータイズフレームの直後に送信します。

アクティブスキャンでも、パッシブスキャンでも、スキャンを行っているとあっという間に電池がなくなってしまいます。スキャンを実施している機器は、常に受信状態にしておかなければならなのですが、それが10mAくらいかかります。そのため、容量220mAhのCR2032電池では、22時間しか電池がもちません。

また、アドバータイズしている側は、低消費電力で動作できますが、このSCAN_REQに対して、SCAN_RSPで応答してしまうと、消費電力が増えてしまいます。そうならないように、アドバータイズフレームに、Non-scannableの指定をし、SCAN_REQを受け付けない設定にすることもできます。世の中のスマートフォンは、SCAN_REQを大量に出してきますので、この設定をしておかないと、意図せずに電池が無くなってしまうなどの事態になりかねません。