2014-09 << 2014-10 >> 2014-11

2014-10-21 (火)

*BLEタグのボタンが押されたことをアプリから検出する

2014-10-10 の続き.BLEタグ→スマホへの通知を試しておきたかったので.

BSHSBTPT01BKの商品説明を読むと,ボタンを押すとiPhoneが鳴るそうです.iPhone持ってないのでわからないですが,おそらくBLEのNotifyをアプリで受け取っているのだと想像出来ます.消費電力から考えても,SPPでコネクション張って待ち受けてるなんてことは無いはず.

これをAndroidでもやりたいので,少し調べてみる.

BLEデバイスがどんな機能を持っているかは,GATT(Generic Attribute Profile)で調べられる.(iPhoneでもAndroidでもdiscoverServicesというメソッドが用意されている)

ServiceのUUIDが取得できるので,あとはUUIDからサービス探すときは,https://developer.bluetooth.org/gatt/services/Pages/ServicesHome.aspxをみると良い.

UUIDの最初の4バイトがServiceの種類を表している.

たとえば,BSHSBTPT01BKの例だと,

  • Generic Access(1800) デバイス名取得したり
  • Link Loss(1803) 接続が切れたときの挙動を設定する
  • Immediate Alert(1802) アラーム鳴らしたり
  • Tx Power(1804) BLEの送信のパワー
  • Battery Service(180f) バッテリーの状態

みたいなサービスがある.

あとは,Serviceスの下に,データをやり取りするCharacteristicsがぶら下がっている.

……そして,ボタンの状態を取れそうなサービスが無い.

GATTで取得できないサービスある可能性もあるけれど,iPhoneのCore Bluetooth APIでアプリ作ったりしてることを考えると,普通にCharacteristicsを見えるようにしておく気がする.

とりあえず,Notify受け取れそうなCharacteristicsが Battery Power State(00002a1a)くらいしか無いのでそいつに対して,setCharacteristicNotificationしたらNotifyが来た.

1バイト目に 0/1でボタンが押されてるかどうかが入ってる.2バイト目はよくわからず.

Androidだと,onCharacteristicChangedとかいうメソッド名だけど,値が変わっていなくてもデバイスからデータが来ればとりあえず呼ばれているように見える.

なぜPower State?と思ったけど,確かに,電源ボタンでもあるし,あっているような気もするけれど...?

ほかのBLEタグも同じな気がしないでもないので,これが普通なのかもしれない.

2014-09 << 2014-10 >> 2014-11