Android BLE GATT 外设模式通知
Android BLE GATT Peripheral Mode Notifications
我正在尝试使用 Android 5.0 (21) api 设置一个应用程序作为 BLE 外围设备。至此,我已经搭建好了服务器,广告和连接正常,设置了自定义的GATT服务和特性,并且可以在外围设备和其他测试设备之间进行读写。现在我正在尝试向一些参数添加通知,但简单地说;他们不工作。
定义这些特征时,它们包括通知 属性:
BluetoothGattService battService = new BluetoothGattService(BatteryProfile.UUID_BATTERY_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY);
BluetoothGattCharacteristic batteryLevelCharacteristic =
new BluetoothGattCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL,
BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ);
battService.addCharacteristic(batteryLevelCharacteristic);
mGattServer.addService(battService);
在我的 BluetoothGattServerCallback
中,我包含了方法:
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
Log.d(TAG, "Descriptor write: " + descriptor.toString());
if (responseNeeded) {
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, value);
}
super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
}
我希望在客户端启用通知(或为此写入任何描述符)时记录 "Descriptor write: " 消息;但从未记录过此类消息(调试器也从未进入该函数)。
稍后我尝试使用以下方式发送通知:
BluetoothGattCharacteristic batteryLevelCharacteristic = service.getCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL);
batteryLevelCharacteristic.setValue(new byte[]{ mBatteryLevel });
mGattServer.notifyCharacteristicChanged(mConnectedDevice, batteryLevelCharacteristic, false);
虽然它更新了值;它不会向连接的客户端发送通知。
我已经在 Nexus 5X 上使用 Android 6.0.1 对此进行了测试(不幸的是,这是我唯一可以用来测试的 Android 设备)。那里使用外围设备/BluetoothGattServer API 的示例并不多,所以我有点迷路了。是否有某种方法我忘记了调用,或者我需要以某种未记录的顺序执行某些操作才能使通知正常工作?
如有任何帮助,我们将不胜感激!
不知道你有没有找到解决办法。但我认为您可以尝试为需要通知的特征定义客户端配置特征描述符。
这可以按照 post 中所示的方式完成。
Any way to implement BLE notifications in Android-L preview
我正在尝试使用 Android 5.0 (21) api 设置一个应用程序作为 BLE 外围设备。至此,我已经搭建好了服务器,广告和连接正常,设置了自定义的GATT服务和特性,并且可以在外围设备和其他测试设备之间进行读写。现在我正在尝试向一些参数添加通知,但简单地说;他们不工作。
定义这些特征时,它们包括通知 属性:
BluetoothGattService battService = new BluetoothGattService(BatteryProfile.UUID_BATTERY_SERVICE, BluetoothGattService.SERVICE_TYPE_PRIMARY);
BluetoothGattCharacteristic batteryLevelCharacteristic =
new BluetoothGattCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL,
BluetoothGattCharacteristic.PROPERTY_READ | BluetoothGattCharacteristic.PROPERTY_NOTIFY,
BluetoothGattCharacteristic.PERMISSION_READ);
battService.addCharacteristic(batteryLevelCharacteristic);
mGattServer.addService(battService);
在我的 BluetoothGattServerCallback
中,我包含了方法:
@Override
public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) {
Log.d(TAG, "Descriptor write: " + descriptor.toString());
if (responseNeeded) {
mGattServer.sendResponse(device, requestId, BluetoothGatt.GATT_SUCCESS, 0, value);
}
super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value);
}
我希望在客户端启用通知(或为此写入任何描述符)时记录 "Descriptor write: " 消息;但从未记录过此类消息(调试器也从未进入该函数)。
稍后我尝试使用以下方式发送通知:
BluetoothGattCharacteristic batteryLevelCharacteristic = service.getCharacteristic(BatteryProfile.UUID_BATTERY_LEVEL);
batteryLevelCharacteristic.setValue(new byte[]{ mBatteryLevel });
mGattServer.notifyCharacteristicChanged(mConnectedDevice, batteryLevelCharacteristic, false);
虽然它更新了值;它不会向连接的客户端发送通知。
我已经在 Nexus 5X 上使用 Android 6.0.1 对此进行了测试(不幸的是,这是我唯一可以用来测试的 Android 设备)。那里使用外围设备/BluetoothGattServer API 的示例并不多,所以我有点迷路了。是否有某种方法我忘记了调用,或者我需要以某种未记录的顺序执行某些操作才能使通知正常工作?
如有任何帮助,我们将不胜感激!
不知道你有没有找到解决办法。但我认为您可以尝试为需要通知的特征定义客户端配置特征描述符。
这可以按照 post 中所示的方式完成。 Any way to implement BLE notifications in Android-L preview