AFAIK you can't use DS to impose a single consumer policy.
At first glance a ServiceFactory might work and if it did would be the simplest way to go.
However there's one caveat:
"The Framework caches the value returned (unless it is null), and will return the same service object on any future call to BundleContext.getService for the same bundle. This means the Framework must not allow this method to be concurrently called for the same bundle"
So I think it will fail in the following scenario:
Given Bundle A, Service S and Bundle B;
A gets S, then A ungets S, Bgets S, then A gets S.
The framework's cache may well interfere and give A the cached S even thought it is already held by B.
The only alternative I can think of is to use a FindHook, though this a bit more low-level, and you'd probably want to implement the other hooks (EventHook, ListenerHook) for completeness.
Using the hooks you'll be able to mask the services availability to other bundles. Though as your hook will be holding state you'll want it in the same bundle as the device service so that it's impossible to stop the hook without stopping the device service's bundle.