在 Android 中不接收 BLE 通知

Posted

技术标签:

【中文标题】在 Android 中不接收 BLE 通知【英文标题】:Not Receiving BLE Notifications in Android 【发布时间】:2015-12-18 08:02:07 【问题描述】:

我正在 android 中使用 BLE 设备。

这里是我设置端点 0000fff4-0000-1000-8000-00805f9b34fb 来接收通知的地方(CLIENT_CHARACTERISTIC_CONFIG 是 00002902-0000-1000-8000-00805f9b34fb

 public void k2DigitalNotification(BluetoothGattCharacteristic characteristic,
                               boolean enabled)

    Boolean myStatus;

    if (MY_BLUETOOTH_SERVICE.equals(characteristic.getUuid()))
    
        Log.v(TAG, "Characteristic: " + characteristic.getUuid());

        BluetoothGattDescriptor descriptor = characteristic.getDescriptor(
                UUID.fromString(SampleGattAttributes.CLIENT_CHARACTERISTIC_CONFIG));
        descriptor.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
        myStatus = mBluetoothGatt.writeDescriptor(descriptor);
        Log.v(TAG,"Write Status::"+myStatus);
        bluetoothGatt.setCharacteristicNotification(characteristic, true);

    

这是我写入设备的代码。这行得通! 100%,数据显示在嵌入式 BLE 设备上。 (端点为 0000fff1-0000-1000-8000-00805f9b34fb )

   public void k2digitalWriteToCharacteristic(BluetoothGattCharacteristic characteristic) 
    if (BLE_ENDPOINT.equals(characteristic.getUuid()))
    

        Log.v(TAG,"0Xfff1");

        byte[] data3Send = new byte[4];
        data3Send[0] = 0x31;
        data3Send[1] = 0x01;
        data3Send[2] = 0x5a;
        data3Send[2] = 0x0d;;

        characteristic.setValue(data3Send);
        boolean status = mBluetoothGatt.writeCharacteristic(characteristic);
        Log.v(TAG, "Status is:" + String.valueOf(status));
    

BLE 设备正在发送数据.....我已经在 Nordic Semi 的 nRFMaster 或 Bluepixel 的 BLEScanner 等应用程序中验证了这一点。

但我从未见过回调。

        public void onCharacteristicChanged(BluetoothGatt gatt,
                                        BluetoothGattCharacteristic characteristic) 
        Log.v(TAG,"A Characteristic Change?!?!?!");
        byte[] data = characteristic.getValue();
        Log.v(TAG,"Here is the data: "+data[0]);
        broadcastUpdate(ACTION_DATA_AVAILABLE, characteristic);
    

有什么帮助吗?我整个星期都在用头撞墙。

【问题讨论】:

启用通知非常棘手。我可以发布你可以尝试的各种事情以及你必须注意的事情的答案,但为了快速进行理智检查,我建议尝试SweetBlue,特别是BleDevice.enableNotify()。这是我的库,但老实说,这是了解问题出在 Android 端代码还是其他地方的最快方法,然后你可以从那里开始。 感谢您的提示。我现在就下载这个试试看。 您是否验证了特征数据可以通过indication而不是notification接收? 感谢 Zimano 的提醒。我试过了。实际上,答案是我的一个错误。注意上面的数据包......我覆盖了5a,因为我没有在我发送的数据包中推进数组索引......愚蠢的错误 【参考方案1】:

我的问题是关于 ble 设备正忙。我试图在没有太多时间间隔的情况下阅读和订阅,而 ble 设备很忙。您可以使用以下代码检查启用通知是否成功:

Boolean status = bluetoothGatt.writeDescriptor(descriptor);

如果 writeDescriptor 成功则返回 true,否则返回 false - 从而帮助您在 ble 设备忙时进行调试。

【讨论】:

以上是关于在 Android 中不接收 BLE 通知的主要内容,如果未能解决你的问题,请参考以下文章

Android BLE 通知

如何在 Xamarin/Android 上启用多个 BLE 特征通知?

反应本机推送通知在 Android 8.1(API 级别 27)中不起作用

Android BLE最完整的工具类(扫描/连接/读写/通知设备)

通过 BLE 通知接收数据包

一起Talk Android吧(第二百九十四回:Android中的BLE开发:注册特征值通知三)