2016/06/02

[android]BLEデバイスを指定せずに接続するのは無理だ

極力Bluetooth Developer StudioのAndroid Clientで生成されたソースファイルを使って、とりあえずBLEのスキャンだけ行えるようにした。

hirokuma/AndroidTwoSpinners at c3993a58d49eafd8b213014e4f4566f41509cd02

namespaceがcom.blogpost.hiro99maの直下だが、そこはいずれ整理しよう。
どうでもよいが、Package名はこのブログのURLとはちょっと違っている。
blogspotではなく、blogpostだ。
Bloggerに移動してから初めてAndroidアプリを作るときに打ち間違えて以来、そのままにしている。
合わせた方がよいのかな?

まだScanした結果は、デバイス名をlogcatに出力させるだけになっている。
タイムアウトも作っていないので、ひたすらスキャンしまくるので、電池の持ちは悪いだろう。

 

それはともかくとして、私はこれからどうするつもりなのだろう?
ペアリングしているわけでもないから、誰かを選んで接続しなくてはならない。
が、ListViewみたいなものもないので、選択することができないのだ。
最初に見つかったデバイスを接続する、だと、あまりにも狂犬過ぎると思う。

なので、もっとエレガントな方法がいるのだけど、そうなるとデバイス名の一覧を作ってユーザに選んでもらうしかない。
一覧を出すとなると、画像があるわけでもないので、リストになるだろう。
そしたら、ListView形式になるのは必然であった。。。

 

まあ百歩譲って、Peripheralを自分で作り、サービスも独自で、サービスのUUIDもAdvertisingしていて、それでフィルタし、デバイスが1台しかないのがわかっていれば、最初に見つけたデバイスに接続する、でもよいかもしれない。

その場合は、ScanFilterFactory.javaにフィルタする設定を実装することになる。
BDSで、GAPの設定にデバイス名を記載すると、自動的にデバイス名でフィルタするようになるのだ。
ScanFilterを使っているだけなので、そこの書き方を変更すれば、他のフィルタ方法も可能だと思う。
フィルタできるのは、以下だ。

  • フィルタ無し
  • デバイス名
  • デバイスアドレス
  • Manufacturer Data
  • Service Data
  • Service UUID

使い方はテストアプリを見るのがよさそうだ。

 

Advertisingするデータは、本編とScanRspをそれぞれ使ったとしても31バイト×2なので、そんなにたくさんのデータを入れることができない。
最近は、DeviceNameと128bitのService UUIDを流すのがよいかな、と思っている。
大きい会社だったら16bitのUUIDも取得できるかもしれないけど、うちは無理だからManufacturer Dataは使えないし。

IncompleteとCompleteのどっちがよいかと言われると、よくわからん。
Generic Accessみたいな標準サービスは載せなくてもいいような気がするが、「完全」を問われると自信がなくなる。
厳密さを問われるものでもない気がするので、メインのサービスが1つだけであればCompleteでいいんじゃないの?と個人的には思っている。
どうせ独自だから、相互接続性などきにしなくていいしね。

 

話がいろいろ脱線したが、ペアリングしてなくて特定できない機器の場合は、一覧を出してユーザに選ばせるのが一番よさそうだ、というお話でした。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。