Bluetooth

The Fuchsia Bluetooth system aims to provide a dual-mode implementation of the Bluetooth Host Subsystem (5.0+) supporting a framework for developing Low Energy and Traditional profiles.

Getting Started

API Examples

Examples using Fuchsia's Bluetooth Low Energy APIs for all four LE roles can be found in Garnet and Topaz. All of these are currently compiled into Fuchsia by default.

  • LE scanner: see eddystone_agent. This is a suggestion agent that proposes URL links that are obtained from Eddystone beacons. This is built in topaz by default.
  • LE broadcaster: see eddystone_advertiser. This is a Flutter module that can advertise any entered URL as an Eddystone beacon.
  • LE peripheral: see the ble_rect and ble_battery_service examples.
  • LE central: see ble_scanner.

Control API

Dual-mode (LE + Classic) GAP operations that are typically exposed to privileged clients are performed using the control.fidl API. This API is intended for managing local adapters, device discovery & discoverability, pairing/bonding, and other settings.

bluetoothcli is a command-line front-end for this API:

$ bluetoothcli
bluetooth> list-adapters
  Adapter 0
    id: bf004a8b-d691-4298-8c79-130b83e047a1
    address: 00:1A:7D:DA:0A
bluetooth>

We also have a Flutter module that acts as a Bluetooth system menu based on this API at topaz/app/bluetooth_settings.

Tools

See the bluetooth_tools package for more information on available command line tools for testing/debugging.

Testing

The bluetooth_tests package contains Bluetooth test binaries. This package is defined in the top level BUILD file.

Host subsystem tests are compiled into a single GoogleTest binary, which gets installed at /system/test/bluetooth_unittests.

To run all tests:

$ /system/test/bluetooth_unittests

Use the --gtest_filter flag to run a subset of the tests:

# This only runs the L2CAP unit tests.
$ /system/test/bluetooth_unittests --gtest_filter=L2CAP_*

Use the --verbose flag to set log verbosity:

# This logs all messages logged using FXL_VLOG (up to level 2)
$ /system/test/bluetooth_unittests --verbose=2

TODO(armansito): Describe integration tests

Log Verbosity

bin/bluetooth

The Bluetooth system service is invoked by sysmgr to resolve service requests. The mapping between environment service names and their handlers is defined in bin/sysmgr/config/services.config. Add the --verbose option to the Bluetooth entries to increase verbosity, for example:

...
    "bluetooth::control::AdapterManager": [ "bluetooth", "--verbose=2" ],
    "bluetooth::gatt::Server": [ "bluetooth", "--verbose=2" ],
    "bluetooth::low_energy::Central": [ "bluetooth", "--verbose=2" ],
    "bluetooth::low_energy::Peripheral": [ "bluetooth", "--verbose=2" ],
...

bthost

The bthost driver currently uses the FXL logging system. To enable maximum log verbosity, set the BT_DEBUG macro to 1 in drivers/bluetooth/host/driver.cc.