在Nexus 4上使用Android 4.3进行蓝牙低功耗服务发现

时间:2013-09-28 18:57:35

标签: android bluetooth-lowenergy nexus-4

我正在尝试使用我的nexus 4(android 4.3)的BLE模块(bluegiga BLE112)。我可以连接,获取设备的名称,连接到GATT,但服务发现失败。

以下是初始gatt连接(它似乎成功运行:

dev.connectGatt(getBaseContext(), true, btGattCB);

以下是GATT回调:

private BluetoothGattCallback btGattCB = new BluetoothGattCallback() {
    @Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
        super.onConnectionStateChange(gatt, status, newState);
        if(newState == BluetoothProfile.STATE_CONNECTED){
            Log.i(TAG, "Gatt Connected");
            gatt.discoverServices();
        }
        else if(newState == BluetoothProfile.STATE_DISCONNECTED){
            Log.i(TAG, "Gatt Disconnected");
        }
    }

    @Override
    public void onServicesDiscovered(BluetoothGatt gatt, int status){
        Log.i(TAG,"Status onServiceDiscovered: "+status);   //status code i'm getting here is 129
        List<BluetoothGattService> btServices = gatt.getServices();//try anyway
    }
};

这是我的日志:

09-28 12:58:37.611    4118-4130/com.jnewt.btFive I/PDU? Scan Callback
09-28 12:58:37.611    4118-4130/com.jnewt.btFive I/PDU? Device is: 00:07:80:67:2F:63
09-28 12:58:37.611    4118-4130/com.jnewt.btFive I/PDU? Device Name: BGT GPIO Test
09-28 12:58:43.607    4118-4118/com.jnewt.btFive I/PDU? Scan Timeout
09-28 12:59:13.539    4118-4129/com.jnewt.btFive I/PDU? Gatt Connected
09-28 12:59:43.561    4118-4190/com.jnewt.btFive I/PDU? Service Discovery Failed
09-28 12:59:43.581    4118-4130/com.jnewt.btFive I/PDU? Gatt Disconnected
09-28 13:00:00.920    4118-4129/com.jnewt.btFive I/PDU? Gatt Connected
09-28 13:00:30.902    4118-4130/com.jnewt.btFive I/PDU? Service Discovery Failed
09-28 13:00:30.922    4118-4190/com.jnewt.btFive I/PDU? Gatt Disconnected
09-28 13:01:20.265    4118-4129/com.jnewt.btFive I/PDU? Gatt Connected
09-28 13:01:50.277    4118-4190/com.jnewt.btFive I/PDU? Service Discovery Failed
09-28 13:01:50.297    4118-4130/com.jnewt.btFive I/PDU? Gatt Disconnected
09-28 13:01:56.113    4118-4129/com.jnewt.btFive I/PDU? Gatt Connected
09-28 13:02:26.115    4118-4190/com.jnewt.btFive I/PDU? Service Discovery Failed
09-28 13:02:26.125    4118-4130/com.jnewt.btFive I/PDU? Gatt Disconnected

https://developer.android.com/reference/android/bluetooth/BluetoothGatt.html页面,我没有看到129被提及为可能的状态(没有一个常数匹配129)。

此时我完全没有想法。我通过测试iphone的类似示例将问题隔离到Android手机。我也尝试了在Play商店提供的几个应用程序,他们有类似的问题(可以连接,获取名称等,但没有服务)。

6 个答案:

答案 0 :(得分:6)

在Nexus 7上测试我的应用程序时,实际上今天得到了相同的错误代码。我的问题是,我在短时间内调用了2 X Gatt.connect。也许这有助于你。请注意,您不能在短时间内连接两次传感器设备。

答案 1 :(得分:4)

来自BleConstants.java的

    public static final int GATT_INTERNAL_ERROR = 129;

答案 2 :(得分:2)

我在带有TI传感器标签的Nexus 7上进行了多次测试。

  1. Nexus 7(Android 4.3) - &gt; 0x81 GATT_INTERNAL_ERROR
  2. 升级Nexus 7至Android 4.4.2 - &gt; 0x81 GATT_INTERNAL_ERROR
  3. 关闭WiFi,从未调用onServicesDiscovered
  4. 关闭并打开蓝牙,它可以正常工作!!!
  5. 开启WiFi,onServicesDiscovered再次失败。
  6. 关闭WiFi,它再次有效。
  7. 我也在Galaxy S4(Android 4.3)上测试相同的程序,它一直运行良好。

    因此,我认为Nexus 7上的BLE堆栈并不好。

    如果你没有WiFi,可能没问题,但是如果你能找到其他一些Android 4.3设备,你可以试试其他设备。

答案 3 :(得分:1)

那么, 我有同样的问题。

检查BluetoothGATT中常量的二进制值我建议只是129表示失败。也许,在定义常量时,有人误输了0,结果是257而不是129.(如果是状态代码总是查找二进制表示,则显示超过十进制值)

我绝对不会查看Android源代码,只是为了确定它是以二进制形式插入还是以小数形式显示。

   Binary    Dec
-----------  ---
0 1000 0001  129
1 0000 0001  257
0 0000 0101  5
0 0000 1111  15
0 0000 1101  13
0 0000 0111  7
0 0000 0110  6
0 0000 0000  0
0 0000 0011  3

但是,你需要一个解决方案吗? 对我来说重启电话-twice-帮助。在第二次重启期间,我首先手动关闭蓝牙。

在发生错误之前,我已经在我的应用程序的每次测试运行中以编程方式关闭并重新激活蓝牙。它近两个月完美无瑕。然后我删除了“浪费时间”BT-restart-code,这个错误出现了,花了我半天才结账。

对我而言,缩短时间从来都不是问题,设备会立即出现。

开发电话:Nexus 4 / Android 4.3(不断更新) BLE设备:德州仪器CC2541

答案 4 :(得分:1)

如果我的BLE设备已与我的手机配对,则会出现此错误。一旦取消配对设备并再次发现服务,错误就会得到解决。

答案 5 :(得分:0)

使用TI-CC2541芯片时出现了同样的错误。 解决方案是使用128kB芯片而不是256kB。 例如,“SimpleBLEPeripheral”是为128kB芯片制造的。