我正在开发三星ACE3上的应用程序来连接蓝牙低功耗设备.由于三星不希望ACE3升级到Android 4.3,我需要使用Samsung ble api.目前,连接,读取数据,发送数据和从一个特征获取通知都可以.但是,当我启用多个特征的通知时,只有第一个启用的特征才能获得通知.有人有同样的问题吗?感谢您的帮助!
以下代码启用连接通知
if (mBluetoothGatt != null && device != null) {
BluetoothGattService pucService = mBluetoothGatt.getService(device, PROFILE_UART_CONTROL_SERVICE);
if (pucService == null) {
showMessage("PUC service not found!");
return;
}
BluetoothGattCharacteristic motion = pucService.getCharacteristic(MOTION_READ);
if (motion == null) {
showMessage("charateristic not found!");
return;
}
enableNotification(true, motion);
BluetoothGattCharacteristic voltage = pucService.getCharacteristic(VOLTAGE_READ);
if (voltage == null) {
showMessage("charateristic not found!");
return;
}
enableNotification(true, voltage);
BluetoothGattCharacteristic pressure = pucService.getCharacteristic(PRESSURE_READ);
if (pressure == null) {
showMessage("charateristic not found!");
return;
}
enableNotification(true, pressure);
}
以下是enableNotification方法:
public boolean enableNotification(boolean enable, BluetoothGattCharacteristic characteristic) {
if (mBluetoothGatt == null)
return false;
if (!mBluetoothGatt.setCharacteristicNotification(characteristic, enable))
return false;
BluetoothGattDescriptor clientConfig = characteristic.getDescriptor(CCC);
if (clientConfig == null)
return false;
if (enable) {
Log.i(TAG,"enable notification");
clientConfig.setValue(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE);
} else {
Log.i(TAG,"disable notification");
clientConfig.setValue(BluetoothGattDescriptor.DISABLE_NOTIFICATION_VALUE);
}
return mBluetoothGatt.writeDescriptor(clientConfig);
}
解决方法:
刚刚意识到这个问题在miznick在this post的第二个答案中得到了解决.主要是因为三星BLE Api表现同步.基本上,api一次只能处理1 Gatt指令,例如写/读特性,w / r描述符等.通过调用w / r GATT方法,就像将Gatt指令附加到等待执行的系统.执行后,系统会激活一个相关的回调方法,如onCharacterWrite,OnDescriptorWrite等.只有在这一点或之后,我们才应该使用另一个Gatt w / r方法.代码在miznick的帖子中给出.
This post也可用于理解Samsung Ble api的行为.请查看三星BLE官方网站上的指南和提示.