Remove BlePeripheral usage from framework.

PiperOrigin-RevId: 759337592
This commit is contained in:
Francis Tsui
2025-05-15 15:59:33 -07:00
committed by Copybara-Service
parent 9853d62532
commit 959322177f
6 changed files with 67 additions and 105 deletions
+15 -19
View File
@@ -23,7 +23,6 @@
#include <vector>
#include "absl/base/thread_annotations.h"
#include "absl/container/flat_hash_set.h"
#include "absl/functional/any_invocable.h"
#include "absl/strings/escaping.h"
#include "absl/strings/str_format.h"
@@ -462,27 +461,24 @@ class BleV2Medium final {
};
struct ServerGattConnectionCallback {
using BlePeripheral = api::ble_v2::BlePeripheral;
using GattCharacteristic = api::ble_v2::GattCharacteristic;
using ReadValueCallback =
api::ble_v2::ServerGattConnectionCallback::ReadValueCallback;
using WriteValueCallback =
api::ble_v2::ServerGattConnectionCallback::WriteValueCallback;
absl::AnyInvocable<void(const GattCharacteristic& characteristic)>
absl::AnyInvocable<void(
const api::ble_v2::GattCharacteristic& characteristic)>
characteristic_subscription_cb =
nearby::DefaultCallback<const GattCharacteristic&>();
absl::AnyInvocable<void(const GattCharacteristic& characteristic)>
nearby::DefaultCallback<const api::ble_v2::GattCharacteristic&>();
absl::AnyInvocable<void(
const api::ble_v2::GattCharacteristic& characteristic)>
characteristic_unsubscription_cb =
nearby::DefaultCallback<const GattCharacteristic&>();
absl::AnyInvocable<void(const BlePeripheral::UniqueId remote_device_id,
const GattCharacteristic& characteristic,
int offset, ReadValueCallback callback)>
nearby::DefaultCallback<const api::ble_v2::GattCharacteristic&>();
absl::AnyInvocable<void(
const api::ble_v2::BlePeripheral::UniqueId remote_device_id,
const api::ble_v2::GattCharacteristic& characteristic, int offset,
api::ble_v2::ServerGattConnectionCallback::ReadValueCallback callback)>
on_characteristic_read_cb;
absl::AnyInvocable<void(const BlePeripheral::UniqueId remote_device_id,
const GattCharacteristic& characteristic,
int offset, absl::string_view data,
WriteValueCallback callback)>
absl::AnyInvocable<void(
const api::ble_v2::BlePeripheral::UniqueId remote_device_id,
const api::ble_v2::GattCharacteristic& characteristic, int offset,
absl::string_view data,
api::ble_v2::ServerGattConnectionCallback::WriteValueCallback callback)>
on_characteristic_write_cb;
};
// TODO(b/231318879): Remove this wrapper callback and use impl callback if
+1 -1
View File
@@ -715,7 +715,7 @@ TEST_F(BleV2MediumTest, GattClientOperatiosOnCharacteristic) {
[&](const api::ble_v2::BlePeripheral::UniqueId remote_device_id,
const api::ble_v2::GattCharacteristic& characteristic,
int offset, absl::string_view data,
BleV2Medium::ServerGattConnectionCallback::WriteValueCallback
api::ble_v2::ServerGattConnectionCallback::WriteValueCallback
callback) {
written_data = data;
callback(absl::OkStatus());
+16 -16
View File
@@ -38,7 +38,6 @@
#include "internal/platform/implementation/bluetooth_adapter.h"
#include "internal/platform/implementation/g3/bluetooth_adapter.h"
#include "internal/platform/logging.h"
#include "internal/platform/mac_address.h"
#include "internal/platform/medium_environment.h"
#include "internal/platform/prng.h"
#include "internal/platform/uuid.h"
@@ -74,8 +73,12 @@ api::ble_v2::BlePeripheral::UniqueId BleV2Socket::GetRemotePeripheralId() {
remote_socket->adapter_->GetBleV2Medium() == nullptr) {
return 0LL;
}
return dynamic_cast<BleV2Medium*>(remote_socket->adapter_->GetBleV2Medium())
->GetPeripheral().GetUniqueId();
BleV2Medium* medium =
dynamic_cast<BleV2Medium*>(remote_socket->adapter_->GetBleV2Medium());
if (medium == nullptr) {
return 0LL;
}
return medium->GetAdapter().GetUniqueId();
}
std::unique_ptr<api::ble_v2::BleSocket> BleV2ServerSocket::Accept() {
@@ -146,13 +149,14 @@ Exception BleV2ServerSocket::DoClose() {
}
BleV2Medium::BleV2Medium(api::BluetoothAdapter& adapter)
: adapter_(static_cast<BluetoothAdapter*>(&adapter)),
peripheral_(adapter_->GetUniqueId(), adapter_->mac_address()) {
: adapter_(dynamic_cast<BluetoothAdapter*>(&adapter)) {
CHECK(adapter_);
adapter_->SetBleV2Medium(this);
is_extended_advertisements_available_ =
MediumEnvironment::Instance().IsBleExtendedAdvertisementsAvailable();
MediumEnvironment::Instance().RegisterBleV2Medium(*this, &peripheral_);
MediumEnvironment::Instance().RegisterBleV2Medium(*this,
adapter_->GetUniqueId());
}
BleV2Medium::~BleV2Medium() {
@@ -179,7 +183,7 @@ bool BleV2Medium::StartAdvertising(
absl::MutexLock lock(&mutex_);
MediumEnvironment::Instance().UpdateBleV2MediumForAdvertising(
/*enabled=*/true, *this, GetPeripheral(), advertising_data);
/*enabled=*/true, *this, adapter_->GetUniqueId(), advertising_data);
return true;
}
@@ -189,7 +193,7 @@ bool BleV2Medium::StopAdvertising() {
BleAdvertisementData empty_advertisement_data = {};
MediumEnvironment::Instance().UpdateBleV2MediumForAdvertising(
/*enabled=*/false, *this, /*mutable=*/GetPeripheral(),
/*enabled=*/false, *this, adapter_->GetUniqueId(),
empty_advertisement_data);
return true;
}
@@ -217,7 +221,7 @@ std::unique_ptr<BleV2Medium::AdvertisingSession> BleV2Medium::StartAdvertising(
}
absl::MutexLock lock(&mutex_);
MediumEnvironment::Instance().UpdateBleV2MediumForAdvertising(
/*enabled=*/true, *this, GetPeripheral(), advertising_data);
/*enabled=*/true, *this, adapter_->GetUniqueId(), advertising_data);
return std::make_unique<AdvertisingSession>(
AdvertisingSession{.stop_advertising = [this] {
return StopAdvertising()
@@ -353,12 +357,8 @@ BleV2Medium::GattServer::GattServer(
BleV2Medium& medium, api::ble_v2::ServerGattConnectionCallback callback)
: medium_(medium), callback_(std::move(callback)) {
BluetoothAdapter& adapter = medium.GetAdapter();
MacAddress address;
MacAddress::FromString(adapter.GetMacAddress(), address);
ble_peripheral_ = api::ble_v2::BlePeripheral(adapter.GetUniqueId(), address);
ble_peripheral_.SetPlatformData(&adapter);
MediumEnvironment::Instance().RegisterGattServer(medium_, &ble_peripheral_,
lender_.GetBorrowable());
MediumEnvironment::Instance().RegisterGattServer(
medium_, adapter.GetUniqueId(), lender_.GetBorrowable());
}
BleV2Medium::GattServer::~GattServer() {
@@ -736,7 +736,7 @@ std::unique_ptr<api::ble_v2::BleSocket> BleV2Medium::Connect(
CancellationFlag* cancellation_flag) {
LOG(INFO) << "G3 Ble Connect [self]: medium=" << this
<< ", adapter=" << &GetAdapter()
<< ", peripheral=" << &GetPeripheral()
<< ", peripheral id=" << adapter_->GetUniqueId()
<< ", service_id=" << service_id;
// First, find an instance of remote medium, that exposed this peripheral.
BleV2Medium* remote_medium = dynamic_cast<BleV2Medium*>(
@@ -190,8 +190,6 @@ class BleV2Medium : public api::ble_v2::BleMedium {
BluetoothAdapter& GetAdapter() { return *adapter_; }
api::ble_v2::BlePeripheral& GetPeripheral() { return peripheral_; }
private:
class GattClient;
// A concrete implementation for GattServer.
@@ -251,7 +249,6 @@ class BleV2Medium : public api::ble_v2::BleMedium {
absl::Mutex mutex_;
BleV2Medium& medium_;
api::ble_v2::ServerGattConnectionCallback callback_;
api::ble_v2::BlePeripheral ble_peripheral_;
absl::flat_hash_map<api::ble_v2::GattCharacteristic,
absl::StatusOr<ByteArray>>
characteristics_ ABSL_GUARDED_BY(mutex_);
@@ -308,10 +305,6 @@ class BleV2Medium : public api::ble_v2::BleMedium {
bool IsStopped(Borrowable<api::ble_v2::GattServer*> server);
absl::Mutex mutex_;
BluetoothAdapter* adapter_; // Our device adapter; read-only.
api::ble_v2::BlePeripheral peripheral_;
absl::flat_hash_map<api::ble_v2::BlePeripheral::UniqueId,
std::unique_ptr<api::ble_v2::BlePeripheral>>
remote_peripherals_ ABSL_GUARDED_BY(mutex_);
absl::flat_hash_map<std::string, BleV2ServerSocket*> server_sockets_
ABSL_GUARDED_BY(mutex_);
absl::flat_hash_set<std::pair<Uuid, std::uint32_t>>
+28 -51
View File
@@ -244,37 +244,14 @@ api::BluetoothDevice* MediumEnvironment::FindBluetoothDevice(
}
api::ble_v2::BleMedium* MediumEnvironment::FindBleV2Medium(
absl::string_view address) {
api::ble_v2::BleMedium* device = nullptr;
CountDownLatch latch(1);
LOG(INFO) << "FindBleV2Medium " << address;
RunOnMediumEnvironmentThread([&]() {
for (auto& item : ble_v2_mediums_) {
auto* medium = item.first;
auto* peripheral = item.second.ble_peripheral;
if (peripheral != nullptr && peripheral->GetAddress() == address) {
device = medium;
break;
}
}
latch.CountDown();
});
latch.Await();
if (device == nullptr) {
LOG(INFO) << "FindBleV2Medium, not found: " << address;
}
return device;
}
api::ble_v2::BleMedium* MediumEnvironment::FindBleV2Medium(uint64_t id) {
api::ble_v2::BlePeripheral::UniqueId id) {
api::ble_v2::BleMedium* device = nullptr;
CountDownLatch latch(1);
LOG(INFO) << "FindBleV2Medium " << id;
RunOnMediumEnvironmentThread([&]() {
for (auto& item : ble_v2_mediums_) {
auto* medium = item.first;
auto* peripheral = item.second.ble_peripheral;
if (peripheral != nullptr && peripheral->GetUniqueId() == id) {
if (item.second.ble_peripheral_id == id) {
device = medium;
break;
}
@@ -313,22 +290,22 @@ void MediumEnvironment::OnBlePeripheralStateChanged(
void MediumEnvironment::OnBleV2PeripheralStateChanged(
bool enabled, BleV2MediumContext& context, const Uuid& service_id,
const api::ble_v2::BleAdvertisementData& ble_advertisement_data,
api::ble_v2::BlePeripheral& peripheral) {
api::ble_v2::BlePeripheral::UniqueId peripheral_id) {
if (!enabled_) return;
LOG(INFO) << "OnBleServiceStateChanged [peripheral impl=" << &peripheral
LOG(INFO) << "OnBleServiceStateChanged [peripheral id=" << peripheral_id
<< "]; medium_context=" << &context
<< "; notify=" << enable_notifications_.load();
if (!enable_notifications_) return;
LOG(INFO) << "[Run] OnBleServiceStateChanged [peripheral impl=" << &peripheral
LOG(INFO) << "[Run] OnBleServiceStateChanged [peripheral id=" << peripheral_id
<< "]; context=" << &context << "; notify=" << enabled;
for (auto& element : context.scan_callback_map) {
if (element.first.first == service_id) {
if (enabled) {
element.second.advertisement_found_cb(peripheral.GetUniqueId(),
element.second.advertisement_found_cb(peripheral_id,
ble_advertisement_data);
} else {
element.second.advertisement_lost_cb(peripheral.GetUniqueId());
element.second.advertisement_lost_cb(peripheral_id);
}
}
}
@@ -643,21 +620,22 @@ void MediumEnvironment::CallBleAcceptedConnectionCallback(
}
void MediumEnvironment::RegisterBleV2Medium(
api::ble_v2::BleMedium& medium, api::ble_v2::BlePeripheral* peripheral) {
api::ble_v2::BleMedium& medium,
api::ble_v2::BlePeripheral::UniqueId peripheral_id) {
if (!enabled_) return;
RunOnMediumEnvironmentThread([this, &medium, peripheral]() {
RunOnMediumEnvironmentThread([this, &medium, peripheral_id]() {
ble_v2_mediums_.insert(
{&medium, BleV2MediumContext{.ble_peripheral = peripheral}});
{&medium, BleV2MediumContext{.ble_peripheral_id = peripheral_id}});
LOG(INFO) << "Registered: BLE V2 medium:" << &medium;
});
}
void MediumEnvironment::UpdateBleV2MediumForAdvertising(
bool enabled, api::ble_v2::BleMedium& medium,
api::ble_v2::BlePeripheral& peripheral,
api::ble_v2::BlePeripheral::UniqueId peripheral_id,
const api::ble_v2::BleAdvertisementData& advertisement_data) {
if (!enabled_) return;
RunOnMediumEnvironmentThread([this, &medium, &peripheral,
RunOnMediumEnvironmentThread([this, &medium, peripheral_id,
advertisement_data = advertisement_data,
enabled]() {
auto it = ble_v2_mediums_.find(&medium);
@@ -667,13 +645,13 @@ void MediumEnvironment::UpdateBleV2MediumForAdvertising(
return;
}
auto& context = it->second;
context.ble_peripheral = &peripheral;
context.ble_peripheral_id = peripheral_id;
context.advertising = enabled;
context.advertisement_data = advertisement_data;
LOG(INFO) << "UpdateBleV2MediumForAdvertising: this=" << this
<< ", medium=" << &medium << ", medium_context=" << &context
<< ", peripheral=" << &peripheral << ", enabled=" << enabled;
<< ", peripheral id=" << peripheral_id << ", enabled=" << enabled;
for (auto& medium_info : ble_v2_mediums_) {
const api::ble_v2::BleMedium* remote_medium = medium_info.first;
@@ -703,11 +681,11 @@ void MediumEnvironment::UpdateBleV2MediumForAdvertising(
<< remote_medium
<< ", remote_medium_context=" << &remote_context
<< ", remote_context.peripheral="
<< remote_context.ble_peripheral
<< remote_context.ble_peripheral_id
<< ". Ready to call OnBleV2PeripheralStateChanged.";
OnBleV2PeripheralStateChanged(
enabled, remote_context, remote_scanning_service_uuid,
context.advertisement_data, *context.ble_peripheral);
context.advertisement_data, context.ble_peripheral_id);
}
}
});
@@ -761,7 +739,7 @@ void MediumEnvironment::UpdateBleV2MediumForScanning(
<< ". Ready to call OnBleV2PeripheralStateChanged.";
OnBleV2PeripheralStateChanged(enabled, context, scanning_service_uuid,
remote_context.advertisement_data,
*remote_context.ble_peripheral);
remote_context.ble_peripheral_id);
}
}
} else {
@@ -1289,10 +1267,11 @@ std::optional<FakeClock*> MediumEnvironment::GetSimulatedClock() {
}
void MediumEnvironment::RegisterGattServer(
api::ble_v2::BleMedium& medium, api::ble_v2::BlePeripheral* peripheral,
api::ble_v2::BleMedium& medium,
api::ble_v2::BlePeripheral::UniqueId peripheral_id,
Borrowable<api::ble_v2::GattServer*> gatt_server) {
if (!enabled_) return;
RunOnMediumEnvironmentThread([this, &medium, peripheral, gatt_server]() {
RunOnMediumEnvironmentThread([this, &medium, peripheral_id, gatt_server]() {
auto it = ble_v2_mediums_.find(&medium);
if (it == ble_v2_mediums_.end()) {
LOG(WARNING) << "Register GattServer failed. There is no medium"
@@ -1303,8 +1282,8 @@ void MediumEnvironment::RegisterGattServer(
CHECK_EQ(context.gatt_server, nullptr);
context.gatt_server =
std::make_unique<Borrowable<api::ble_v2::GattServer*>>(gatt_server);
context.ble_peripheral = peripheral;
LOG(INFO) << "Registered: GattServer for " << peripheral->GetAddress()
context.ble_peripheral_id = peripheral_id;
LOG(INFO) << "Registered: GattServer for peripheral id:" << peripheral_id
<< " on medium:" << &medium;
});
}
@@ -1322,11 +1301,11 @@ void MediumEnvironment::UnregisterGattServer(api::ble_v2::BleMedium& medium) {
return;
}
auto& context = it->second;
LOG(INFO) << "Unregistered GattServer for "
<< context.ble_peripheral->GetAddress()
LOG(INFO) << "Unregistered GattServer for peripheral id:"
<< context.ble_peripheral_id
<< " on medium:" << &medium;
context.gatt_server = nullptr;
context.ble_peripheral = nullptr;
context.ble_peripheral_id = 0LL;
latch.CountDown();
});
latch.Await();
@@ -1340,10 +1319,8 @@ Borrowable<api::ble_v2::GattServer*> MediumEnvironment::GetGattServer(
RunOnMediumEnvironmentThread([&]() {
for (const auto& medium_info : ble_v2_mediums_) {
const BleV2MediumContext& remote_context = medium_info.second;
const api::ble_v2::BlePeripheral* ble_peripheral =
remote_context.ble_peripheral;
if (remote_context.gatt_server != nullptr && ble_peripheral != nullptr &&
(ble_peripheral->GetUniqueId() == peripheral_id)) {
if (remote_context.gatt_server != nullptr &&
remote_context.ble_peripheral_id == peripheral_id) {
if (remote_context.gatt_server == nullptr) {
break;
}
+7 -11
View File
@@ -26,7 +26,6 @@
#include "absl/container/flat_hash_map.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "absl/types/optional.h"
#include "internal/base/observer_list.h"
#include "internal/platform/borrowable.h"
#include "internal/platform/implementation/awdl.h"
@@ -163,9 +162,6 @@ class MediumEnvironment {
// Returns a Bluetooth Device object matching given mac address to nullptr.
api::BluetoothDevice* FindBluetoothDevice(const std::string& mac_address);
api::ble_v2::BlePeripheral* FindBleV2Peripheral(
absl::string_view mac_address);
const EnvironmentConfig& GetEnvironmentConfig();
#ifndef NO_WEBRTC
// Registers |message_callback| to receive messages sent to device with id
@@ -242,13 +238,13 @@ class MediumEnvironment {
// The registered `medium` must refer to a valid instance that outlives this
// object.
void RegisterBleV2Medium(api::ble_v2::BleMedium& medium,
api::ble_v2::BlePeripheral* peripheral);
api::ble_v2::BlePeripheral::UniqueId peripheral_id);
// Updates advertising info to indicate the current medium is exposing
// advertising event.
void UpdateBleV2MediumForAdvertising(
bool enabled, api::ble_v2::BleMedium& medium,
api::ble_v2::BlePeripheral& peripheral,
api::ble_v2::BlePeripheral::UniqueId peripheral_id,
const api::ble_v2::BleAdvertisementData& advertisement_data);
// Updates discovery callback info to allow for dispatch of discovery events.
@@ -379,11 +375,11 @@ class MediumEnvironment {
std::optional<FakeClock*> GetSimulatedClock();
api::ble_v2::BleMedium* FindBleV2Medium(absl::string_view address);
api::ble_v2::BleMedium* FindBleV2Medium(uint64_t id);
api::ble_v2::BleMedium* FindBleV2Medium(
api::ble_v2::BlePeripheral::UniqueId id);
void RegisterGattServer(api::ble_v2::BleMedium& medium,
api::ble_v2::BlePeripheral* peripheral,
api::ble_v2::BlePeripheral::UniqueId peripheral_id,
Borrowable<api::ble_v2::GattServer*> gatt_server);
void UnregisterGattServer(api::ble_v2::BleMedium& medium);
@@ -447,7 +443,7 @@ class MediumEnvironment {
absl::flat_hash_map<std::pair<Uuid, std::uint32_t>, BleScanCallback>
scan_callback_map;
// using the same ble peripheral for different advertisement.
api::ble_v2::BlePeripheral* ble_peripheral;
api::ble_v2::BlePeripheral::UniqueId ble_peripheral_id;
api::ble_v2::BleAdvertisementData advertisement_data;
bool advertising = false;
bool scanning = false;
@@ -518,7 +514,7 @@ class MediumEnvironment {
void OnBleV2PeripheralStateChanged(
bool enabled, BleV2MediumContext& context, const Uuid& service_id,
const api::ble_v2::BleAdvertisementData& ble_advertisement_data,
api::ble_v2::BlePeripheral& peripheral);
api::ble_v2::BlePeripheral::UniqueId peripheral_id);
void OnWifiLanServiceStateChanged(WifiLanMediumContext& info,
const NsdServiceInfo& service_info,