A small refactor to start BLE V2 advertisement

PiperOrigin-RevId: 730619310
This commit is contained in:
Guogang Li
2025-02-24 15:32:04 -08:00
committed by Copybara-Service
parent 40fe5ec318
commit eb914ecc59
4 changed files with 556 additions and 614 deletions
+7 -4
View File
@@ -113,9 +113,9 @@ bool BleV2::IsAvailable() const {
}
ErrorOr<bool> BleV2::StartAdvertising(const std::string& service_id,
const ByteArray& advertisement_bytes,
PowerLevel power_level,
bool is_fast_advertisement) {
AdvertisingType advertising_type,
const ByteArray& advertisement_bytes) {
MutexLock lock(&mutex_);
if (advertisement_bytes.Empty()) {
@@ -157,7 +157,9 @@ ErrorOr<bool> BleV2::StartAdvertising(const std::string& service_id,
mediums::BleAdvertisement medium_advertisement = {
mediums::BleAdvertisement::Version::kV2,
mediums::BleAdvertisement::SocketVersion::kV2,
/*service_id_hash=*/is_fast_advertisement ? ByteArray{} : service_id_hash,
/*service_id_hash=*/advertising_type == AdvertisingType::kFast
? ByteArray{}
: service_id_hash,
advertisement_bytes,
mediums::bleutils::GenerateDeviceToken(),
psm};
@@ -171,7 +173,8 @@ ErrorOr<bool> BleV2::StartAdvertising(const std::string& service_id,
{service_id,
AdvertisingInfo{.medium_advertisement = medium_advertisement,
.power_level = power_level,
.is_fast_advertisement = is_fast_advertisement}});
.is_fast_advertisement =
advertising_type == AdvertisingType::kFast}});
// TODO(hais): need to update here after cros support RAII StartAdvertising.
// After all platforms support RAII StartAdvertising, then we can stop
+12 -5
View File
@@ -60,6 +60,14 @@ class BleV2 final {
using AcceptedConnectionCallback = absl::AnyInvocable<void(
BleV2Socket socket, const std::string& service_id)>;
// The type of the BLE advertising. In current implementation, we don't
// support multiple advertising types on a Medium instance.
enum class AdvertisingType : int {
kRegular = 0,
kFast = 1,
kDct = 2,
};
explicit BleV2(BluetoothRadio& bluetooth_radio);
~BleV2();
@@ -70,15 +78,14 @@ class BleV2 final {
// supports it.
//
// service_id - The service ID to track.
// power_level - The power level to use for the advertisement.
// advertising_type - The type of the BLE advertisement.
// advertisement_bytes - The connections BLE Advertisement used in
// advertising.
// power_level - The power level to use for the advertisement.
// is_fast_advertisement - True to use fast advertisements, which are smaller
// but much more efficient to discover.
ErrorOr<bool> StartAdvertising(const std::string& service_id,
const ByteArray& advertisement_bytes,
PowerLevel power_level,
bool is_fast_advertisement)
AdvertisingType advertising_type,
const ByteArray& advertisement_bytes)
ABSL_LOCKS_EXCLUDED(mutex_);
// Disables BLE advertising.
@@ -96,9 +96,9 @@ TEST_P(BleV2Test, CanConnect) {
accept_latch.CountDown();
}));
ble_server.StartAdvertising(service_id, advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/true);
ble_server.StartAdvertising(service_id, PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast,
advertisement_bytes);
BleV2Peripheral discovered_peripheral;
ble_client.StartScanning(
@@ -156,9 +156,9 @@ TEST_P(BleV2Test, CanCancelConnect) {
accept_latch.CountDown();
}));
ble_server.StartAdvertising(service_id, advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/true);
ble_server.StartAdvertising(service_id, PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast,
advertisement_bytes);
BleV2Peripheral discovered_peripheral;
ble_client.StartScanning(
@@ -247,8 +247,8 @@ TEST_F(BleV2Test, CanStartFastAdvertising) {
});
EXPECT_TRUE(ble_a.StartAdvertising(
std::string(kServiceIDA), advertisement_bytes, PowerLevel::kHighPower,
/*is_fast_advertisement=*/true));
std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast, advertisement_bytes));
EXPECT_TRUE(found_latch.Await(kWaitDuration).result());
EXPECT_TRUE(ble_a.StopAdvertising(std::string(kServiceIDA)));
ble_b.StopScanning(std::string(kServiceIDA));
@@ -266,9 +266,8 @@ TEST_F(BleV2Test, CanStartFastScanning) {
ByteArray advertisement_bytes((std::string(kAdvertisementString)));
CountDownLatch found_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/true);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast, advertisement_bytes);
EXPECT_TRUE(ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -314,8 +313,8 @@ TEST_F(BleV2Test, CanStartAdvertising) {
});
EXPECT_TRUE(ble_a.StartAdvertising(
std::string(kServiceIDA), advertisement_bytes, PowerLevel::kHighPower,
/*is_fast_advertisement=*/false));
std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes));
EXPECT_TRUE(found_latch.Await(kWaitDuration).result());
EXPECT_TRUE(ble_a.StopAdvertising(std::string(kServiceIDA)));
ble_b.StopScanning(std::string(kServiceIDA));
@@ -333,9 +332,8 @@ TEST_F(BleV2Test, CanStartScanning) {
ByteArray advertisement_bytes((std::string(kAdvertisementString)));
CountDownLatch found_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
EXPECT_TRUE(ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -391,11 +389,11 @@ TEST_F(BleV2Test, DestructWorksForStartAdvertisingAndScanningWithoutStop) {
// Device A starts advertising with service IDA and IDB.
EXPECT_TRUE(ble_a.StartAdvertising(
std::string(kServiceIDA), advertisement_bytes, PowerLevel::kHighPower,
/*is_fast_advertisement=*/true));
std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast, advertisement_bytes));
EXPECT_TRUE(ble_a.StartAdvertising(
std::string(kServiceIDB), advertisement_bytes, PowerLevel::kHighPower,
/*is_fast_advertisement=*/true));
std::string(kServiceIDB), PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast, advertisement_bytes));
// Device B starts scanning with service IDA and IDB
EXPECT_TRUE(ble_b.StartScanning(std::string(kServiceIDA),
@@ -419,9 +417,8 @@ TEST_F(BleV2Test, StartFastScanningDiscoverAndLostPeripheral) {
CountDownLatch found_latch(1);
CountDownLatch lost_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/true);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast, advertisement_bytes);
ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -468,9 +465,8 @@ TEST_F(BleV2Test,
CountDownLatch found_latch(1);
CountDownLatch lost_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/true);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kFast, advertisement_bytes);
ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -514,9 +510,8 @@ TEST_F(BleV2Test, StartScanningDiscoverAndLostPeripheral) {
CountDownLatch found_latch(1);
CountDownLatch lost_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -562,9 +557,8 @@ TEST_F(BleV2Test, StartScanningDiscoverButNoPeripheralLostAfterStopScanning) {
CountDownLatch found_latch(1);
CountDownLatch lost_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -650,9 +644,8 @@ TEST_F(BleV2Test, StartLegacyAdvertisingNotBlockedByRegularAdvertising) {
std::string service_id(kServiceIDA);
ByteArray advertisement_bytes((std::string(kAdvertisementString)));
ble_a.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_a.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
EXPECT_TRUE(ble_a.IsAdvertising(service_id));
EXPECT_TRUE(
ble_a.StartLegacyAdvertising(service_id, std::string(kLocalEndpointId),
@@ -732,9 +725,8 @@ TEST_F(BleV2Test, CanStartAsyncScanning) {
ByteArray advertisement_bytes((std::string(kAdvertisementString)));
CountDownLatch found_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
EXPECT_TRUE(ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -767,9 +759,8 @@ TEST_F(BleV2Test, StartAsyncScanningWithPlatformErrors) {
ByteArray advertisement_bytes((std::string(kAdvertisementString)));
CountDownLatch found_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
// Disable radio a to simulate platform error.
radio_a.Disable();
@@ -823,9 +814,8 @@ TEST_F(BleV2Test, StartAsyncScanningDiscoverAndLostPeripheral) {
CountDownLatch found_latch(1);
CountDownLatch lost_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
EXPECT_TRUE(ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -872,9 +862,8 @@ TEST_F(BleV2Test,
CountDownLatch found_latch(1);
CountDownLatch lost_latch(1);
ble_b.StartAdvertising(std::string(kServiceIDA), advertisement_bytes,
PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
ble_b.StartAdvertising(std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes);
EXPECT_TRUE(ble_a.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -924,11 +913,11 @@ TEST_F(BleV2Test, CanStartStopMultipleAsyncScanningWithDifferentServiceIds) {
CountDownLatch found_latch_b(1);
ble_advertiser_a.StartAdvertising(
std::string(kServiceIDA), advertisement_bytes_a, PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes_a);
ble_advertiser_b.StartAdvertising(
std::string(kServiceIDB), advertisement_bytes_b, PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
std::string(kServiceIDB), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes_b);
ble_scanner.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
@@ -985,11 +974,11 @@ TEST_F(BleV2Test, StartMultipleAsyncScanningDiscoverAndLostPeripheral) {
CountDownLatch lost_latch_b(1);
ble_advertiser_a.StartAdvertising(
std::string(kServiceIDA), advertisement_bytes_a, PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
std::string(kServiceIDA), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes_a);
ble_advertiser_b.StartAdvertising(
std::string(kServiceIDB), advertisement_bytes_b, PowerLevel::kHighPower,
/*is_fast_advertisement=*/false);
std::string(kServiceIDB), PowerLevel::kHighPower,
BleV2::AdvertisingType::kRegular, advertisement_bytes_b);
ble_scanner.StartScanning(
std::string(kServiceIDA), PowerLevel::kHighPower,
File diff suppressed because it is too large Load Diff