Skip to content

GATT Alert Notification Service Samsung #239

@TommyNeeld

Description

@TommyNeeld

Describe the bug
No New Alert (0x2A46) on GATT Alert Notification Service (0x1811) - Samsung Android Device. Works on iPhone.

To Reproduce
Steps to reproduce the behavior:

  1. Connect & Bond with a BLE device with ANS service (0x1811) and New Alert (0x2A46)
  2. Enable CCCDs to enable notifications
  3. Scan a tag (in this case) to trigger the new alert characteristic

Expected behavior
To trigger a new alert notification for the New Alert (0x2A46) characteristic.

Logs
Log from two an Samsung Android device and iOS device using the same BLE reader. The Android shows no new alert notficiations, the iOS device does.

  • Samsung S22 Ultra Android 15 (nothing shown after "All Services Enabled" as no new alert was recieved:
nRF Connect, 2025-07-24
Halo+ (44:B7:D0:81:03:BC)
V	18:36:32.806	Connecting to 44:B7:D0:81:03:BC...
D	18:36:32.806	gatt = device.connectGatt(autoConnect = false, TRANSPORT_LE, preferred PHY = LE 1M)
D	18:36:33.006	[Callback] Connection state changed with status: 0 and new state: CONNECTED (2)
I	18:36:33.006	Connected to 44:B7:D0:81:03:BC
D	18:36:33.006	wait(1600ms)
D	18:36:33.215	[Broadcast] Action received: android.bluetooth.device.action.ACL_CONNECTED
D	18:36:33.264	[Callback] Connection state changed with status: 22 and new state: DISCONNECTED (0)
E	18:36:33.264	Error 22 (0x16): GATT CONN TERMINATE LOCAL HOST
I	18:36:33.264	Disconnected
D	18:36:33.310	[Broadcast] Action received: android.bluetooth.device.action.ACL_DISCONNECTED
D	18:36:33.325	[Broadcast] Action received: android.bluetooth.device.action.BOND_STATE_CHANGED, bond state changed to: NONE (10), reason: UNKNOWN (0)
I	18:36:33.325	Bond information lost, reason: UNKNOWN (0)
D	18:36:34.145	gatt.close()
D	18:36:34.148	wait(200)
V	18:36:34.350	Connecting to 44:B7:D0:81:03:BC...
D	18:36:34.350	gatt = device.connectGatt(autoConnect = false, TRANSPORT_LE, preferred PHY = LE 1M)
D	18:36:34.842	[Broadcast] Action received: android.bluetooth.device.action.ACL_CONNECTED
D	18:36:34.845	[Callback] Connection state changed with status: 0 and new state: CONNECTED (2)
I	18:36:34.845	Connected to 44:B7:D0:81:03:BC
V	18:36:34.853	Discovering services...
D	18:36:34.853	gatt.discoverServices()
I	18:36:35.458	Connection parameters updated (interval: 7.5ms, latency: 0, timeout: 5000ms)
D	18:36:37.063	[Callback] Services discovered with status: 0
I	18:36:37.063	Services discovered
V	18:36:37.076	Generic Access (0x1800)
•⁠  ⁠Device Name [R W] (0x2A00)
•⁠  ⁠Appearance [R] (0x2A01)
•⁠  ⁠Peripheral Preferred Connection Parameters [R] (0x2A04)
Generic Attribute (0x1801)
•⁠  ⁠Service Changed [I] (0x2A05)
   Client Characteristic Configuration (0x2902)
Device Information (0x180A)
•⁠  ⁠Serial Number String [R] (0x2A25)
•⁠  ⁠Hardware Revision String [R] (0x2A27)
•⁠  ⁠Firmware Revision String [R] (0x2A26)
•⁠  ⁠Software Revision String [R] (0x2A28)
•⁠  ⁠Manufacturer Name String [R] (0x2A29)
•⁠  ⁠Model Number String [R] (0x2A24)
Alert Notification Service (0x1811)
•⁠  ⁠Supported New Alert Category [B] (0x2A47)
•⁠  ⁠New Alert [N] (0x2A46)
   Client Characteristic Configuration (0x2902)
•⁠  ⁠Supported Unread Alert Category [R] (0x2A48)
•⁠  ⁠Alert Notification Control Point [W] (0x2A44)
•⁠  ⁠Unread Alert Status [N] (0x2A45)
   Client Characteristic Configuration (0x2902)
Health Thermometer (0x1809)
•⁠  ⁠Temperature Measurement [N R] (0x2A1C)
   Client Characteristic Configuration (0x2902)
•⁠  ⁠Temperature Type [R] (0x2A1D)
Battery Service (0x180F)
•⁠  ⁠Battery Level [N R] (0x2A19)
   Client Characteristic Configuration (0x2902)
D	18:36:37.076	gatt.setCharacteristicNotification(00002a05-0000-1000-8000-00805f9b34fb, true)
D	18:36:37.081	gatt.setCharacteristicNotification(00002a46-0000-1000-8000-00805f9b34fb, true)
D	18:36:37.084	gatt.setCharacteristicNotification(00002a45-0000-1000-8000-00805f9b34fb, true)
D	18:36:37.086	gatt.setCharacteristicNotification(00002a1c-0000-1000-8000-00805f9b34fb, true)
D	18:36:37.089	gatt.setCharacteristicNotification(00002a19-0000-1000-8000-00805f9b34fb, true)
I	18:36:37.167	Connection parameters updated (interval: 45.0ms, latency: 0, timeout: 5000ms)
V	18:37:00.636	Enabling services...
V	18:37:00.636	Enabling indications for 00002a05-0000-1000-8000-00805f9b34fb
D	18:37:00.637	gatt.setCharacteristicNotification(00002a05-0000-1000-8000-00805f9b34fb, true)
D	18:37:00.638	gatt.writeDescriptor(00002902-0000-1000-8000-00805f9b34fb, value=0x0200)
I	18:37:00.702	Data written to descr. 00002902-0000-1000-8000-00805f9b34fb, value: (0x) 02-00
A	18:37:00.702	"Indications enabled" sent
V	18:37:00.704	Indications enabled for 00002a05-0000-1000-8000-00805f9b34fb
V	18:37:00.704	Enabling notifications for 00002a46-0000-1000-8000-00805f9b34fb
D	18:37:00.704	gatt.setCharacteristicNotification(00002a46-0000-1000-8000-00805f9b34fb, true)
D	18:37:00.705	gatt.writeDescriptor(00002902-0000-1000-8000-00805f9b34fb, value=0x0100)
I	18:37:00.792	Data written to descr. 00002902-0000-1000-8000-00805f9b34fb, value: (0x) 01-00
A	18:37:00.792	"Notifications enabled" sent
V	18:37:00.794	Notifications enabled for 00002a46-0000-1000-8000-00805f9b34fb
V	18:37:00.795	Enabling notifications for 00002a45-0000-1000-8000-00805f9b34fb
D	18:37:00.795	gatt.setCharacteristicNotification(00002a45-0000-1000-8000-00805f9b34fb, true)
D	18:37:00.797	gatt.writeDescriptor(00002902-0000-1000-8000-00805f9b34fb, value=0x0100)
I	18:37:00.882	Data written to descr. 00002902-0000-1000-8000-00805f9b34fb, value: (0x) 01-00
A	18:37:00.882	"Notifications enabled" sent
V	18:37:00.885	Notifications enabled for 00002a45-0000-1000-8000-00805f9b34fb
V	18:37:00.885	Enabling notifications for 00002a1c-0000-1000-8000-00805f9b34fb
D	18:37:00.885	gatt.setCharacteristicNotification(00002a1c-0000-1000-8000-00805f9b34fb, true)
D	18:37:00.887	gatt.writeDescriptor(00002902-0000-1000-8000-00805f9b34fb, value=0x0100)
I	18:37:00.972	Data written to descr. 00002902-0000-1000-8000-00805f9b34fb, value: (0x) 01-00
A	18:37:00.972	"Notifications enabled" sent
V	18:37:00.974	Notifications enabled for 00002a1c-0000-1000-8000-00805f9b34fb
V	18:37:00.974	Enabling notifications for 00002a19-0000-1000-8000-00805f9b34fb
D	18:37:00.974	gatt.setCharacteristicNotification(00002a19-0000-1000-8000-00805f9b34fb, true)
D	18:37:00.976	gatt.writeDescriptor(00002902-0000-1000-8000-00805f9b34fb, value=0x0100)
I	18:37:01.062	Data written to descr. 00002902-0000-1000-8000-00805f9b34fb, value: (0x) 01-00
A	18:37:01.062	"Notifications enabled" sent
V	18:37:01.064	Notifications enabled for 00002a19-0000-1000-8000-00805f9b34fb
V	18:37:01.065	All services enabled
  • iPhone iOS Version 17.6.1 iPhone SE:
[18:57:07.3180] Normal: Scanner On.
[18:57:07.6210] Normal: Device Scanned.
[18:57:07.6220] Debug: [Callback] centralManager(central, didDiscover: peripheral, advertisementData: ["kCBAdvDataServiceUUIDs": <__NSArrayM 0x301dc65e0>(
Health Thermometer,
1811
)
, "kCBAdvDataIsConnectable": 1, "kCBAdvDataRxPrimaryPHY": 1, "kCBAdvDataRxSecondaryPHY": 0, "kCBAdvDataTimestamp": 775072627.618535, "kCBAdvDataLocalName": Halo+], rssi: -50)
[18:57:08.0630] Normal: Appearance changed from Generic to TemperatureSensor.
[18:57:19.2020] Debug: cbCentralManager.connect()
[18:57:19.3560] Debug: [Callback] centralManager(central, didConnect: peripheral)
[18:57:19.3560] Normal: Connected.
[18:57:19.3560] Debug: peripheral.discoverServices(nil)
[18:57:19.7090] Debug: [Callback] peripheral(peripheral, didDiscoverServices: nil)
[18:57:19.7100] Normal: Discovered Device Information, Alert Notification Service, Health Thermometer, and Battery Service Services.
[...]
[18:57:19.9480] Debug: peripheral.discoverDescriptors(for: 2A46)
[...]
[18:57:20.1850] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: 2A46, error: nil)
[...]
[18:58:30.5270] Debug: cbCentralManager.cancelPeripheralConnection()
[18:58:30.5280] Debug: [Callback] centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
[18:58:30.5280] Normal: Disconnected.
[18:58:32.8030] Debug: cbCentralManager.connect()
[18:58:33.0000] Debug: [Callback] centralManager(central, didConnect: peripheral)
[18:58:33.0000] Normal: Connected.
[18:58:33.0000] Debug: peripheral.discoverServices(nil)
[18:58:33.3570] Debug: [Callback] peripheral(peripheral, didDiscoverServices: nil)
[18:58:33.3570] Normal: Discovered Device Information, Alert Notification Service, Health Thermometer, and Battery Service Services.
[...]
[18:58:33.5980] Debug: peripheral.discoverDescriptors(for: 2A46)
[...]
[18:58:33.8360] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: 2A46, error: nil)
[...]
[18:59:07.3210] Normal: Scanner Off.
[19:00:26.9500] Normal: Scanner On.
[19:00:29.0940] Normal: Scanner Off.
[19:00:35.1540] Debug: cbCentralManager.cancelPeripheralConnection()
[19:00:35.1550] Debug: [Callback] centralManager(central, didDisconnectPeripheral: peripheral, error: nil)
[19:00:35.1550] Normal: Disconnected.
[19:00:36.2280] Debug: cbCentralManager.connect()
[19:00:36.7820] Debug: [Callback] centralManager(central, didConnect: peripheral)
[19:00:36.7820] Normal: Connected.
[19:00:36.7820] Debug: peripheral.discoverServices(nil)
[19:00:37.1380] Debug: [Callback] peripheral(peripheral, didDiscoverServices: nil)
[19:00:37.1390] Normal: Discovered Device Information, Alert Notification Service, Health Thermometer, and Battery Service Services.
[...]
[19:00:37.3780] Debug: peripheral.discoverDescriptors(for: 2A46)
[...]
[19:00:37.6160] Debug: [Callback] peripheral(peripheral, didDiscoverDescriptorsFor: 2A46, error: nil)
[...]
[19:01:41.1480] Debug: peripheral.readValue(forCharacteristic: 2A24)
[19:01:41.2160] Debug: [Callback] peripheral(peripheral, didUpdateValueForCharacteristic: 2A24, error: nil)
[19:01:41.2160] Normal: Updated Value of Characteristic 2A24 to 4861 6C6F 2B.
[19:01:41.2160] Application: "Halo+" value received.

[19:01:59.4680] Debug: peripheral.setNotifyValue(01, forCharacteristic: 2A46)
[19:01:59.4680] Application: Setting Boolean true for Notifying Characteristic New Alert
[19:01:59.5160] Debug: [Callback] peripheral(peripheral, didUpdateNotificationStateFor: 2A46, error: nil)
[19:01:59.5160] Debug: [Callback] peripheral(peripheral, didUpdateValueForCharacteristic: 2A46, error: nil)
[19:01:59.5160] Normal: Updated Value of Characteristic 2A46 to 0001 3030 3030 3030 3030 3030 3030 3030 30.
[19:01:59.5160] Application: "0001 3030 3030 3030 3030 3030 3030 3030 30" value received.
[19:02:15.3560] Debug: [Callback] peripheral(peripheral, didUpdateValueForCharacteristic: 2A46, error: nil)
[19:02:15.3570] Normal: Updated Value of Characteristic 2A46 to 0001 3832 3630 3234 3432 3230 3030 3030 35.
[19:02:15.3580] Application: "0001 3832 3630 3234 3432 3230 3030 3030 35" value received.

Versions:

  • Android version: 15
  • Phone model: Samsung 22 Ultra - One UI version 7.0
  • App Version: 4.29.1

Additional context
I don't have the log, but I know it does not work on Samsung Galaxy S9 Android Version 10, One UI version 2.5. This feels like a Samsung problem.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions