Re: BLE device GATT service discovery without pairing?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Tony,

> On Fri, Apr 17, 2015 at 9:00 PM, Tony DiCola <tony@xxxxxxxxxxxxxx> wrote:
> On Fri, Apr 17, 2015 at 12:04 PM, Tony DiCola <tony@xxxxxxxxxxxxxx> wrote:
>> Hi all, I'm using bluez 5.3's dbus API (also running bluetoothd with
>> the --experimental option) and wanted to check is it possible to
>> connect to a BLE device and discover its GATT services without pairing
>> to the device?
>>
>> I'm using the dbus APIs and see that the device Pair() function docs
>> call out that it will perform GATT service discovery.  This matches
>> what I see in practice--when I turn on an adapter's discovery with
>> StartDiscovery() I start to see nearby BLE devices added to the bluez
>> dbus root (with the org.bluez.Device1 interface).  I can connect to
>> those devices, but only when I call the device Pair() function do I
>> see all the GATT services, characteristics, descriptors, etc. added to
>> the bluez dbus root (using the org.bluez.GattService1,
>> org.bluez.GattCharacteristic1, etc. interfaces).
>>
>> However using just the dbus interface is it possible to trigger the
>> discovery of all those GATT service, characteristic, etc. objects
>> without pairing with a device?  I.e. is there an explicit GATT service
>> discovery command for a connected device?
>>
>> Let me know if the question isn't clear, and thanks for any help foks
>> can provide.
>>
>> -Tony
>
> Just to follow up and close the loop, I went back and realized I
> actually am getting all the GATT services, characteristics, etc.
> without pairing.  I must have had an issue with what I was trying
> earlier and see now after just a device connect call the GATT
> information shows up a short while after connecting.
>
> One quick question, is there any easy way to check if a device has
> finished its service discovery?  Right now I can watch the bluez
> ObjectManager's InterfacesAdded signal to see exactly when GATT
> objects are created, or even just poll the bluez dbus object hiearchy
> for their existance.  Just curious if there's a more explicit way like
> a signal or changed property to know when a device's service discovery
> completes.  Thanks!
>

It's pretty straightforward to know when all the attributes of an
individual service have been discovered; basically, once all the
GattCharacteristic1 objects under a service have been exported, the
"Characteristics" property of the service (GattService1) will be
updated and you'll receive a PropertiesChanged signal for it.

Finding out that the complete list of services have been discovered
and the objects have been exported is a bit trickier. Usually, the
"UUIDs" property on org.bluez.Device1 will be populated before a
connection with services obtained via advertising/inquiry. Upon
connection and when GATT/SDP service discovery has completed (and
after the service objects have been exported), the UUIDs property will
update with the full list of services. Here you could do something
like tracking InterfacesAdded signals and comparing the newly added
services to the initial UUID list.

I would be open to adding a signal/property to notify applications
when service discovery completes though this hasn't really been an
issue so far. Usually applications can be built in a very event based
manner and update their state on a per-service basis as service
hierarchies get added and removed.

I hope this helps!
Arman
--
To unsubscribe from this list: send the line "unsubscribe linux-bluetooth" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux