ist etwas zum Nachdenken:
Solange Sie nicht in der Nähe auf der Gatt genannt, können Sie immer noch versuchen, eine Verbindung herzustellen oder zu entdecken. Wenn ich also versuche, Dienste für eine Maschine zu finden, führe ich normalerweise einen Thread oder eine ausführbare Datei aus, die die Anfrage stellt, sich für eine bestimmte Zeit mit der Maschine zu verbinden.
Beim ersten Versuch mit einer Computerverbindung wird ein BluetoothGatt-Objekt zurückgegeben, mit dem Sie später versuchen können, die Dienste für das BluetoothDevice-Objekt zu ermitteln. Es scheint ziemlich einfach zu sein, sich zu verbinden, aber es ist viel schwieriger, die Maschinen zu finden.
mBluetoothGatt = machine.getDevice().connectGatt(this, false, mGattCallback);
Also in meinem Thread/runnable, werde ich überprüfen, um zu sehen, ob die BluetoothGatt null ist. Wenn dies der Fall ist, rufe ich die obige Codezeile erneut an, sonst werde ich versuchen, die BluetoothGatt-Dienste als solche zu entdecken.
mBluetoothGatt.discoverServices();
Oh, und ich IMMER sicher, dass BluetoothAdapter.cancelDiscovery() vor jedem Versuch, rufen bei Verbindung des Service zu entdecken.
mBluetoothAdapter.cancelDiscovery();
Hier ist eine Methode in meinem runnable etc verbinden zu verwenden ist:
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();
}
Schließlich stellen Sie sicher, dass Sie alle BluetoothGatt Objekte in der Nähe aus, die Sie angeschlossen haben. Es scheint, dass Android fünf BluetoothGatt-Objekte verwalten kann, bevor es anfängt zu sagen, dass "keine Verbindung zum Gatt-Server hergestellt werden kann" oder etwas Ähnliches.
Auf jedem BluetoothGatt, das ich erstelle, werde ich nah darauf anrufen und dann ein Update senden, das besagt, dass die Verbindung geschlossen ist.Es scheint, dass es viele Zeiten gibt, in denen der BluetootGatt nicht mit einer Statusänderung reagiert, wenn die Verbindung getrennt wird. Meine Methode, das BluetoothGatt zu schließen, sieht ungefähr so aus. Ich lasse die Methode offen, damit die Aktivität den Service aufruft und die Verbindung trennt, wenn eine Maschine nicht mehr reagiert und der Status der Trennung nicht aufgerufen wird.
public void disconnectGatt(BluetoothGatt gatt) {
if(gatt != null) {
gatt.close();
gatt = null;
}
broadcastUpdate(ACTION_STATE_CLOSED);
}
Ich denke, 'Close' heißt, dass Sie nicht mehr Gatt –