pw_bluetooth_profiles#
Bluetooth profiles built on top of pw_bluetooth
Unstable C++
Attention
pw_bluetooth_profiles is under construction, depends on the experimental pw_bluetooth module and may see significant breaking API changes.
The pw_bluetooth_profiles
module provides a collection of implementations
for basic Bluetooth profiles built on top of the pw_bluetooth
module API.
These profiles are independent from each other
Device Information Service#
The device_info_service
target implements the Device Information Service
(DIS) as defined in the specification version 1.1. It exposes up to nine
different basic properties of the device such as the model, manufacturer or
serial number, all of which are optional. This module implements the GATT
server-side service (bluetooth::gatt::LocalServiceDelegate
) with the
following limitations:
The subset of properties exposed and their values are constant throughout the life of the service.
The subset of properties is defined at compile time, but the values may be defined at runtime before service initialization. For example, the serial number property might be different for different devices running the same code.
All property values must be available in memory while the service is published. Rather than using a callback mechanism to let the user produce the property value at run-time, this module expects those values to be readily available when initialized, but they can be stored in read-only memory.
Usage#
The main intended usage of the service consists on creating and publishing the service, leaving it published forever referencing the values passed on initialization.
The subset of properties exposed is a template parameter bit field
(DeviceInfo::Field
) and can’t be changed at run-time. The pw::span
values referenced in the DeviceInfo
struct must remain available after
initialization to avoid copying them to RAM in the service, but the
DeviceInfo
struct itself can be destroyed after initialization.
Example code:
using pw::bluetooth_profiles::DeviceInfo;
using pw::bluetooth_profiles::DeviceInfoService;
// Global serial number for the device, initialized elsewhere.
pw::InlineString serial_number(...);
// Select which fields to expose at compile-time with a constexpr template
// parameter.
constexpr auto kUsedFields = DeviceInfo::Field::kModelNumber |
DeviceInfo::Field::kSerialNumber |
DeviceInfo::Field::kSoftwareRevision;
// Create a DeviceInfo with the values. Values are referenced from the
// service, not copied, so they must remain available while the service is
// published.
DeviceInfo device_info = {};
device_info.model_number = pw::as_bytes(pw::span{"My Model"sv});
device_info.software_revision = pw::as_bytes(pw::span{REVISION_MACRO});
device_info.serial_number = pw::as_bytes(
pw::span(serial_number.data(), serial_number.size()));
DeviceInfoService<kUsedFields, pw::bluetooth::gatt::Handle{123}>
device_info_service{device_info};
device_info_service.PublishService(...);