Android BLE: onServicesDiscovered wird auf Nexus 5 oder Samsung Note 3 niemals ausgelöst

Ich entwickle eine Android-App, die eine Verbindung zu einem benutzerdefinierten Bluetooth-Gerät herstellt. Eine Reihe von Beiträgen war sehr hilfreich (z. B.diese unddiese), aber ich habe ein Problem, das von keinem dieser Vorschläge gelöst wurde.

Nach einer erfolgreichen Bluetooth-Verbindung rufe ich anBluetoothGatt.discoverServices, was auf den meisten Geräten korrekt funktioniert. Auf dem Nexus 5 und Samsung Note 3 erhalte ich weder erfolgreich noch anderweitig eine Antwort (onServicesDiscovered). Dies geschieht beim allerersten Verbindungsversuch und ohne Kombination vontrennen() oderschließen() scheint es zu beheben.

Ich habe anekdotische Beweise dafür, dass es sich um einen Fehler im Android-Betriebssystem handelt. nur unser Nexus 5, der noch auf 4.4.2 war, hatte dieses Problem, und ein Upgrade auf 4.4.3 scheint es behoben zu haben. Dies ist jedoch noch keine Option für das Samsung und ich möchte, wenn möglich, eine Problemumgehung finden. Ich weiß, dass wir uns in der Vergangenheit ohne diese Probleme mit Nexus 5 verbunden haben. während ich versuche aufzuspüren, was sich geändert haben könnte, würde ich mich über Gedanken freuen.

Samsung Note 3 Protokolle:

07-02 17:29:54.891 I/PeripheralManager( 8282): Connect has been called on HFEC161332B90C15C29E DF:5F:C8:DF:04:35 -43 , shouldPair = true
07-02 17:29:54.891 I/PeripheralManager( 8282): BTSTATE acquiring new gatt and connecting...
07-02 17:29:54.891 D/BluetoothGatt( 8282): connect() - device: DF:5F:C8:DF:04:35, auto: false
07-02 17:29:54.891 D/BluetoothGatt( 8282): registerApp()
07-02 17:29:54.896 D/BluetoothGatt( 8282): registerApp() - UUID=2fc3ce73-c50c-4cda-8b82-1532a5dccb14
07-02 17:29:54.896 D/BtGatt.GattService( 3434): registerClient() - UUID=2fc3ce73-c50c-4cda-8b82-1532a5dccb14
07-02 17:29:54.896 D/BtGatt.btif( 3434): btif_gattc_register_app
07-02 17:29:54.896 D/BtGatt.btif( 3434): btgattc_handle_event: Event 1000
07-02 17:29:54.896 D/BtGatt.btif( 3434): btif_gattc_upstreams_evt: Event 0
07-02 17:29:54.901 D/BtGatt.GattService( 3434): onClientRegistered() - UUID=2fc3ce73-c50c-4cda-8b82-1532a5dccb14, clientIf=5
07-02 17:29:54.901 I/BluetoothGatt( 8282): Client registered, waiting for callback
07-02 17:29:54.901 D/BluetoothGatt( 8282): onClientRegistered() - status=0 clientIf=5
07-02 17:29:54.901 D/BtGatt.GattService( 3434): clientConnect() - address=DF:5F:C8:DF:04:35, isDirect=true
07-02 17:29:54.901 D/BtGatt.btif( 3434): btif_gattc_open
07-02 17:29:54.901 D/BluetoothAdapter( 8282): stopLeScan()
07-02 17:29:54.906 D/BtGatt.btif( 3434): btgattc_handle_event: Event 1004
07-02 17:29:54.906 D/BtGatt.btif( 3434): btif_get_device_type: Device [df:5f:c8:df:04:35] type 2, addr. type 1
07-02 17:29:54.906 D/BtGatt.btif( 3434): btif_gattc_upstreams_evt: Event 2
07-02 17:29:54.906 D/BtGatt.GattService( 3434): onConnected() - clientIf=5, connId=5, address=DF:5F:C8:DF:04:35
07-02 17:29:54.906 D/BluetoothGatt( 8282): onClientConnectionState() - status=0 clientIf=5 device=DF:5F:C8:DF:04:35
07-02 17:29:54.906 I/PeripheralManager( 8282): Gatt State Connected
07-02 17:29:54.906 D/BluetoothGatt( 8282): discoverServices() - device: DF:5F:C8:DF:04:35
07-02 17:29:54.911 D/BtGatt.GattService( 3434): discoverServices() - address=DF:5F:C8:DF:04:35, connId=5
07-02 17:29:54.911 D/BtGatt.btif( 3434): btif_gattc_search_service
07-02 17:29:54.911 I/PeripheralManager( 8282): Gatt Service Discovery Started
07-02 17:29:54.911 D/BtGatt.btif( 3434): btgattc_handle_event: Event 1006
…
07-02 17:30:24.901 W/PeripheralManager( 8282): Connection time out hard
07-02 17:30:24.921 I/PeripheralManager( 8282): canceling connection

Verbindungscode:

public void connect(final Peripheral peripheral, boolean pair) {
    Log.i(TAG,  "Connect has been called on " + peripheral.toString() + ", shouldPair = " + pair);
    this.shouldPair = pair;
    bluetoothHandler.post(new Runnable() {
         @Override
         public void run() {
            if(isConnected) {
                Log.w(TAG, "Connecting when already connected!");
                return;
            }
            if (mBluetoothAdapter == null || peripheral == null || peripheral.getAddress() == null) {
                Log.e(TAG, "BluetoothAdapter not initialized or unspecified address.");
                return;
            }
            final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(peripheral.getAddress());
            if (device == null) {
                Log.e(TAG, "Device not found.  Unable to connect.");
                return;
            }
            if(mBluetoothGatt != null) { // use existing gatt if present and not closed
                Log.i(TAG, "connecting to existing gatt...");
                mBluetoothGatt.connect();
            } else {
                Log.i(TAG, "acquiring new gatt and connecting...");
                mBluetoothGatt = device.connectGatt(context, false, mGattCallback);
            }
         }
    });

    lastConnectedPeripheral = peripheral;
}

Services entdecken:

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        if (status == BluetoothGatt.GATT_SUCCESS) {
            if (newState == BluetoothGatt.STATE_CONNECTED) {
                Log.i(TAG,"Gatt State Connected");
                isBluetoothConnected = true;
                tryDiscoveringServices();
                ...

Bitte lassen Sie mich wissen, welche zusätzlichen Informationen dies beleuchten könnten. Vielen Dank!

BEARBEITEN: Nach einer Änderung in unserer Firmware hat sich das Problem verringert: Anstatt nie eine Verbindung herzustellen, dauert die Verbindungsherstellung etwas mehr als eine Minute. Dies deutet darauf hin, dass das Problem zumindest teilweise auf unser spezielles Bluetooth-Gerät sowie auf die Änderungen des Android-Betriebssystems zurückzuführen ist. Ich werde aktualisieren, wenn ich herausfinde, wie ich dieses Problem lösen kann.

Antworten auf die Frage(0)

Ihre Antwort auf die Frage