code: func (p *Client) DiscoverDescriptors(filter []ble.UUID, c *ble.Characteristic) ([]*ble.Descriptor, error) {
  	p.Lock()
  	defer p.Unlock()
  	start := c.ValueHandle + 1
  	for start <= c.EndHandle {
  		fmt, b, err := p.ac.FindInformation(start, c.EndHandle)
  		if err == ble.ErrAttrNotFound {
  			break
  		} else if err != nil {
  			return nil, err
  		}
  		length := 2 + 2
  		if fmt == 0x02 {
  			length = 2 + 16
  		}
  		for len(b) != 0 {
  			h := binary.LittleEndian.Uint16(b[:2])
  			u := ble.UUID(b[2:length])
  			d := &ble.Descriptor{UUID: u, Handle: h}
  			if filter == nil || ble.Contains(filter, u) {
  				c.Descriptors = append(c.Descriptors, d)
  			}
  			if u.Equal(ble.ClientCharacteristicConfigUUID) {
  				c.CCCD = d
  			}
  			start = h + 1
  			b = b[length:]
  		}
  	}
  	return c.Descriptors, nil
  }
docs: // DiscoverDescriptors finds all the descriptors within a characteristic. [Vol 3, Part G, 4.7.1]
  // If filter is specified, only filtered descriptors are returned.