拡張アドバタイズと互換性

bluetooth

現在レガシーアドバタイズに対応した機種を開発しているのですが、31バイトでは足りなくなってしまったので拡張アドバタイズを使用したいケースが発生しました。具体的にはアドバタイズのベンダー仕様部が40バイト必要です。これを実現するために調べたことをまとめます。

拡張アドバタイズとは

BLEの「拡張アドバタイズ」(Extended Advertising、Bluetooth 5.0以降で導入)は、従来の「レガシーアドバタイズ」(Legacy Advertising)よりも大きなデータ量をアドバタイズできたり、2M PHYCoded PHYといった新しい通信モードを使えたりする仕組みです。

拡張アドバタイズを使うと、アドバタイズデータ本体はセカンダリチャネル(例えば2M PHYやCoded PHY)で送られる設計になります。
一方、スマホがBluetooth 5.0未対応とか拡張アドバタイズ非対応だと、プライマリチャネル(1Mbps Legacyアドバタイズ)しかスキャンできないことがほとんどです。
拡張アドバタイズでは、プライマリチャネルには「Extended Advertising Indication」という最小限の情報(ポインタみたいなもの)だけが出され、本体のデータはセカンダリチャネルにあります。

レガシーアドバタイズとの互換性

拡張アドバタイズに対応していないスマートフォンが、拡張アドバタイズを使用してアドバタイズを出している機器のアドバタイズデータを受信できるのでしょうか。

結論としては、基本的には受信できない可能性が高いです。
特に、拡張アドバタイズのみを使っていて、レガシー互換のアドバタイズ(=1MbpsのLegacy PDUs)を出していない場合、スマホはアドバタイズ自体を検出できないか、極めて限定的な情報しか取得できません。

つまり、レガシーアドバタイズ互換のデータを送っていない限り、スマホは31バイトのデータも取得できません。スマホは拡張アドバタイズのインジケーションパケット(Extended Advertising Indication)を受け取れたとしても、中身(セカンダリの本体データ)にはアクセスでないということです。

ですので拡張アドバタイズ対応機器と非対応機器両方を考慮して、レガシーアドバタイズも併用して送るケースが多いです(互換性確保のため)。

拡張アドバタイズの利用

拡張アドバタイズを利用して、アドバタイズのベンダー仕様部を40バイトにするための方針は以下とします。

  • プライマリチャネル(1M PHY)に載せるデータは小さくてもい
  • さらに詳細データ(本体)はセカンダリチャネルに載せる
  • プライマリチャネルに載せるデータは、Extended Advertising Header + Optionally small payloadだけ

つまり、mustの情報だけプライマリに置いて、wantの情報はセカンダリに逃すという設計です。

注意点として、

プライマリに載せるアドバタイズデータ量の制限
プライマリはExtended Advertising Packet(ADV_EXT_IND)を使いますが、これにも一応サイズ制限があり、通常最大で31バイト以内です

スマホ側の互換性:
もし古いスマホ(拡張アドバタイズ非対応)がスキャンした場合、セカンダリの存在に気づけず、
プライマリだけを見てmustの情報だけ受け取る形になる

などが考えられますが、mustの情報が10バイト、wantの情報が30バイトとする場合のざっくり設計は以下のとおりです。

プライマリチャネル(1M PHY)

  • ADV_EXT_IND
  • 10バイトのアドバタイズデータ(たとえば会社ID+バージョン情報など最重要なもの)

セカンダリチャネル(1M PHYまたは2M PHY、またはCoded PHY)

  • 残り30バイトのアドバタイズデータ

ちょっと気になるのは、古いスマホでOSがADV_EXT_IND(プライマリチャネル)をちゃんと解釈して、アプリがプライマリチャネルのデータを受け取れるかというところです。

まとめ

レガシーアドバタイズに対応した機種のアドバタイズデータを、互換性に注意して拡張アドバタイズに対応する方法についてまとめました。

レガシーアドバタイズじゃデータサイズが足りないから拡張アドバタイズにしよう!古いスマホ?知らねーよ!と言いたい気持ちをぐっとこらえて、技術者以外(企画、デザイン担当者など)の関係者に「そんなこともできるの!?それいいね!」と言ってもらえる説明をしたいと思います。

コメント

タイトルとURLをコピーしました