BLE gatt.discoverServices()返回true但Callback永远不会触发

时间:2018-02-13 10:43:11

标签: android bluetooth-lowenergy

我开发了一个应用程序来连接到设备并交换数据。 这适用于我的智能手机(API Level 23)。但是当使用API​​ leven 26时,onServiceDiscovered Callback永远不会触发。gatt.discoverServices() 返回true。我检查newState == BluetoothProfile.STATE_CONNECTED连接是否成功。之后,我在使用

启动服务发现之前实施了一个延迟
msecondHandler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    boolean state = gatt.discoverServices();
                    Log.d(TAG,"State Service Discovered: "+state);
                }
            },3000);

我将延迟时间改为600毫秒到3000毫秒,但回叫从未触发。

1 个答案:

答案 0 :(得分:1)

我已经观察到这个问题以及A& D UA-651BLE血压计和运行Android 6.0.1的Nexus 5。如果我不添加延迟,则不会发生回调。我不得不玩一点,找到适用于这款手机和BLE外设组合的确切延迟。但是,它似乎只发生在BOND_BONDED的设备上。

我在其他手机和其他设备上做了一些测试。我从未在运行Nougat或更高版本的设备上看到此问题。 A& D BPM在使用Nougat或Oreo的设备上不需要延迟,所以我想这个问题在以后的版本中得到了解决。甚至在我的带有Android 6.0.1的Nexus 5上,它只发生在A& D BPM上,而其他设备我也不需要延迟。所以真正的问题只出现在特定的组合中。我猜堆栈仍然忙于与外围设备交换密钥,并且在完成该过程之前,discoverServices()不起作用。

北欧BLE经理代码实际上做同样的事情,尽管他们的代码并非特定于任何Android版本,请参阅Android-BLE-Library

所以这是我的代码。我没有打算让延迟设备具体化,这样我就有了更大的成功变化,似乎并没有打扰那些不需要延迟的设备。

    // Take action depending on the bond state
    if(bondstate == BOND_NONE || bondstate == BOND_BONDED) {
        // Connected to device, now proceed to discover it's services but delay a bit if needed
        int delayWhenBonded = 0;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
             // It seems delays when bonded are only needed in versions below Nougat
             // This issue was observed on a Nexus 5 running Android 6.0.1 when connection to a A&D UA-651BLE
             // Strangely enough, it also is dependent on the peripheral as others don't seem to need a delay
             delayWhenBonded = 1000;
        }
        final int delay = bondstate == BOND_BONDED ? delayWhenBonded : 0;
        bleHandler.postDelayed(new Runnable() {
            @Override
            public void run() {
                HBLogger.i(TAG, String.format("Discovering services of '%s' with delay of %d ms", getName(), delay));
                boolean result = gatt.discoverServices();
                if (!result) {
                     HBLogger.i(TAG, "DiscoverServices failed to start");
                }
            }
        }, delay);
   } else if (bondstate == BluetoothDevice.BOND_BONDING) {
        // Apparently the bonding process has already started let it complete
        HBLogger.i(TAG, String.format("Wait for bonding to complete"));
   }