Open2

Bluetooth LE のアドレスタイプを判別する

okuokuokuoku

Bluetooth LEのデバイスがアドバタイズしているとき、そのアドレス(AdvA)には4種類ある:

  • RPA: resolvable private address
  • NRPA: non-resolvable private address
  • static address
  • パブリックアドレス

最初の3つはランダムアドレスで、適当なタイミングで再生成される。RPAはbondingして鍵を交換しておけば、それを使って対象のアドレスが変化しても追跡が可能になっている(アドレスがシードとハッシュになっている)。

https://academy.nordicsemi.com/courses/bluetooth-low-energy-fundamentals/lessons/lesson-2-bluetooth-le-advertising/topic/bluetooth-address/

... で、ここまでの話と "アドレスの上位ビットで判別できる" という話自体は検索すれば0.5秒で出るわけだけど、実際の文字列からアドレス種別を判別する方法の解説がなぜか無い気がする。

okuokuokuoku

Zephyrのコード

NordicのBluetoothデバイス等でRTOSとして使用されているZephyrのコードにこの辺の実装がある。

アドレスの文字列変換

https://github.com/zephyrproject-rtos/zephyr/blob/0f8b7b74438e7eef09c4e698d3b4cc0e2494b193/include/zephyr/bluetooth/addr.h#L242-L268

メモリ上の最終バイトである val[5] が最初に表示されていることに注意する。

判別

https://github.com/zephyrproject-rtos/zephyr/blob/0f8b7b74438e7eef09c4e698d3b4cc0e2494b193/include/zephyr/bluetooth/addr.h#L142-L148

val[5] の上位ビットで判別している。つまり、文字列なら最初に表記されたバイトの最上位ビットで判別できるということになる。