任何在Android-L预览中实现BLE通知的方法

时间:2014-07-21 12:28:40

标签: bluetooth-lowenergy android-bluetooth android-5.0-lollipop

这个问题不是关于Android notificatinos,而是关于BLE通知(标题可能暗示)

我已经在Android-L上运行了基本的BLE外设模式

有没有办法在Android-L预览中实现BLE通知。我可以做一些类似下面的事情,使charecteritic能够通知,但试图听

BluetoothGattCharacteristic firstServiceChar = new BluetoothGattCharacteristic(
        UUID.fromString(serviceOneCharUuid),
                BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ );

但在iOS上的LightBlue应用程序中,我无法订阅此特性。显然,没有API可以用来在订阅char时响应调用(就像在iOS中一样)

如果您已在Android-L

上成功启用BLE通知,请分享您的代码

1 个答案:

答案 0 :(得分:12)

除了OP所做的事情之外:

BluetoothGattCharacteristic firstServiceChar = new BluetoothGattCharacteristic(UUID.fromString(serviceOneCharUuid), BluetoothGattCharacteristic.PROPERTY_NOTIFY, BluetoothGattCharacteristic.PERMISSION_READ )

接下来是添加客户端特性配置描述符(UUID是使用蓝牙基础UUID的16位0x2902的128位版本),以便连接的设备可以告诉您它想要通知(或指示),然后将该描述符添加到您的特征中:

BluetoothGattDescriptor gD = new BluetoothGattDescriptor(UUID.fromString("00002902-0000-1000-8000-00805F9B34FB"), BluetoothGattDescriptor.PERMISSION_WRITE | BluetoothGattDescriptor.PERMISSION_READ);

firstServiceChar.addDescriptor(gD);

UUID来自蓝牙规范。显然,设备通过更新此描述符来订阅通知,因此您必须通过覆盖onDescriptorWriteRequest来处理BluetoothGattServerCallback:

@Override
public void onDescriptorWriteRequest (BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {

    btClient = device;  // perhaps add to some kind of collection of devices to update?

    // now tell the connected device that this was all successfull
    btGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, offset, value);

}

现在更新您的值并通知连接人:

firstServiceChar.setValue("HI");
btGattServer.notifyCharacteristicChanged(btClient, firstServiceChar, false);

希望这个快速而又脏的代码会有所帮助,因为我首先使用的OP代码甚至可以使基本的外设模式工作:)