2016-10-20 20 views
2

私の目標は、Bluetooth Low Energyデバイスと電話機との自動接続を実現することです。私は、サンプルコードに続いて、私は上記のコードはfalseがautoconnectionするために使用することを意味ラインBLEのconnectGattにautoConnectの正しいフラグはありますか?

// We want to directly connect to the device, so we are setting the autoConnect parameter to false. 
mBluetoothGatt = device.connectGatt(this, false, mGattCallback); 

を発見しました。しかし、私はhereでAPIを見つけ、それが

BluetoothGatt connectGatt(コンテキストコンテキスト、ブール自動接続、BluetoothGattCallbackコールバック、int型の輸送) 接続GATTへServerがこのデバイスによってホストされていると述べました。

そして、私はまた、二つのフラグ試してみました:truefalse、とだけtrueが仕事です。私はバージョン> = Android 5.0を使用しています。コードとAPIの間に矛盾がありますか?どの旗が正しいですか?自動接続をしたい場合は、何かメモが必要ですか?あなたがfalseに自動接続パラメータを設定する場合は、「直接接続」を取得するよう

これは、「直接接続」私のコード

public boolean connect(final String address) { 
    if (mBluetoothAdapter == null || address == null) { 
     Log.w(TAG, "BluetoothAdapter not initialized or unspecified address."); 
     return false; 
    } 

    // Previously connected device. Try to reconnect. 
    if (mBluetoothDeviceAddress != null && address.equals(mBluetoothDeviceAddress) 
      && mBluetoothGatt != null) { 
     Log.d(TAG, "Trying to use an existing mBluetoothGatt for connection."); 
     if (mBluetoothGatt.connect()) { 
      mConnectionState = STATE_CONNECTING; 
      return true; 
     } else { 
      return false; 
     } 
    } 

    final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address); 
    if (device == null) { 
     Log.w(TAG, "Device not found. Unable to connect."); 
     return false; 
    } 
    // We want to directly connect to the device, so we are setting the autoConnect 
    // parameter to false. 
    mBluetoothGatt = device.connectGatt(this, true, mGattCallback); 
    Log.d(TAG, "Trying to create a new connection."); 
    mBluetoothDeviceAddress = address; 
    mConnectionState = STATE_CONNECTING; 
    return true; 
} 

答えて

13

では、「自動接続」と反対です。 "mBluetoothGatt.connect()"を実行すると自動接続も使用されることに注意してください。

https://code.google.com/p/android/issues/detail?id=69834に注意してください。これはAndroidの古いバージョンに影響するバグで、自動接続を直接接続にする可能性があります。これは、リフレクションを使用して回避することができます。

ダイレクトと自動接続の間にいくつかの非文書化の違いがあります。

直接接続は、30秒のタイムアウトとの接続の試みです。ダイレクトコネクトの進行中に現在のすべての自動接続を中断します。すでにダイレクトコネクトが保留されている場合は、直前のダイレクトコネクトはすぐに実行されず、キューに入れられ、前のダイレクトコネクションが終了すると開始されます。

自動接続では、複数の保留中の接続を同時に持つことができます。明示的に中断されるまで、またはBluetoothがオフになるまで、タイムアウトすることはありません。

自動接続で接続が確立された場合、手動でdisconnect()またはclose()を呼び出すまで、接続が切断されると、Androidは自動的にリモートデバイスに再接続しようとします。直接接続の切断によって接続が確立されると、リモートデバイスに再接続しようとしません。

ダイレクトコネクトは、オートコネクトよりも高い任務で異なるスキャン間隔とスキャンウィンドウを持ちます。つまり、リモートデバイスの接続可能な広告を聞くためにより多くの無線時間を費やします。

+0

これは、自動接続の動作に関する有用な情報です。あなたはそれについてのリファレンスを持っていますか? [connectGatt docs](https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#connectGatt(android.content.Context、%20boolean、%20andandroid.bluetooth.BluetoothGattCallback))はあまり気にしません詳細については、私はこれまでのところ、Androidソースコード( 'BluetoothGatt.java'は' .aidl'ファイルに由来する 'IBluetoothGatt'に' clientConnect'を呼び出していますが、何も見つかりませんでしたこれをまだ実装しています) – m01

+1

これは、接続コマンドがかなり多くのレイヤーを通過していることを示しています。 https://android.googlesource.com/platform/system/bt/+/master/stack/gatt/gatt_api.ccでGATT_Connectをチェックすることができます。以下は、aidlインターフェースのもう一方の端です:https://android.googlesource.com/platform/packages/apps/Bluetooth/+/dbaf9cd/src/com/android/bluetooth/gatt/GattService.java – Emil

関連する問題