Статус onServicesDiscovered — 129, подключение нестабильно для BLE в Android

Я следил за страницей Bluetooth Low Energy для разработки в Android 4.3 для Bluetooth Low Energy

Я пытаюсь подключить устройство BLE с помощью следующего кода:

public void connect(final String address) {
        // TODO Auto-generated method stub
        Log.w(TAG, "BluetoothLeService Connect function.");
        if(mBluetoothAdapter == null || address == null){
            Log.w(TAG, "BluetoothAdapter not initialized or unspecified address.");
        }
        final BluetoothDevice device = mBluetoothAdapter.getRemoteDevice(address);
        mBluetoothGatt = device.connectGatt(this, true, mGattCallback);
    }

После подключения к устройству BLE оно обнаружит службу с помощью mBluetoothGatt.discoverServices();, как показано в следующем коде.

private final BluetoothGattCallback mGattCallback = new BluetoothGattCallback() {

        public void onConnectionStateChange(android.bluetooth.BluetoothGatt gatt, int status, int newState) {
            if(mBluetoothGatt == null){
                Log.e(TAG, "mBluetoothGatt not created!");
                return;
            }

            device = gatt.getDevice();
            address = device.getAddress();
            try {
                switch (newState) {
                case BluetoothAdapter.STATE_CONNECTED:

                    Log.i(TAG, "STATE_CONNECTED:");
                    broadcastUpdate(ACTION_GATT_CONNECTED, device, status);
                    mBluetoothGatt.discoverServices();
                    // Attempts to discover services after successful connection.

                    break;
                case BluetoothAdapter.STATE_DISCONNECTED:
                    Log.i(TAG, "STATE_DISCONNECTED:");
                    gatt.close();

                    broadcastUpdate(ACTION_GATT_DISCONNECTED, device, status);
                    break;

                default:
                    Log.i(TAG, "New state not processed: " + newState);
                    break;
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }

Но Android отключится сразу после подключения, а статус onServicesDiscovered также покажет 129, как показано в следующем журнале.

D/BtGatt.btif(25992): btif_gattc_upstreams_evt: Event 2
D/BtGatt.GattService(25992): onConnected() - clientIf=4, connId=4, address=20:73:20:00:6C:B4
D/BluetoothGatt(27228): onClientConnectionState() - status=0 clientIf=4 device=2
0:73:20:00:6C:B4
I/BluetoothLeService(27228): BluetoothGattCallback-----newState@@@@@@2
I/BluetoothLeService(27228): STATE_CONNECTED:
I/Device_information(27228): BroadcastReceiver---action = ti.android.ble.common.
ACTION_GATT_CONNECTED
D/BluetoothGatt(27228): discoverServices() - device: 20:73:20:00:6C:B4
D/BtGatt.GattService(25992): discoverServices() - address=20:73:20:00:6C:B4, connId=4
D/BtGatt.btif(25992): btif_gattc_search_service
D/BtGatt.btif(25992): btgattc_handle_event: Event 1006
W/qdhwcomposer(  326): Excessive delay reading vsync: took 266 ms
W/bt-l2cap(25992): L2CA_EnableUpdateBleConnParams - unknown BD_ADDR 207320006cb4
E/bt-btm  (25992): btm_sec_disconnected - Clearing Pending flag
E/MP-Decision( 2172): Error setting a sleep mode for secondary cores - -38
D/BtGatt.btif(25992): btif_gattc_upstreams_evt: Event 6
D/BtGatt.GattService(25992): onSearchCompleted() - connId=4, status=129
D/BluetoothGatt(27228): onSearchComplete() = Device=20:73:20:00:6C:B4 Status=129
I/BluetoothLeService(27228): onServicesDiscovered-----status@@@@@@ = 129
I/BluetoothLeService(27228): onServicesDiscovered-----129@@@@@@ = 129
W/BluetoothLeService(27228): BluetoothLeService Connect function.
D/BluetoothManager(27228): getConnectionState()
D/BluetoothManager(27228): getConnectedDevices
D/BluetoothAdapterService(1109096104)(25992): Get Bonded Devices being called
D/BluetoothAdapterProperties(25992): getBondedDevices: length=1
D/BtGatt.GattService(25992): getDeviceType() - device=20:73:20:00:6C:B4, type=2
W/BluetoothLeService(27228): connect----------mBluetoothGatt = android.bluetooth.BluetoothGatt@4227a800
D/BluetoothGatt(27228): connect() - device: 20:73:20:00:6C:B4, auto: true
D/BluetoothGatt(27228): registerApp()
D/BluetoothGatt(27228): registerApp() - UUID=c560ac73-9ca3-4c2b-a6d4-7c6ec57b7209
D/BtGatt.GattService(25992): registerClient() - UUID=c560ac73-9ca3-4c2b-a6d4-7c6ec57b7209
D/BtGatt.btif(25992): btif_gattc_register_app
D/BtGatt.btif(25992): btif_gattc_upstreams_evt: Event 5
D/BtGatt.GattService(25992): onDisconnected() - clientIf=4, connId=4, address=20:73:20:00:6C:B4
D/BluetoothGatt(27228): onClientConnectionState() - status=133 clientIf=4 device=20:73:20:00:6C:B4
I/BluetoothLeService(27228): BluetoothGattCallback-----newState@@@@@@0
I/BluetoothLeService(27228): STATE_DISCONNECTED:

Почему возникло это состояние?

Это смущает меня несколько дней... Кто-нибудь может мне помочь? Заранее спасибо.


person Wun    schedule 02.06.2014    source источник
comment
BLE на Android не работает, проверьте это: code.google.com /p/android/issues/detail?id=58381   -  person Michael    schedule 02.06.2014
comment
@Michael Но, кажется, у него нет ответа на эту проблему, не так ли?   -  person Wun    schedule 03.06.2014
comment
Ничего, что я бы назвал решением. Кажется, что с несколькими соединениями дела обстоят хуже, поэтому ограничьтесь одним соединением на Gatt и старайтесь жить с прерывистыми соединениями.   -  person Michael    schedule 03.06.2014
comment
Основываясь на некоторых из этих комментариев, похоже, что может помочь одновременное отключение (или, по крайней мере, не использование) Wi-Fi и введение некоторых коротких (может быть, пару сотен миллисекунд?) задержек между такими действиями, как подключение , обнаружение сервисов, запись характеристик и т. д. Немного покопавшись, я наткнулся на это: android.googlesource.com/platform/external/bluetooth/bluedroid/ Ошибка 129 является общей, ищите GATT_INTERNAL_ERROR (0x0081). Этот номер не изменился вплоть до Lollipop (5.1.1). ХТХ кто-то :)   -  person wislon    schedule 19.04.2016


Ответы (1)


Я столкнулся с той же проблемой, затем перезапустил блютуз. После перезагрузки я получил эту ошибку статуса.

Следующее сработало для меня. Вот код в службе Bluetooth:

        @Override
        public void onServicesDiscovered(BluetoothGatt gatt, int status) {

            if (status != 0) {
                mBluetoothAdapter.disable();

        Timer single_timer = new Timer();
        single_timer.schedule(new TimerTask() {
            @Override
            public void run() {
                mBluetoothAdapter.enable();
            }
        }, 1000);


        Timer second_timer = new Timer();
        second_timer.schedule(new TimerTask() {
            @Override
            public void run() {
                gattServiceIntent = new Intent(context, BluetoothLeService.class);
                bindService(gattServiceIntent, mServiceConnection, BIND_AUTO_CREATE);
                mBluetoothLeService.initialize();
                mBluetoothLeService.connect(mDeviceAddress);
                //maybe you need wait 0.5-1 second to call connect() after called initialize()
            }
        }, 2000);


                Log.e(TAG, "An error code get at onServicesDiscovered= " + status);
            }
            if (status == BluetoothGatt.GATT_SUCCESS) {
                broadcastUpdate(ACTION_GATT_SERVICES_DISCOVERED);
            } else {
                Log.w(TAG, "onServicesDiscovered received: " + status);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                mBluetoothGatt.discoverServices();
            }
        }
person heinousdog    schedule 23.04.2015
comment
Для тех, у кого STATUS=129 даже после нескольких повторных попыток и Thread.sleep(1000) mBluetoothGatt.DiscoverServices(). Можно решить эту проблему путем отключения и повторного подключения. Значение вызова mGatt.disconnect(); и m.Gatt.connect(). - person Johnathan Logan; 02.05.2017