Android蓝牙低功耗API实现了一种连接设备connectGatt()
的方法,但有两种方法可以关闭连接disconnect()
和close()
。
文档说:
disconnect()
:断开已建立的连接,或取消连接尝试
目前正在进行中。
close()
:应用程序应在完成后尽早调用此方法
这个GATT客户。
BluetoothGatt.java的源代码显示close()取消注册应用程序,disconnect()断开客户端连接。然而,它没有说明实际意味着什么。我的意思是,如果只有一种方法可以连接到客户端,为什么有两种方法可以关闭/断开连接?
答案 0 :(得分:57)
使用disconnect()
,您可以稍后致电connect()
并继续该周期。
致电close()
后,您就完成了。如果您想再次连接,则需要再次致电connectGatt()
上的BluetoothDevice
; close()
将释放BluetoothGatt
所持有的所有资源。
答案 1 :(得分:12)
这是一些值得深思的问题:
只要你没有在Gatt上打电话,你仍然可以尝试连接它或发现。因此,当我尝试为机器发现服务时,我通常会运行一个线程或runnable,使请求连接到机器一段时间。
首次尝试使用机器连接,将返回一个BluetoothGatt对象,您可以在以后使用该对象尝试发现BluetoothDevice对象的服务。它似乎很容易连接,但更难发现机器服务。
mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
所以在我的线程/ runnable中,我将检查BluetoothGatt是否为空。如果是,我将再次调用上面的代码行,否则我将尝试发现BluetoothGatt服务。
mBluetoothGatt.discoverServices();
哦,我总是确保在尝试连接发现服务之前调用BluetoothAdapter.cancelDiscovery()。
mBluetoothAdapter.cancelDiscovery();
这是一个方法用于连接我的runnable等:
public void connectToMachineService(BLEMachine machine) {
Log.i(SERVICE_NAME, "ATTEMPTING TO CONNECT TO machine.getDevice().getName());
mBluetoothAdapter.cancelDiscovery();
if(mBluetoothGatt == null)
mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
else
mBluetoothGatt.discoverServices();
}
最后,请确保关闭所有已连接的BluetoothGatt对象。在开始说“无法连接到Gatt服务器”或其他类似的东西之前,Android似乎可以处理五个BluetoothGatt对象。
在我创建的每个BluetoothGatt上,我将关闭它,然后广播更新,说明连接已关闭。似乎有很多次BluetootGatt在断开连接时不会响应状态变化。我关闭BluetoothGatt的方法是这样的。我让方法打开,让Activity调用服务,如果机器没有响应并且没有调用断开状态,则断开连接。
public void disconnectGatt(BluetoothGatt gatt) {
if(gatt != null) {
gatt.close();
gatt = null;
}
broadcastUpdate(ACTION_STATE_CLOSED);
}