極力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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。