| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505 |
- BlueZ D-Bus GATT API description
- ********************************
- GATT local and remote services share the same high-level D-Bus API. Local
- refers to GATT based service exported by a BlueZ plugin or an external
- application. Remote refers to GATT services exported by the peer.
- BlueZ acts as a proxy, translating ATT operations to D-Bus method calls and
- Properties (or the opposite). Support for D-Bus Object Manager is mandatory for
- external services to allow seamless GATT declarations (Service, Characteristic
- and Descriptors) discovery. Each GATT service tree is required to export a D-Bus
- Object Manager at its root that is solely responsible for the objects that
- belong to that service.
- Releasing a registered GATT service is not defined yet. Any API extension
- should avoid breaking the defined API, and if possible keep an unified GATT
- remote and local services representation.
- Service hierarchy
- =================
- GATT remote and local service representation. Object path for local services
- is freely definable.
- External applications implementing local services must register the services
- using GattManager1 registration method and must implement the methods and
- properties defined in GattService1 interface.
- Service org.bluez
- Interface org.bluez.GattService1
- Object path [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/serviceXX
- Properties string UUID [read-only]
- 128-bit service UUID.
- boolean Primary [read-only]
- Indicates whether or not this GATT service is a
- primary service. If false, the service is secondary.
- object Device [read-only, optional]
- Object path of the Bluetooth device the service
- belongs to. Only present on services from remote
- devices.
- array{object} Includes [read-only, optional]
- Array of object paths representing the included
- services of this service.
- uint16 Handle [read-write, optional] (Server Only)
- Service handle. When available in the server it
- would attempt to use to allocate into the database
- which may fail, to auto allocate the value 0x0000
- shall be used which will cause the allocated handle to
- be set once registered.
- Characteristic hierarchy
- ========================
- For local GATT defined services, the object paths need to follow the service
- path hierarchy and are freely definable.
- Service org.bluez
- Interface org.bluez.GattCharacteristic1
- Object path [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/serviceXX/charYYYY
- Methods array{byte} ReadValue(dict options)
- Issues a request to read the value of the
- characteristic and returns the value if the
- operation was successful.
- Possible options: "offset": uint16 offset
- "mtu": Exchanged MTU (Server only)
- "device": Object Device (Server only)
- Possible Errors: org.bluez.Error.Failed
- org.bluez.Error.InProgress
- org.bluez.Error.NotPermitted
- org.bluez.Error.NotAuthorized
- org.bluez.Error.InvalidOffset
- org.bluez.Error.NotSupported
- void WriteValue(array{byte} value, dict options)
- Issues a request to write the value of the
- characteristic.
- Possible options: "offset": Start offset
- "type": string
- Possible values:
- "command": Write without
- response
- "request": Write with response
- "reliable": Reliable Write
- "mtu": Exchanged MTU (Server only)
- "device": Device path (Server only)
- "link": Link type (Server only)
- "prepare-authorize": True if prepare
- authorization
- request
- Possible Errors: org.bluez.Error.Failed
- org.bluez.Error.InProgress
- org.bluez.Error.NotPermitted
- org.bluez.Error.InvalidValueLength
- org.bluez.Error.NotAuthorized
- org.bluez.Error.NotSupported
- fd, uint16 AcquireWrite(dict options) [optional]
- Acquire file descriptor and MTU for writing. Only
- sockets are supported. Usage of WriteValue will be
- locked causing it to return NotPermitted error.
- For server the MTU returned shall be equal or smaller
- than the negotiated MTU.
- For client it only works with characteristic that has
- WriteAcquired property which relies on
- write-without-response Flag.
- To release the lock the client shall close the file
- descriptor, a HUP is generated in case the device
- is disconnected.
- Note: the MTU can only be negotiated once and is
- symmetric therefore this method may be delayed in
- order to have the exchange MTU completed, because of
- that the file descriptor is closed during
- reconnections as the MTU has to be renegotiated.
- Possible options: "device": Object Device (Server only)
- "mtu": Exchanged MTU (Server only)
- "link": Link type (Server only)
- Possible Errors: org.bluez.Error.Failed
- org.bluez.Error.NotSupported
- fd, uint16 AcquireNotify(dict options) [optional]
- Acquire file descriptor and MTU for notify. Only
- sockets are support. Usage of StartNotify will be locked
- causing it to return NotPermitted error.
- For server the MTU returned shall be equal or smaller
- than the negotiated MTU.
- Only works with characteristic that has NotifyAcquired
- which relies on notify Flag and no other client have
- called StartNotify.
- Notification are enabled during this procedure so
- StartNotify shall not be called, any notification
- will be dispatched via file descriptor therefore the
- Value property is not affected during the time where
- notify has been acquired.
- To release the lock the client shall close the file
- descriptor, a HUP is generated in case the device
- is disconnected.
- Note: the MTU can only be negotiated once and is
- symmetric therefore this method may be delayed in
- order to have the exchange MTU completed, because of
- that the file descriptor is closed during
- reconnections as the MTU has to be renegotiated.
- Possible options: "device": Object Device (Server only)
- "mtu": Exchanged MTU (Server only)
- "link": Link type (Server only)
- Possible Errors: org.bluez.Error.Failed
- org.bluez.Error.NotSupported
- void StartNotify()
- Starts a notification session from this characteristic
- if it supports value notifications or indications.
- Possible Errors: org.bluez.Error.Failed
- org.bluez.Error.NotPermitted
- org.bluez.Error.InProgress
- org.bluez.Error.NotConnected
- org.bluez.Error.NotSupported
- void StopNotify()
- This method will cancel any previous StartNotify
- transaction. Note that notifications from a
- characteristic are shared between sessions thus
- calling StopNotify will release a single session.
- Possible Errors: org.bluez.Error.Failed
- void Confirm() [optional] (Server only)
- This method doesn't expect a reply so it is just a
- confirmation that value was received.
- Possible Errors: org.bluez.Error.Failed
- Properties string UUID [read-only]
- 128-bit characteristic UUID.
- object Service [read-only]
- Object path of the GATT service the characteristic
- belongs to.
- array{byte} Value [read-only, optional]
- The cached value of the characteristic. This property
- gets updated only after a successful read request and
- when a notification or indication is received, upon
- which a PropertiesChanged signal will be emitted.
- boolean WriteAcquired [read-only, optional]
- True, if this characteristic has been acquired by any
- client using AcquireWrite.
- For client properties is ommited in case
- 'write-without-response' flag is not set.
- For server the presence of this property indicates
- that AcquireWrite is supported.
- boolean NotifyAcquired [read-only, optional]
- True, if this characteristic has been acquired by any
- client using AcquireNotify.
- For client this properties is ommited in case 'notify'
- flag is not set.
- For server the presence of this property indicates
- that AcquireNotify is supported.
- boolean Notifying [read-only, optional]
- True, if notifications or indications on this
- characteristic are currently enabled.
- array{string} Flags [read-only]
- Defines how the characteristic value can be used. See
- Core spec "Table 3.5: Characteristic Properties bit
- field", and "Table 3.8: Characteristic Extended
- Properties bit field".
- The "x-notify" and "x-indicate" flags restrict access
- to notifications and indications by imposing write
- restrictions on a characteristic's client
- characteristic configuration descriptor.
- Allowed values:
- "broadcast"
- "read"
- "write-without-response"
- "write"
- "notify"
- "indicate"
- "authenticated-signed-writes"
- "extended-properties"
- "reliable-write"
- "writable-auxiliaries"
- "encrypt-read"
- "encrypt-write"
- "encrypt-notify" (Server only)
- "encrypt-indicate" (Server only)
- "encrypt-authenticated-read"
- "encrypt-authenticated-write"
- "encrypt-authenticated-notify" (Server only)
- "encrypt-authenticated-indicate" (Server only)
- "secure-read" (Server only)
- "secure-write" (Server only)
- "secure-notify" (Server only)
- "secure-indicate" (Server only)
- "authorize"
- uint16 Handle [read-write, optional] (Server Only)
- Characteristic handle. When available in the server it
- would attempt to use to allocate into the database
- which may fail, to auto allocate the value 0x0000
- shall be used which will cause the allocated handle to
- be set once registered.
- uint16 MTU [read-only]
- Characteristic MTU, this is valid both for ReadValue
- and WriteValue but either method can use long
- procedures when supported.
- Characteristic Descriptors hierarchy
- ====================================
- Local or remote GATT characteristic descriptors hierarchy.
- Service org.bluez
- Interface org.bluez.GattDescriptor1
- Object path [variable prefix]/{hci0,hci1,...}/dev_XX_XX_XX_XX_XX_XX/serviceXX/charYYYY/descriptorZZZ
- Methods array{byte} ReadValue(dict flags)
- Issues a request to read the value of the
- characteristic and returns the value if the
- operation was successful.
- Possible options: "offset": Start offset
- "device": Device path (Server only)
- "link": Link type (Server only)
- Possible Errors: org.bluez.Error.Failed
- org.bluez.Error.InProgress
- org.bluez.Error.NotPermitted
- org.bluez.Error.NotAuthorized
- org.bluez.Error.NotSupported
- void WriteValue(array{byte} value, dict flags)
- Issues a request to write the value of the
- characteristic.
- Possible options: "offset": Start offset
- "device": Device path (Server only)
- "link": Link type (Server only)
- "prepare-authorize": boolean Is prepare
- authorization
- request
- Possible Errors: org.bluez.Error.Failed
- org.bluez.Error.InProgress
- org.bluez.Error.NotPermitted
- org.bluez.Error.InvalidValueLength
- org.bluez.Error.NotAuthorized
- org.bluez.Error.NotSupported
- Properties string UUID [read-only]
- 128-bit descriptor UUID.
- object Characteristic [read-only]
- Object path of the GATT characteristic the descriptor
- belongs to.
- array{byte} Value [read-only, optional]
- The cached value of the descriptor. This property
- gets updated only after a successful read request, upon
- which a PropertiesChanged signal will be emitted.
- array{string} Flags [read-only]
- Defines how the descriptor value can be used.
- Possible values:
- "read"
- "write"
- "encrypt-read"
- "encrypt-write"
- "encrypt-authenticated-read"
- "encrypt-authenticated-write"
- "secure-read" (Server Only)
- "secure-write" (Server Only)
- "authorize"
- uint16 Handle [read-write, optional] (Server Only)
- Characteristic handle. When available in the server it
- would attempt to use to allocate into the database
- which may fail, to auto allocate the value 0x0000
- shall be used which will cause the allocated handle to
- be set once registered.
- GATT Profile hierarchy
- =====================
- Local profile (GATT client) instance. By registering this type of object
- an application effectively indicates support for a specific GATT profile
- and requests automatic connections to be established to devices
- supporting it.
- Service <application dependent>
- Interface org.bluez.GattProfile1
- Object path <application dependent>
- Methods void Release()
- This method gets called when the service daemon
- unregisters the profile. The profile can use it to
- do cleanup tasks. There is no need to unregister the
- profile, because when this method gets called it has
- already been unregistered.
- Properties array{string} UUIDs [read-only]
- 128-bit GATT service UUIDs to auto connect.
- GATT Manager hierarchy
- ======================
- GATT Manager allows external applications to register GATT services and
- profiles.
- Registering a profile allows applications to subscribe to *remote* services.
- These must implement the GattProfile1 interface defined above.
- Registering a service allows applications to publish a *local* GATT service,
- which then becomes available to remote devices. A GATT service is represented by
- a D-Bus object hierarchy where the root node corresponds to a service and the
- child nodes represent characteristics and descriptors that belong to that
- service. Each node must implement one of GattService1, GattCharacteristic1,
- or GattDescriptor1 interfaces described above, based on the attribute it
- represents. Each node must also implement the standard D-Bus Properties
- interface to expose their properties. These objects collectively represent a
- GATT service definition.
- To make service registration simple, BlueZ requires that all objects that belong
- to a GATT service be grouped under a D-Bus Object Manager that solely manages
- the objects of that service. Hence, the standard DBus.ObjectManager interface
- must be available on the root service path. An example application hierarchy
- containing two separate GATT services may look like this:
- -> /com/example
- | - org.freedesktop.DBus.ObjectManager
- |
- -> /com/example/service0
- | | - org.freedesktop.DBus.Properties
- | | - org.bluez.GattService1
- | |
- | -> /com/example/service0/char0
- | | - org.freedesktop.DBus.Properties
- | | - org.bluez.GattCharacteristic1
- | |
- | -> /com/example/service0/char1
- | | - org.freedesktop.DBus.Properties
- | | - org.bluez.GattCharacteristic1
- | |
- | -> /com/example/service0/char1/desc0
- | - org.freedesktop.DBus.Properties
- | - org.bluez.GattDescriptor1
- |
- -> /com/example/service1
- | - org.freedesktop.DBus.Properties
- | - org.bluez.GattService1
- |
- -> /com/example/service1/char0
- - org.freedesktop.DBus.Properties
- - org.bluez.GattCharacteristic1
- When a service is registered, BlueZ will automatically obtain information about
- all objects using the service's Object Manager. Once a service has been
- registered, the objects of a service should not be removed. If BlueZ receives an
- InterfacesRemoved signal from a service's Object Manager, it will immediately
- unregister the service. Similarly, if the application disconnects from the bus,
- all of its registered services will be automatically unregistered.
- InterfacesAdded signals will be ignored.
- Examples:
- - Client
- test/example-gatt-client
- client/bluetoothctl
- - Server
- test/example-gatt-server
- tools/gatt-service
- Service org.bluez
- Interface org.bluez.GattManager1
- Object path [variable prefix]/{hci0,hci1,...}
- Methods void RegisterApplication(object application, dict options)
- Registers a local GATT services hierarchy as described
- above (GATT Server) and/or GATT profiles (GATT Client).
- The application object path together with the D-Bus
- system bus connection ID define the identification of
- the application registering a GATT based
- service or profile.
- Possible errors: org.bluez.Error.InvalidArguments
- org.bluez.Error.AlreadyExists
- void UnregisterApplication(object application)
- This unregisters the services that has been
- previously registered. The object path parameter
- must match the same value that has been used
- on registration.
- Possible errors: org.bluez.Error.InvalidArguments
- org.bluez.Error.DoesNotExist
|