2017-08-07 74 views
1

Android BLE APIが奇妙に思えるかもしれません。私がする必要があるのは、BLEデバイスに接続することです。一時的に接続が切断されている間は一時的に切断されますが、ユーザーが新しい何かをしたいときは、再接続します。最初に接続するにはAndroid BLE(Bluetooth Low Energy)接続/切断/再接続

は、私が呼ん:

Gatt1 = Device.ConnectGatt (Android.App.Application.Context, false, GattCallback); 

その後、私は私が

Gatt1.Disconnect(); 

呼び出す私の一時的な切断を行うことを考えていると私は再接続したいときに、私はConnectGattを呼び出します()再び、私に新しいBluetoothGattオブジェクト与える:私はGatt1.Disconnect(と呼ばれてきましたので、一度

Gatt2 = Device.ConnectGatt (Android.App.Application.Context, false, GattCallback); 

)を、私がすべきちょうどGatt1を捨てる?私が再接続すると新しいBluetoothGattオブジェクトが得られるので、これはもう役に立ちませんか? Gatt1をもう使用していないことをAPIに伝えるために関数を呼び出す必要がありますか?私は最終的に私が完全に終わりだことを決めた

(いいえ、私は実際に私がちょうど起こって2つの異なるオブジェクトがありますを示すために、それらの名前を使用している、二つの変数、Gatt1とGatt2を持っていないでしょう)

このBLEデバイスでは、私は再接続を予定していないので、Gatt.Close()(右)に電話する必要があります

多分このコードはもっと似ていますか?

BluetoothDevice Device = stuff(); 
BluetoothGatt Gatt = null; 

if (connecting) 
    Gatt = Device.ConnectGatt(...); 
else if (disconnecting temporarily) 
    Gatt.Disconnect(); 
else if (reconnecting after a temporary disconnection) 
{ 
    Gatt = null; // Yes? Do I need to specifically Dispose() this previous object? 
    Gatt = Device.ConnectGatt(...); 
} 
else if (disconnecting permanently) 
{ 
    Gatt.Close(); 
    Gatt = null; 
} 

(再び、いや、私はこのような関数を記述しないだろう、それだけで、様々なBluetoothGattオブジェクトの寿命を説明するためにだ)

+0

一度に1つのデバイスに接続する場合、なぜ2つのgattオブジェクトが必要か質問できますか? – Avinash4551

+0

私はしません。最初はBluetoothGatt.Connect()関数が表示されませんでしたので、BluetoothDevice.ConnectGatt()を2回目に呼び出して2番目のBluetoothGattオブジェクトを生成する必要があると考えました。私は今それが必要でないことを見る。 –

答えて

0
Gatt1 = Device.ConnectGatt (Android.App.Application.Context, false, GattCallback); 

が続いする必要があります。

Gatt1.connect(); 

Gatt1.disconnect()は目的に合っています。再接続すると、Gatt1 = nullは不要です。もう一度device.connectGatt()とGatt1.connect()を呼び出してください。あなたが完全に終わったら:

if(Gatt1!=null) { 
    Gatt1.disconnect(); 
    Gatt1.close(); 
} 
+0

私のテストでは、ConnectGatt()とconnect()の両方は必要ありません。 –

+0

@BettyCrokkerああ、私の悪い。再接続時にConnect()を使用してください。 –

0

をあなたは、あなたがそれに近い()メソッドを呼び出すことによって、それが終わったときにも、最初のBluetoothGattオブジェクト(Gatt1)を処分する必要があります。ちょうどそれをクリーニングするためにガベージコレクションを残して私はそれをクリーニングするために内部のBluetoothスタックを呼び出すファイナライザがないと思います。オブジェクトを閉じずに参照を削除すると、最終的にBluetoothGattオブジェクトが使い果たされます(すべてのアプリケーションで最大32のデバイスが完全に使用できます)。これらの提案を読んだ後

0

、およびいくつかのより多くの研究をやって、私は答えはこれですと思う:

BluetoothDevice Device = stuff(); 
BluetoothGatt Gatt = null; 

if (connecting) 
    Gatt = Device.ConnectGatt(...); 
else if (disconnecting temporarily) 
    Gatt.Disconnect(); 
else if (reconnecting after a temporary disconnection) 
    Gatt.Connect(); 
else if (disconnecting permanently) 
{ 
    Gatt.Disconnect(); 
    Gatt.Close(); 
    Gatt = null; 
} 

終了するの接続/切断アクションを待つために追加のコードの束と。

関連する問題