mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-16 15:36:12 -04:00
Add client-side connection APIs for ble l2cap
PiperOrigin-RevId: 741061740
This commit is contained in:
committed by
Copybara-Service
parent
04b2f9cfc6
commit
aefcc4a8b2
@@ -159,6 +159,7 @@ cc_library(
|
||||
"//connections/implementation/mediums:webrtc_utils",
|
||||
"//connections/implementation/mediums/advertisements:dct_advertisement",
|
||||
"//connections/implementation/mediums/advertisements:util",
|
||||
"//connections/implementation/mediums/ble_v2:ble_advertisement_header",
|
||||
"//connections/implementation/proto:offline_wire_formats_cc_proto",
|
||||
"//connections/v3:v3_types",
|
||||
"//internal/analytics:event_logger",
|
||||
|
||||
@@ -836,6 +836,43 @@ ErrorOr<BleV2Socket> BleV2::Connect(const std::string& service_id,
|
||||
return socket;
|
||||
}
|
||||
|
||||
ErrorOr<BleL2capSocket> BleV2::ConnectOverL2cap(
|
||||
const std::string& service_id, const BleV2Peripheral& peripheral,
|
||||
CancellationFlag* cancellation_flag) {
|
||||
MutexLock lock(&mutex_);
|
||||
|
||||
if (service_id.empty()) {
|
||||
LOG(WARNING) << "Refusing to create client Ble L2CAP socket because "
|
||||
"service_id is empty.";
|
||||
return {Error(OperationResultCode::NEARBY_LOCAL_CLIENT_STATE_WRONG)};
|
||||
}
|
||||
|
||||
if (!IsAvailableLocked()) {
|
||||
LOG(INFO) << "Can't create client Ble L2CAP socket [service_id="
|
||||
<< service_id << "]; Ble isn't available.";
|
||||
return {Error(OperationResultCode::MEDIUM_UNAVAILABLE_BLE_NOT_AVAILABLE)};
|
||||
}
|
||||
|
||||
if (cancellation_flag->Cancelled()) {
|
||||
LOG(WARNING) << "Can't create client Ble L2CAP socket due to cancel.";
|
||||
return {Error(OperationResultCode::
|
||||
CLIENT_CANCELLATION_CANCEL_BLE_OUTGOING_CONNECTION)};
|
||||
}
|
||||
|
||||
BleL2capSocket socket = medium_.ConnectOverL2cap(
|
||||
service_id, PowerLevelToTxPowerLevel(PowerLevel::kHighPower), peripheral,
|
||||
cancellation_flag);
|
||||
|
||||
if (!socket.IsValid()) {
|
||||
LOG(WARNING) << "Failed to Connect via Ble L2CAP [service_id=" << service_id
|
||||
<< "]";
|
||||
return {Error(OperationResultCode::
|
||||
CONNECTIVITY_L2CAP_CLIENT_SOCKET_CREATION_FAILURE)};
|
||||
}
|
||||
|
||||
return socket;
|
||||
}
|
||||
|
||||
bool BleV2::IsAvailableLocked() const { return medium_.IsValid(); }
|
||||
|
||||
bool BleV2::IsAdvertisingLocked(const std::string& service_id) const {
|
||||
|
||||
@@ -182,6 +182,13 @@ class BleV2 final {
|
||||
CancellationFlag* cancellation_flag)
|
||||
ABSL_LOCKS_EXCLUDED(mutex_);
|
||||
|
||||
// Establishes connection to Ble peripheral.
|
||||
// Returns socket instance. On success, BleSocket.IsValid() return true.
|
||||
ErrorOr<BleL2capSocket> ConnectOverL2cap(const std::string& service_id,
|
||||
const BleV2Peripheral& peripheral,
|
||||
CancellationFlag* cancellation_flag)
|
||||
ABSL_LOCKS_EXCLUDED(mutex_);
|
||||
|
||||
// Returns true if this object owns a valid platform implementation.
|
||||
bool IsMediumValid() const ABSL_LOCKS_EXCLUDED(mutex_) {
|
||||
MutexLock lock(&mutex_);
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#include "connections/implementation/mediums/advertisements/advertisement_util.h"
|
||||
#include "connections/implementation/mediums/advertisements/dct_advertisement.h"
|
||||
#include "connections/implementation/mediums/ble_v2.h"
|
||||
#include "connections/implementation/mediums/ble_v2/ble_advertisement_header.h"
|
||||
#include "connections/implementation/mediums/bluetooth_classic.h"
|
||||
#include "connections/implementation/mediums/mediums.h"
|
||||
#include "connections/implementation/mediums/utils.h"
|
||||
@@ -2715,6 +2716,36 @@ BasePcpHandler::ConnectImplResult P2pClusterPcpHandler::BleV2ConnectImpl(
|
||||
VLOG(1) << "Client " << client->GetClientId()
|
||||
<< " is attempting to connect to (" << peripheral.ToReadableString()
|
||||
<< ") over BLE.";
|
||||
|
||||
if (NearbyFlags::GetInstance().GetBoolFlag(
|
||||
config_package_nearby::nearby_connections_feature::kEnableBleL2cap) &&
|
||||
peripheral.GetPsm() !=
|
||||
mediums::BleAdvertisementHeader::kDefaultPsmValue) {
|
||||
ErrorOr<BleL2capSocket> ble_l2cap_socket_result =
|
||||
ble_v2_medium_.ConnectOverL2cap(
|
||||
endpoint->service_id, peripheral,
|
||||
client->GetCancellationFlag(endpoint->endpoint_id));
|
||||
if (!ble_l2cap_socket_result.has_error()) {
|
||||
LOG(INFO) << "In BleV2ConnectImpl(), connected to Ble L2CAP device "
|
||||
<< absl::BytesToHexString(peripheral.GetId().data())
|
||||
<< " for endpoint(id=" << endpoint->endpoint_id << ").";
|
||||
auto channel = std::make_unique<BleL2capEndpointChannel>(
|
||||
endpoint->service_id, /*channel_name=*/endpoint->endpoint_id,
|
||||
ble_l2cap_socket_result.value());
|
||||
return BasePcpHandler::ConnectImplResult{
|
||||
.medium = BLE,
|
||||
.status = {Status::kSuccess},
|
||||
.operation_result_code = OperationResultCode::DETAIL_SUCCESS,
|
||||
.endpoint_channel = std::move(channel),
|
||||
};
|
||||
} else {
|
||||
LOG(WARNING) << "In BleV2ConnectImpl(), failed to connect to Ble L2CAP "
|
||||
"device "
|
||||
<< absl::BytesToHexString(peripheral.GetId().data())
|
||||
<< " for endpoint(id=" << endpoint->endpoint_id << ").";
|
||||
}
|
||||
}
|
||||
|
||||
ErrorOr<BleV2Socket> ble_socket_result = ble_v2_medium_.Connect(
|
||||
endpoint->service_id, peripheral,
|
||||
client->GetCancellationFlag(endpoint->endpoint_id));
|
||||
|
||||
Reference in New Issue
Block a user