【问题标题】:Bluetooth Low Energy Service Discovery with Android 4.3 on Nexus 4Nexus 4 上使用 Android 4.3 的蓝牙低功耗服务发现
【发布时间】:2013-09-28 18:57:35
【问题描述】:

我正在尝试将 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 商店提供的几个应用程序,它们也有类似的问题(可以连接、获取名称等,但没有服务)。

【问题讨论】:

标签: android bluetooth-lowenergy nexus-4


【解决方案1】:

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

【讨论】:

  • 我觉得你是对的,因为这个错误似乎只发生在我将设备放在外围设备接收边缘时。在我开始看到这个问题之前,它需要连接/断开 1 小时。不幸的是,当设备处于接收边缘时,正是我想尝试积极地重新连接而没有超时的时候。
【解决方案2】:

来自 BleConstants.java 公共静态最终 int GATT_INTERNAL_ERROR = 129;

【讨论】:

    【解决方案3】:

    我用 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的设备,你应该尝试其他设备。

    【讨论】:

    • 这是一些有趣的信息,但是禁用其他功能(例如 wifi),或者每次我想使用它时都重新启动/重新启动不是一个有效的解决方案。我需要一些适用于 wifi 的东西,并且不需要重置/循环蓝牙无线电等。自从发布这个之后,我已经成功地在 iOS 上实现了一个没有任何问题的版本。我认为这需要由 google 或 android 或手机制造商来解决,这样我们就不必失去功能或跳槽来获得可靠的系统运行。
    【解决方案4】:

    嗯, 我有同样的问题。

    检查 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 ,这个错误出现了,花了我半天的时间来检查。

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多