Как узнать, когда устройство BLE подписывается на характеристику на Android?

Исходя из фона iOS dev, при работе с Bluetooth LE, действующим в качестве периферии, вы можете зарегистрироваться для обратного вызова, когда «центральное» устройство BLE подписывается (включает уведомления) для характеристики.

Я изо всех сил пытаюсь понять, как это достигается на Android. Если вы работаете с Bluetooth LE, действующим в качестве центрального, я могу видеть, как вы подписались: bluetoothGatt.setCharacteristicNotification(characteristicToSubscribeTo, true);

Это то же самое, что и на iOS: peripheralDevice.setNotifyValue(true, forCharacteristic characteristicToSubscribeTo)

Теперь, после вызова вышеприведенного на iOS, на периферийной стороне, вы получите обратный вызов, чтобы сказать, что центральный абонент подписался на метод, аналогичный: peripheralManager(manager, central subscribedCentral didSubscribeToCharacteristic characteristic) которая затем дает вам ссылку на устройство, которое подписано / Разрешенные уведомления и к какой характеристике.

Что эквивалентно Android?

Для ясности я укажу, что мне не нужно подписываться на характеристику на Android, устройство действует как периферийное устройство и должно быть уведомлено, когда другие устройства подписываются на характеристики.

Извините, если это очевидно, но я не могу найти его в документах или в других местах.

Solutions Collecting From Web of "Как узнать, когда устройство BLE подписывается на характеристику на Android?"

Сразу после настройки щедрости у меня возникла идея, ха-ха должен был ждать немного больше, чтобы мой мозг больше времени думал;)

Кажется, что iOS немного отвлекся от того, как подписчики работают внутри. Под крышкой ios CoreBluetooth определенный «дескриптор» характеристики записывается Центром, что указывает, что центр хочет подписаться на значение признака.

Вот код, который вам нужно добавить в ваш подкласс BluetoothGattServerCallback :

  @Override public void onDescriptorWriteRequest(BluetoothDevice device, int requestId, BluetoothGattDescriptor descriptor, boolean preparedWrite, boolean responseNeeded, int offset, byte[] value) { super.onDescriptorWriteRequest(device, requestId, descriptor, preparedWrite, responseNeeded, offset, value); Log.i(TAG, "onDescriptorWriteRequest, uuid: " + descriptor.getUuid()); if (descriptor.getUuid().equals(Descriptor.CLIENT_CHARACTERISTIC_CONFIGURATION) && descriptor.getValue().equals(BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE)) { Log.i(TAG, "its a subscription!!!!"); for (int i = 0; i < 30; i++) { descriptor.getCharacteristic().setValue(String.format("new value: %d", i)); mGattServer.notifyCharacteristicChanged(device, descriptor.getCharacteristic(), false); } } } 

Было бы лучше использовать https://github.com/movisens/SmartGattLib для uuid ( Descriptor.CLIENT_CHARACTERISTIC_CONFIGURATION но исходное значение 00002902-0000-1000-8000-00805f9b34fb )

Согласитесь с @stefreak

а также,

 bluetoothGatt.setCharacteristicNotification(characteristicToSubscribeTo, true); 

Ничего не сделал для удаленного устройства, этот API только изменил бит уведомления в локальном стеке Bluetooth, то есть, если периферийные отправляют уведомления локальному, локальный стек будет судить, будут ли приложения уже зарегистрировать это уведомление, и если да, переведите его в приложение, иначе проигнорируйте его.

Поэтому, кроме setCharacteristicNotification, вам также необходимо написать writeDescriptor для вашего зарегистрированного уведомления (это шаги, которые указывают удаленные уведомления о необходимости отправки).