Connection Management
The Zephyr Bluetooth stack uses an abstraction called bt_conn
to represent connections to other devices. The internals of this struct
are not exposed to the application, but a limited amount of information
(such as the remote address) can be acquired using the
bt_conn_get_info()
API. Connection objects are reference
counted, and the application is expected to use the
bt_conn_ref()
API whenever storing a connection pointer for a
longer period of time, since this ensures that the object remains valid
(even if the connection would get disconnected). Similarly the
bt_conn_unref()
API is to be used when releasing a reference
to a connection.
A common mistake is to forget unreleasing a reference to a connection
object created by functions bt_conn_le_create()
and
bt_conn_le_create_synced()
. To protect against this, use the
CONFIG_BT_CONN_CHECK_NULL_BEFORE_CREATE
Kconfig option,
which forces these functions return an error if the connection pointer
passed to them is not NULL. This helps to spot such issues and avoid
sporadic bugs caused by not releasing the connection object.
An application may track connections by registering a
bt_conn_cb
struct using the bt_conn_cb_register()
or BT_CONN_CB_DEFINE
APIs. This struct lets the application
define callbacks for connection & disconnection events, as well as other
events related to a connection such as a change in the security level or
the connection parameters. When acting as a central the application will
also get hold of the connection object through the return value of the
bt_conn_le_create()
API.