I've always assumed that for every characteristic/service/descriptor on a BLE peripheral, there was a unique UUID. I figured the UUID not only described what it provided, but also provided a unique handle for it. Basically, I thought the transport layer used that to identify a specific instance between peripheral and central.
But working with Android, I've discovered that to have a notifiable characteristic, not only do you have to use the setCharacteristicNotification API, you have to ask the characteristic for a specific descriptor at a canonized UUID (00002902-0000-1000-8000-00805f9b34fb), and then set the value of that descriptor to allow notification/indication as appropriate.
What I don't understand, is that this implies that for every notifiable characteristic my device has, it has a descriptor associated with it with that specific UUID. If I have 5 notifiable characteristics, I'll have 5 different descriptors, but all with the same UUID. So when the Android device writes one of those descriptors, what address does it use to specify the otherwise similar looking descriptors? Is that all magically managed below the hood?