2016/06/10

[android][ble]BLE接続する (1)

ようやくここまで来たか。。。

 

ベースとしている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 件のコメント:

コメントを投稿

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

注: コメントを投稿できるのは、このブログのメンバーだけです。