2016/07/17

[android]BLE接続の不安定さに迫る!の補足

結局のところ、前回は「Androidが一人で接続しようとして確立失敗しているようだ」という結論だった。
CONNECT_REQを出したつもりだけどうまく出せなかったとか、そういうことなのだろうか。


昨日のログで、いくつか気になっていることがあるので、補足しておこう。

 

まず、これ。

D/BluetoothGatt: cancelOpen()

もしかしたら、接続してからすぐ切断しているからこのログが出るのだろうか?

BluetoothGatt.java#750

単に、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はどういう意味なのだろう?

GattService.java#1445

clientConnect()もたくさんあるようだが、AIDLになっているのはisDirectがあるやつだけだ。
AIDLはプロセス間通信に関するもので、ActivityがServiceをbindしてコールバックしてもらったりするようだ。
LocalのServiceじゃないやつ、ということかな。

呼んでいるのは、BluetoothGattの中にあるmBluetoothGattCallbackBluetoothGatt#connect()だ。
後者は再接続用だから、今回は前者だろう。
前者の時は、単にautoConnectを反転してisDirectにしている。
ちなみに、再接続の時はfalseを指定している。
gattClientConnectNative()までつながるのだろうが、そこから先はよくわからん。


何か安定した接続になるようなヒントがないかと思ったが、ないな。

6 件のコメント:

  1. BluetoothGatt#connect()のコードですが、mService.clientConnectを呼ぶ時に、isDirect=falseで決め打ちされています。これがバグだを思っているのですが、どうでしょうか。コメントを読むに、!mAutoConnectとしようとしたけど間違えている気配がします。この影響で、全Bluetooth接続がAutoConnectとなり、途中で電波が途切れた場合は自動で再接続してしまします。意図的に切断する場合がうまく動作しません。

    返信削除
    返信
    1. おお、確かに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からしか使えないから、対応のしようがないですね。

      削除
  2. 私が見ているaospのリンクです。
    http://tools.oesf.biz/android-6.0.0_r1.0/xref/frameworks/base/core/java/android/bluetooth/BluetoothGatt.java#771

    返信削除
  3. 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 だけが出ています。

    返信削除
    返信
    1. 私、見るとこが間違ってました、済みません。。。
      mTransportは関係なかったですね。

      これは、falseのところを書き換えるか、connect()を使わないかしかなさそうですね。
      意識してなかったのですが、私はconnect()を使わないことで回避できていた模様です。

      削除
  4. BluetoothGatt#connect()は呼ばなくても接続できるんですね。
    BluetoothDevice#connectGatt()を呼べばよいみたいです。

    BluetoothGatt#connect()を呼ぶと、自動接続がオンにされてしまうようです。

    返信削除

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