【问题标题】:onServicesDiscovered not be called on BluetoothGattCallbackonServicesDiscovered 不能在 BluetoothGattCallback 上调用
【发布时间】:2015-07-10 03:21:50
【问题描述】:

我开始使用 ibeacon 和 android。但是有一些问题需要你的帮助。在 blutoothGatCallback 上,我实现了 onConnectionStateChange 并调用了 discoverServices()。尽管如此,discoverServices() 返回 true 但没有执行任何回调,我希望 onServicesDiscovered 被调用,但不是。

@Override
    public void onConnectionStateChange(BluetoothGatt gatt, int status,
            int newState) {
        Log.i(TAG, "onConnectionStateChange : " + status + "  newState : "
                + newState);
        if (newState == BluetoothProfile.STATE_CONNECTED) {

            boolean isdiscover= mBluetoothGatt.discoverServices();
            if(isdiscover){
            mConnected = true;              
            }
        } 

    }

状态为 133,newstate 已连接。状态是否会导致回调失败

【问题讨论】:

  • 0x85 作为状态指示错误,因此您应该弄清楚为什么会得到它,然后它应该可以正常工作
  • 请注意您使用的iBeacon的制造商和型号。并非所有 iBeacon 实现都支持 GATT 服务,因此您可能不应该能够连接。

标签: android bluetooth-lowenergy ibeacon-android


【解决方案1】:

更多信息会有所帮助,您能否提供收到的广告数据?

以下只是一个猜测,因为 Android BLE 存在广泛的问题,但是当我不小心向 Beacon 发出 BR/EDR 连接时,我已经看到了这个一般的 133 错误。

当 GATT-server 设备宣传支持它时,由于 Android 默认使用 BR/EDR 连接,因此您可以尝试在 connectGatt() 中显式地将传输设置为 TRANSPORT_LE,但是由于此参数仅在隐藏版本中可用它,你需要使用反射。

尝试像这样发出连接:

private BluetoothGatt mGatt;
private final BluetoothGattCallback gattCallback = new BluetoothGattCallback() { ... }

public void connectToDevice(BluetoothDevice device) {
        try {
            Method m = device.getClass().getDeclaredMethod("connectGatt", Context.class, boolean.class, BluetoothGattCallback.class, int.class);
            int transport = device.getClass().getDeclaredField("TRANSPORT_LE").getInt(null);
            mGatt = (BluetoothGatt) m.invoke(device, this, false, gattCallback, transport);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }

这样你至少可以确定它与这个 Android 行为无关。

【讨论】:

    【解决方案2】:

    状态 133 表示您尝试在非主线程上执行 bt 命令。

    BTLE 回调是从 android-bt-binder 线程调用的。

    所以

    mBluetoothGatt.discoverServices();

    在活页夹线程上运行,它应该在 GUI/主线程上运行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2018-02-26
      • 2014-04-18
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多