7

我正在尝试将 BLE 模块(bluegiga BLE112)与我的 nexus 4(android 4.3)一起使用。我可以连接,获取设备名称,连接到 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 商店中提供的几个应用程序,它们也有类似的问题(可以连接、获取名称等,但没有服务)。

4

6 回答 6

6

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

于 2013-10-25T13:20:03.833 回答
4

来自 BleConstants.java public static final int GATT_INTERNAL_ERROR = 129;

于 2014-02-05T19:59:05.440 回答
2

我用 TI 传感器标签在我的 Nexus 7 上做了几次测试。

  1. Nexus 7 (Android 4.3) -->0x81 GATT_INTERNAL_ERROR
  2. 将 Nexus 7 升级到 Android 4.4.2 -->0x81 GATT_INTERNAL_ERROR
  3. 关闭WiFi,onServicesDiscovered从来没有被调用过。
  4. 关闭再打开蓝牙,就可以了!!!
  5. 开启WiFi,onServicesDiscovered再次失败。
  6. 关闭WiFi,它又可以工作了。

我还在 Galaxy S4 (Android 4.3) 上测试了相同的程序,它一直运行良好。

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

如果你能在没有WiFi的情况下生活,可能还可以,但如果你能找到其他Android 4.3设备,你应该尝试其他设备。

于 2013-12-25T23:10:42.947 回答
1

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

于 2015-02-09T11:38:11.893 回答
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

不过,您需要解决此问题吗?对我来说,重新启动手机 - 两次 - 有帮助。在第二次重新启动期间,我首先手动关闭了蓝牙。

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

Dedection 时间对我来说从来都不是问题,设备会立即出现。

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

于 2013-10-25T11:56:05.703 回答
0

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

于 2015-02-10T11:49:51.203 回答