QLowEnergyController#
The QLowEnergyController
class provides access to Bluetooth Low Energy Devices. More…
Synopsis#
Functions#
def
addService
(service[, parent=None])def
connectToDevice
()def
createServiceObject
(service[, parent=None])def
disconnectFromDevice
()def
discoverServices
()def
error
()def
errorString
()def
localAddress
()def
mtu
()def
readRssi
()def
remoteAddress
()def
remoteAddressType
()def
remoteDeviceUuid
()def
remoteName
()def
requestConnectionUpdate
(parameters)def
role
()def
services
()def
setRemoteAddressType
(type)def
startAdvertising
(parameters, advertisingData[, scanResponseData=QLowEnergyAdvertisingData()])def
state
()def
stopAdvertising
()
Signals#
def
connected
()def
connectionUpdated
(parameters)def
disconnected
()def
discoveryFinished
()def
errorOccurred
(newError)def
mtuChanged
(mtu)def
rssiRead
(rssi)def
serviceDiscovered
(newService)def
stateChanged
(state)
Static functions#
def
createCentral
(remoteDevice[, parent=None])def
createCentral
(remoteDevice, localDevice[, parent=None])def
createPeripheral
([parent=None])def
createPeripheral
(localDevice[, parent=None])
Note
This documentation may contain snippets that were automatically translated from C++ to Python. We always welcome contributions to the snippet translation. If you see an issue with the translation, you can also let us know by creating a ticket on https:/bugreports.qt.io/projects/PYSIDE
Detailed Description#
QLowEnergyController
acts as the entry point for Bluetooth Low Energy development.
Bluetooth Low Energy defines two types of devices; the peripheral and the central. Each role performs a different task. The peripheral device provides data which is utilized by central devices. An example might be a humidity sensor which measures the moisture in a winter garden. A device such as a mobile phone might read the sensor’s value and display it to the user in the greater context of all sensors in the same environment. In this case the sensor is the peripheral device and the mobile phone acts as the central device.
A controller in the central role is created via the createCentral()
factory method. Such an object essentially acts as a placeholder towards a remote Low Energy peripheral device, enabling features such as service discovery and state tracking.
After having created a controller object in the central role, the first step is to establish a connection via connectToDevice()
. Once the connection has been established, the controller’s state()
changes to ConnectedState
and the connected()
signal is emitted. It is important to mention that some platforms such as a BlueZ based Linux cannot maintain two connected instances of QLowEnergyController
to the same remote device. In such cases the second call to connectToDevice()
may fail. This limitation may disappear at some stage in the future. The disconnectFromDevice()
function is used to break the existing connection.
The second step after establishing the connection is to discover the services offered by the remote peripheral device. This process is started via discoverServices()
and has finished once the discoveryFinished()
signal has been emitted. The discovered services can be enumerated via services()
.
The last step is to create service objects. The createServiceObject()
function acts as factory for each service object and expects the service UUID as parameter. The calling context should take ownership of the returned QLowEnergyService
instance.
Any QLowEnergyService
, QLowEnergyCharacteristic
or QLowEnergyDescriptor
instance which is later created from this controller’s connection becomes invalid as soon as the controller disconnects from the remote Bluetooth Low Energy device.
A controller in the peripheral role is created via the createPeripheral()
factory method. Such an object acts as a peripheral device itself, enabling features such as advertising services and allowing clients to get notified about changes to characteristic values.
After having created a controller object in the peripheral role, the first step is to populate the set of GATT services offered to client devices via calls to addService()
. Afterwards, one would call startAdvertising()
to let the device broadcast some data and, depending on the type of advertising being done, also listen for incoming connections from GATT clients.
- class PySide6.QtBluetooth.QLowEnergyController#
- PySide6.QtBluetooth.QLowEnergyController.Error#
Indicates all possible error conditions found during the controller’s existence.
Constant
Description
QLowEnergyController.NoError
No error has occurred.
QLowEnergyController.UnknownError
An unknown error has occurred.
QLowEnergyController.UnknownRemoteDeviceError
The remote Bluetooth Low Energy device with the address passed to the constructor of this class cannot be found.
QLowEnergyController.NetworkError
The attempt to read from or write to the remote device failed.
QLowEnergyController.InvalidBluetoothAdapterError
The local Bluetooth device with the address passed to the constructor of this class cannot be found or there is no local Bluetooth device.
QLowEnergyController.ConnectionError
The attempt to connect to the remote device failed.
QLowEnergyController.AdvertisingError
The attempt to start advertising failed.
QLowEnergyController.RemoteHostClosedError
The remote device closed the connection.
QLowEnergyController.AuthorizationError
The local Bluetooth device closed the connection due to insufficient authorization.
QLowEnergyController.MissingPermissionsError
The operating system requests permissions which were not granted by the user.
QLowEnergyController.RssiReadError
An attempt to read RSSI (received signal strength indicator) of a remote device finished with error.
- PySide6.QtBluetooth.QLowEnergyController.ControllerState#
Indicates the state of the controller object.
Constant
Description
QLowEnergyController.UnconnectedState
The controller is not connected to a remote device.
QLowEnergyController.ConnectingState
The controller is attempting to connect to a remote device.
QLowEnergyController.ConnectedState
The controller is connected to a remote device.
QLowEnergyController.DiscoveringState
The controller is retrieving the list of services offered by the remote device.
QLowEnergyController.DiscoveredState
The controller has discovered all services offered by the remote device.
QLowEnergyController.ClosingState
The controller is about to be disconnected from the remote device.
QLowEnergyController.AdvertisingState
The controller is currently advertising data.
- PySide6.QtBluetooth.QLowEnergyController.RemoteAddressType#
Indicates what type of Bluetooth address the remote device uses.
Constant
Description
QLowEnergyController.PublicAddress
The remote device uses a public Bluetooth address.
QLowEnergyController.RandomAddress
A random address is a Bluetooth Low Energy security feature. Peripherals using such addresses may frequently change their Bluetooth address. This information is needed when trying to connect to a peripheral.
- PySide6.QtBluetooth.QLowEnergyController.Role#
Indicates the role of the controller object.
Constant
Description
QLowEnergyController.CentralRole
The controller acts as a client interacting with a remote device which is in the peripheral role. The controller can initiate connections, discover services and read and write characteristics.
QLowEnergyController.PeripheralRole
The controller can be used to advertise services and handle incoming connections and client requests, acting as a GATT server. A remote device connected to the controller is in the central role.
Note
The peripheral role is not supported on Windows. In addition on Linux, handling the “Signed Write” ATT command on the server side requires BlueZ 5 and kernel version 3.7 or newer.
See also
- PySide6.QtBluetooth.QLowEnergyController.addService(service[, parent=None])#
- Parameters:
parent –
PySide6.QtCore.QObject
- Return type:
Constructs and returns a QLowEnergyService
object with parent
from service
. The controller must be in the PeripheralRole
and in the UnconnectedState
. The service
object must be valid.
Note
Once the peripheral instance is disconnected from the remote central device or if disconnectFromDevice()
is manually called, every service definition that was previously added via this function is removed from the peripheral. Therefore this function must be called again before re-advertising this peripheral controller instance. The described behavior is connection specific and therefore not dependent on whether stopAdvertising()
was called.
- PySide6.QtBluetooth.QLowEnergyController.connectToDevice()#
Connects to the remote Bluetooth Low Energy device.
This function does nothing if the controller’s state()
is not equal to UnconnectedState
. The connected()
signal is emitted once the connection is successfully established.
On Linux/BlueZ systems, it is not possible to connect to the same remote device using two instances of this class. The second call to this function may fail with an error. This limitation may be removed in future releases.
See also
- PySide6.QtBluetooth.QLowEnergyController.connected()#
This signal is emitted when the controller successfully connects to the remote Low Energy device (if the controller is in the CentralRole
) or if a remote Low Energy device connected to the controller (if the controller is in the PeripheralRole
). On iOS, macOS, and Android this signal is not reliable if the controller is in the PeripheralRole
. On iOS and macOS the controller only guesses that some central connected to our peripheral as soon as this central tries to write/read a characteristic/descriptor. On Android the controller monitors all connected GATT devices. On Linux BlueZ DBus peripheral backend the remote is considered connected when it first reads/writes a characteristic or a descriptor.
- PySide6.QtBluetooth.QLowEnergyController.connectionUpdated(parameters)#
- Parameters:
parameters –
PySide6.QtBluetooth.QLowEnergyConnectionParameters
This signal is emitted when the connection parameters change. This can happen as a result of calling requestConnectionUpdate()
or due to other reasons, for instance because the other side of the connection requested new parameters. The new values can be retrieved from newParameters
.
See also
- static PySide6.QtBluetooth.QLowEnergyController.createCentral(remoteDevice[, parent=None])#
- Parameters:
remoteDevice –
PySide6.QtBluetooth.QBluetoothDeviceInfo
parent –
PySide6.QtCore.QObject
- Return type:
Returns a new object of this class that is in the CentralRole
and has the parent object parent
. The remoteDevice
refers to the device that a connection will be established to later.
The controller uses the local default Bluetooth adapter for the connection management.
See also
CentralRole
- static PySide6.QtBluetooth.QLowEnergyController.createCentral(remoteDevice, localDevice[, parent=None])
- Parameters:
remoteDevice –
PySide6.QtBluetooth.QBluetoothDeviceInfo
localDevice –
PySide6.QtBluetooth.QBluetoothAddress
parent –
PySide6.QtCore.QObject
- Return type:
Returns a new instance of this class with parent
.
The remoteDevice
must contain the address of the remote Bluetooth Low Energy device to which this object should attempt to connect later on.
The connection is established via localDevice
. If localDevice
is invalid, the local default device is automatically selected. If localDevice
specifies a local device that is not a local Bluetooth adapter, error()
is set to InvalidBluetoothAdapterError
once connectToDevice()
is called.
Note that specifying the local device to be used for the connection is only possible when using BlueZ. All other platforms do not support this feature.
- static PySide6.QtBluetooth.QLowEnergyController.createPeripheral([parent=None])#
- Parameters:
parent –
PySide6.QtCore.QObject
- Return type:
Returns a new object of this class that is in the PeripheralRole
and has the parent object parent
. Typically, the next steps are to add some services and finally call startAdvertising()
on the returned object.
The controller uses the local default Bluetooth adapter for the connection management.
See also
PeripheralRole
- static PySide6.QtBluetooth.QLowEnergyController.createPeripheral(localDevice[, parent=None])
- Parameters:
localDevice –
PySide6.QtBluetooth.QBluetoothAddress
parent –
PySide6.QtCore.QObject
- Return type:
Returns a new object of this class that is in the PeripheralRole
and has the parent object parent
and is using localDevice
. Typically, the next steps are to add some services and finally call startAdvertising()
on the returned object.
The peripheral is created on localDevice
. If localDevice
is invalid, the local default device is automatically selected. If localDevice
specifies a local device that is not a local Bluetooth adapter, error()
is set to InvalidBluetoothAdapterError
.
Selecting localDevice
is only supported on Linux. On other platform, the parameter is ignored.
See also
PeripheralRole
- PySide6.QtBluetooth.QLowEnergyController.createServiceObject(service[, parent=None])#
- Parameters:
service –
PySide6.QtBluetooth.QBluetoothUuid
parent –
PySide6.QtCore.QObject
- Return type:
Creates an instance of the service represented by serviceUuid
. The serviceUuid
parameter must have been obtained via services()
.
The caller takes ownership of the returned pointer and may pass a parent
parameter as default owner.
This function returns a null pointer if no service with serviceUuid
can be found on the remote device or the controller is disconnected.
This function can return instances for secondary services too. The include relationships between services can be expressed via includedServices()
.
If this function is called multiple times using the same service UUID, the returned QLowEnergyService
instances share their internal data. Therefore if one of the instances initiates the discovery of the service details, the other instances automatically transition into the discovery state too.
See also
- PySide6.QtBluetooth.QLowEnergyController.disconnectFromDevice()#
Disconnects from the remote device.
Any QLowEnergyService
, QLowEnergyCharacteristic
or QLowEnergyDescriptor
instance that resulted from the current connection is automatically invalidated. Once any of those objects become invalid they remain invalid even if this controller object reconnects.
This function does nothing if the controller is in the UnconnectedState
.
If the controller is in the peripheral role, it stops advertising and removes all services which have previously been added via addService()
. To reuse the QLowEnergyController
instance the application must re-add services and restart the advertising mode by calling startAdvertising()
.
See also
- PySide6.QtBluetooth.QLowEnergyController.disconnected()#
This signal is emitted when the controller disconnects from the remote Low Energy device or vice versa. On iOS and macOS this signal is unreliable if the controller is in the PeripheralRole
. On Android the signal is emitted when the last connected device is disconnected. On BlueZ DBus backend the controller is considered disconnected when last client which has accessed the attributes has disconnected.
- PySide6.QtBluetooth.QLowEnergyController.discoverServices()#
Initiates the service discovery process.
The discovery progress is indicated via the serviceDiscovered()
signal. The discoveryFinished()
signal is emitted when the process has finished.
If the controller instance is not connected or the controller has performed the service discovery already this function will do nothing.
Note
Some platforms internally cache the service list of a device which was discovered in the past. This can be problematic if the remote device changed its list of services or their inclusion tree. If this behavior is a problem, the best workaround is to temporarily turn Bluetooth off. This causes a reset of the cache data. Currently Android exhibits such a cache behavior.
- PySide6.QtBluetooth.QLowEnergyController.discoveryFinished()#
This signal is emitted when the running service discovery finishes. The signal is not emitted if the discovery process finishes with an error.
This signal can only be emitted if the controller is in the CentralRole
.
See also
Returns the last occurred error or NoError
.
This signal is emitted when an error occurs. The newError
parameter describes the error that occurred.
See also
- PySide6.QtBluetooth.QLowEnergyController.errorString()#
- Return type:
str
Returns a textual representation of the last occurred error. The string is translated.
- PySide6.QtBluetooth.QLowEnergyController.localAddress()#
- Return type:
Returns the address of the local Bluetooth adapter being used for the communication.
If this class instance was requested to use the default adapter but there was no default adapter when creating this class instance, the returned QBluetoothAddress
will be null.
See also
- PySide6.QtBluetooth.QLowEnergyController.mtu()#
- Return type:
int
Returns the MTU size.
During connection setup, the ATT MTU size is negotiated. This method provides the result of this negotiation. It can be used to optimize packet sizes in some situations. The maximum amount of data which can be transferred in a single packet is mtu-3 bytes. 3 bytes are required for the ATT protocol header.
Before the connection setup and MTU negotiation, the default value of 23
will be returned.
Not every platform exposes the MTU value. On those platforms (e.g. Linux) this function always returns -1
.
If the controller is in the PeripheralRole
, there might be several central devices connected to it. In those cases this function returns the MTU of the last connection that was negotiated.
- PySide6.QtBluetooth.QLowEnergyController.mtuChanged(mtu)#
- Parameters:
mtu – int
This signal is emitted as a result of a successful MTU change. mtu
represents the new value.
Note
If the controller is in the PeripheralRole
, the MTU value is negotiated for each client/central device individually. Therefore this signal can be emitted several times in a row for one or several devices.
See also
- PySide6.QtBluetooth.QLowEnergyController.readRssi()#
readRssi() reads RSSI (received signal strength indicator) for a connected remote device. If the read was successful, the RSSI is then reported by rssiRead()
signal.
Note
Prior to calling readRssi(), this controller must be connected to a peripheral. This controller must be created using createCentral()
.
Note
In case Bluetooth backend you are using does not support reading RSSI, the errorOccurred()
signal is emitted with an error code RssiReadError
. At the moment platforms supporting reading RSSI include Android, iOS and macOS.
- PySide6.QtBluetooth.QLowEnergyController.remoteAddress()#
- Return type:
Returns the address of the remote Bluetooth Low Energy device.
For a controller in the CentralRole
, this value will always be the one passed in when the controller object was created. For a controller in the PeripheralRole
, this value is one of the currently connected client device addresses. This address will be invalid if the controller is not currently in the ConnectedState
.
- PySide6.QtBluetooth.QLowEnergyController.remoteAddressType()#
- Return type:
Returns the type of remoteAddress()
. By default, this value is initialized to PublicAddress
.
See also
- PySide6.QtBluetooth.QLowEnergyController.remoteDeviceUuid()#
- Return type:
Returns the unique identifier of the remote Bluetooth Low Energy device.
On macOS/iOS/tvOS CoreBluetooth does not expose/accept hardware addresses for LE devices; instead developers are supposed to use unique 128-bit UUIDs, generated by CoreBluetooth. These UUIDS will stay constant for the same central <-> peripheral pair and we use them when connecting to a remote device. For a controller in the CentralRole
, this value will always be the one passed in when the controller object was created. For a controller in the PeripheralRole
, this value is invalid.
- PySide6.QtBluetooth.QLowEnergyController.remoteName()#
- Return type:
str
Returns the name of the remote Bluetooth Low Energy device, if the controller is in the CentralRole
. Otherwise the result is unspecified.
- PySide6.QtBluetooth.QLowEnergyController.requestConnectionUpdate(parameters)#
- Parameters:
parameters –
PySide6.QtBluetooth.QLowEnergyConnectionParameters
Requests the controller to update the connection according to parameters
. If the request is successful, the connectionUpdated()
signal will be emitted with the actual new parameters. See the QLowEnergyConnectionParameters
class for more information on connection parameters.
Android only indirectly permits the adjustment of this parameter set. The connection parameters are separated into three categories (high, low & balanced priority). Each category implies a pre-configured set of values for minimumInterval()
, maximumInterval()
and latency()
. Although the connection request is an asynchronous operation, Android does not provide a callback stating the result of the request. This is an acknowledged Android bug. Due to this bug Android does not emit the connectionUpdated()
signal.
Note
Currently, this functionality is only implemented on Linux kernel backend and Android.
See also
Returns the role that this controller object is in.
The role is determined when constructing a QLowEnergyController
instance using createCentral()
or createPeripheral()
.
- PySide6.QtBluetooth.QLowEnergyController.rssiRead(rssi)#
- Parameters:
rssi –
qint16
This signal is emitted after successful read of RSSI (received signal strength indicator) for a connected remote device. rssi
parameter represents the new value.
See also
- PySide6.QtBluetooth.QLowEnergyController.serviceDiscovered(newService)#
- Parameters:
newService –
PySide6.QtBluetooth.QBluetoothUuid
This signal is emitted each time a new service is discovered. The newService
parameter contains the UUID of the found service.
This signal can only be emitted if the controller is in the CentralRole
.
See also
- PySide6.QtBluetooth.QLowEnergyController.services()#
- Return type:
Returns the list of services offered by the remote device, if the controller is in the CentralRole
. Otherwise, the result is unspecified.
The list contains all primary and secondary services.
See also
- PySide6.QtBluetooth.QLowEnergyController.setRemoteAddressType(type)#
- Parameters:
type –
RemoteAddressType
Sets the remote address type
. The type is required to connect to the remote Bluetooth Low Energy device.
This attribute is only required to be set on Linux/BlueZ systems with older Linux kernels (v3.3 or lower), or if CAP_NET_ADMIN is not set for the executable. The default value of the attribute is RandomAddress
.
Note
All other platforms handle this flag transparently and therefore applications can ignore it entirely. On Linux, the address type flag is not directly exposed by BlueZ although some use cases do require this information. The only way to detect the flag is via the Linux kernel’s Bluetooth Management API (kernel version 3.4+ required). This API requires CAP_NET_ADMIN capabilities though. If the local QtBluetooth process has this capability set QtBluetooth will use the API. This assumes that QBluetoothDeviceDiscoveryAgent
was used prior to calling connectToDevice()
.
See also
- PySide6.QtBluetooth.QLowEnergyController.startAdvertising(parameters, advertisingData[, scanResponseData=QLowEnergyAdvertisingData()])#
- Parameters:
parameters –
PySide6.QtBluetooth.QLowEnergyAdvertisingParameters
advertisingData –
PySide6.QtBluetooth.QLowEnergyAdvertisingData
scanResponseData –
PySide6.QtBluetooth.QLowEnergyAdvertisingData
Starts advertising the data given in advertisingData
and scanResponseData
, using the parameters set in parameters
. The controller has to be in the PeripheralRole
. If parameters
indicates that the advertisement should be connectable, then this function also starts listening for incoming client connections.
Providing scanResponseData
is not required, as it is not applicable for certain configurations of parameters
. advertisingData
and scanResponseData
are limited to 31 byte user data. If, for example, several 128bit uuids are added to advertisingData
, the advertised packets may not contain all uuids. The existing limit may have caused the truncation of uuids. In such cases scanResponseData
may be used for additional information.
On BlueZ DBus backend BlueZ decides if, and which data, to use in a scan response. Therefore all advertisement data is recommended to set in the main advertisingData
parameter. If both advertisement and scan response data is set, the scan response data is given precedence.
If this object is currently not in the UnconnectedState
, nothing happens.
See also
- PySide6.QtBluetooth.QLowEnergyController.state()#
- Return type:
Returns the current state of the controller.
See also
- PySide6.QtBluetooth.QLowEnergyController.stateChanged(state)#
- Parameters:
state –
ControllerState
This signal is emitted when the controller’s state changes. The new state
can also be retrieved via state()
.
See also
- PySide6.QtBluetooth.QLowEnergyController.stopAdvertising()#
Stops advertising, if this object is currently in the advertising state.
The controller has to be in the PeripheralRole
for this function to work. It does not invalidate services which have previously been added via addService()
.
See also