这里有一些值得思考的内容:
只要您没有关闭Gatt,就可以尝试连接或发现它。因此,当我尝试为一台机器发现服务时,我通常会运行一个线程或可运行项来发出连接该机器的请求,持续一定时间。
首次尝试与机器建立连接将返回一个BluetoothGatt对象,稍后您可以使用该对象尝试发现BluetoothDevice对象的服务。建立连接似乎相当容易,但发现机器服务则更加困难。
mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
所以在我的线程/可运行程序中,我将检查BluetoothGatt是否为null。如果是,我将再次调用上面的代码行,否则我将尝试发现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对象。似乎在Android开始显示“无法连接到Gatt服务器”或其他类似信息之前,它可以处理五个BluetoothGatt对象。
对于我创建的每个BluetoothGatt,我都会调用close()方法,然后广播一个更新,说明连接已关闭。很多时候,当BluetootGatt断开连接时,它似乎不会响应状态更改。我的关闭BluetoothGatt的方法大致如下。我将该方法开放给Activity调用服务并断开连接,如果机器变得不响应且未调用断开状态。
public void disconnectGatt(BluetoothGatt gatt) {
if(gatt != null) {
gatt.close();
gatt = null;
}
broadcastUpdate(ACTION_STATE_CLOSED);
}
Close
意味着您将不再使用 Gatt 对象。 - Konstantin Konopko