ようやくここまで来たか。。。
ベースとしているBluetooth Developer StudioのAndroid Clientプラグインでは、一覧を表示するActivityとBLE操作をするActivityが別になっている。
その際、BLE操作するActivityに渡しているのは、以下。
- デバイス名
- デバイスアドレス
これだけなのだ。
BluetoothDeviceの中身をまるまる渡すようなことをしているのかと思ったが、そうではないのだな。
そして、接続時にやっているのは、これ。
BleAdapterService mBluetoothLeService;
mBluetoothLeService = ((BleAdapterService.LocalBinder)service).getService();
mBluetoothLeService.connect(mDeviceAddress);
まとめて書いたけど、実際はServiceConnectionというサービスをnewしてoverrideしたonServiceConnected()の中でmBluetoothLeServiceを取得して、接続ボタンを押したonConnect()の中でBleAdapterServiceのconnect()を呼んでいる。
このconnect()はプラグインが提供しているBleAdapterServiceクラスが持っている。
他にもBleAdapterServiceは便利そうな関数を持っているから、これを使うとよいのだろう。
考えることはいろいろあるが、まずは接続だけしてみる。
よくわからないが、connect()にはBleAdapterServiceがいるので、関係するものをBDSサンプルから持ってきた。
ActivityのonCreate()あたりでbindService()するようだ。
AndroidのServiceは、バックグラウンドで動いてくれるしくみらしい。
はじめ方としてstartService()とbindService()の2種類あるらしいが、元のまねをしてbindService()にする。
bindService()するのに、ServiceConnectionのインスタンスがいる。
これもよくわからんが、ServiceConnectionのインスタンスを作るときにoverrideするonServiceConnected()でBleAdapterServiceを取ってきている。
これだけ書いて動かしたのだが、onServiceConnected()が呼ばれない。。。
さんざん悩んだが、単にAndroidManifest.xmlに<service>を書いてやらんといかん、というだけだった。
エディタで「<service」くらいまで書くと、候補で勝手にクラス名まで選んでくれた。
そこまでできるんだったら、サービスの定義が入ってないのを指摘してくれたらよかったのに(ログは見てないけど)。
ともかく、これでmBluetoothLeServiceに中身が入った。
あとは、mBluetoothLeService.connect()にデバイスアドレスを付けて呼ぶだけだ。
前回作ったコールバック関数というかListenerではBluetoothDeviceを渡しているので、問題なく呼べる。
うん、接続できた。
スニファで見ても、Advertisingが止まった。
ここまでのソースは、こちら。
うーん、BLE接続できたのに、感動が薄い。
単にBLE機器を接続しただけだからと言われればそれまでだが、一覧を出して選択するまでで感情を使い切ってしまったのだろう。
加工したい人向けにはこういうやり方でよいとして、BLE Peripheralの選択くらいまではOSが吸収してくれんかのぅ。
せっかく設定アプリがあるのだから、接続した後だけやりたいのだが。
と、ごちゃごちゃ書いたが、BLE接続だけしておしまい、というわけにはいかんだろう。
Characteristicへのアクセスもあるし、Notification/Indicationの取得もある。
それに、よくわかってないServiceもある。
Android開発に終わりはないのだ!というわけで、次はCharacteristicなどを見ていきましょうかね。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。