結局のところ、前回は「Androidが一人で接続しようとして確立失敗しているようだ」という結論だった。
CONNECT_REQを出したつもりだけどうまく出せなかったとか、そういうことなのだろうか。
昨日のログで、いくつか気になっていることがあるので、補足しておこう。
まず、これ。
D/BluetoothGatt: cancelOpen()
もしかしたら、接続してからすぐ切断しているからこのログが出るのだろうか?
単に、BluetoothGatt#disconnect()のトレースログが出ているだけだった。
最初はそういうAPI名だったのかもね。
次は、これ。
W/bt_btif: bta_gattc_conn_cback()
不審はないのだけど、なんだろう?
system/bt/bta/gatt/bta_gattc_act.c#1808
ここはsystemなんだ。
gattcなので、Client側ということか。
接続/切断関連のコールバック関数のようで、reasonが0以外であれば出力されている。
接続時には理由がないだろうが、切断時はだいたい理由があるから、切断時にしか出ないのかな。
最後に、これ。
D/BtGatt.GattService: clientConnect()
isDirectはどういう意味なのだろう?
clientConnect()もたくさんあるようだが、AIDLになっているのはisDirectがあるやつだけだ。
AIDLはプロセス間通信に関するもので、ActivityがServiceをbindしてコールバックしてもらったりするようだ。
LocalのServiceじゃないやつ、ということかな。
呼んでいるのは、BluetoothGattの中にあるmBluetoothGattCallbackとBluetoothGatt#connect()だ。
後者は再接続用だから、今回は前者だろう。
前者の時は、単にautoConnectを反転してisDirectにしている。
ちなみに、再接続の時はfalseを指定している。
gattClientConnectNative()までつながるのだろうが、そこから先はよくわからん。
何か安定した接続になるようなヒントがないかと思ったが、ないな。
BluetoothGatt#connect()のコードですが、mService.clientConnectを呼ぶ時に、isDirect=falseで決め打ちされています。これがバグだを思っているのですが、どうでしょうか。コメントを読むに、!mAutoConnectとしようとしたけど間違えている気配がします。この影響で、全Bluetooth接続がAutoConnectとなり、途中で電波が途切れた場合は自動で再接続してしまします。意図的に切断する場合がうまく動作しません。
返信削除おお、確かにmAutoConnectがあるのに、胡散臭いですね。。。
削除mTransportはBluetoothDevice#connectGatt()のtransportみたいだから、TRANSPORT_AUTOが0。
https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context,%20boolean,%20android.bluetooth.BluetoothGattCallback,%20int)
でも、BR/EDRかLEの見分けをする「AUTO」だから、やっぱり意味なさそうですね。
TRANSPORT_LEを指定すると再接続しなくなるかも。。。
けど、API23からしか使えないから、対応のしようがないですね。
私が見ているaospのリンクです。
返信削除http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/bluetooth/BluetoothGatt.java#771
connectGatt() の transportがない方は、API18から使えますね。
返信削除https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context,%20boolean,%20android.bluetooth.BluetoothGattCallback)
ここのautoConnectは、切断時に自動で再接続にいくかどうかだと思います。
BluetoothGatt#connect()をmAutoConnectを参照するようにして、framework.jarを入れ替えると期待どおりの動作をしました。autoConnect=falseで接続したのち、ペリフェラルから切断しても、Androidからは再接続しませんでした。BTIF BTAのログをみても、isDirect=1 だけが出ています。
私、見るとこが間違ってました、済みません。。。
削除mTransportは関係なかったですね。
これは、falseのところを書き換えるか、connect()を使わないかしかなさそうですね。
意識してなかったのですが、私はconnect()を使わないことで回避できていた模様です。
BluetoothGatt#connect()は呼ばなくても接続できるんですね。
返信削除BluetoothDevice#connectGatt()を呼べばよいみたいです。
BluetoothGatt#connect()を呼ぶと、自動接続がオンにされてしまうようです。