Wi-Fi Direct Service Implementation(7)

PiperOrigin-RevId: 834584965
This commit is contained in:
hai007
2025-11-19 21:45:43 -08:00
committed by Copybara-Service
parent 7bf001a8c9
commit ea2a651911
35 changed files with 559 additions and 339 deletions
@@ -19,12 +19,14 @@
#include <string>
#include <utility>
#include "absl/functional/any_invocable.h"
#include "absl/log/check.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
#include "absl/strings/string_view.h"
#include "absl/synchronization/mutex.h"
#include "internal/platform/cancellation_flag.h"
#include "internal/platform/cancellation_flag_listener.h"
#include "internal/platform/exception.h"
#include "internal/platform/implementation/wifi_direct.h"
#include "internal/platform/logging.h"
@@ -110,6 +112,14 @@ Exception WifiDirectServerSocket::DoClose() {
return {Exception::kSuccess};
}
void WifiDirectServerSocket::PopulateWifiDirectCredentials(
WifiDirectCredentials& wifi_direct_credentials) {
absl::MutexLock lock(mutex_);
wifi_direct_credentials.SetGateway(ip_address_);
wifi_direct_credentials.SetPort(port_);
}
// Code for WifiDirectMedium
WifiDirectMedium::WifiDirectMedium() {
auto& env = MediumEnvironment::Instance();
@@ -125,13 +135,13 @@ bool WifiDirectMedium::StartWifiDirect(
WifiDirectCredentials* wifi_direct_credentials) {
absl::MutexLock lock(mutex_);
std::string ssid = absl::StrCat("DIRECT-", Prng().NextUint32());
wifi_direct_credentials->SetSSID(ssid);
std::string password = absl::StrFormat("%08x", Prng().NextUint32());
wifi_direct_credentials->SetPassword(password);
std::string service_name = absl::StrCat("NC-", Prng().NextUint32());
wifi_direct_credentials->SetServiceName(service_name);
std::string pin = absl::StrFormat("%04x", Prng().NextUint32());
wifi_direct_credentials->SetPin(pin);
LOG(INFO) << "G3 StartWifiDirect GO: ssid=" << ssid
<< ", password:" << password;
LOG(INFO) << "G3 StartWifiDirect GO: service_name:" << service_name
<< ", pin:" << pin;
auto& env = MediumEnvironment::Instance();
env.UpdateWifiDirectMediumForStartOrConnect(*this, wifi_direct_credentials,
@@ -152,24 +162,24 @@ bool WifiDirectMedium::StopWifiDirect() {
}
bool WifiDirectMedium::ConnectWifiDirect(
WifiDirectCredentials* wifi_direct_credentials) {
const WifiDirectCredentials& wifi_direct_credentials) {
absl::MutexLock lock(mutex_);
LOG(INFO) << "G3 ConnectWifiDirect : ssid="
<< wifi_direct_credentials->GetSSID()
<< ", password:" << wifi_direct_credentials->GetPassword();
LOG(INFO) << "G3 ConnectWifiDirect : service_name:"
<< wifi_direct_credentials.GetServiceName()
<< ", pin:" << wifi_direct_credentials.GetPin();
auto& env = MediumEnvironment::Instance();
auto* remote_medium = static_cast<WifiDirectMedium*>(
env.GetWifiDirectMedium(wifi_direct_credentials->GetSSID(), {}));
env.GetWifiDirectMedium(wifi_direct_credentials.GetServiceName(), ""));
if (!remote_medium) {
env.UpdateWifiDirectMediumForStartOrConnect(*this, wifi_direct_credentials,
env.UpdateWifiDirectMediumForStartOrConnect(*this, &wifi_direct_credentials,
/*is_go=*/false,
/*enabled=*/false);
return false;
}
env.UpdateWifiDirectMediumForStartOrConnect(*this, wifi_direct_credentials,
env.UpdateWifiDirectMediumForStartOrConnect(*this, &wifi_direct_credentials,
/*is_go=*/false,
/*enabled=*/true);
return true;
@@ -198,7 +208,7 @@ std::unique_ptr<api::WifiDirectSocket> WifiDirectMedium::ConnectToService(
auto* remote_medium =
static_cast<WifiDirectMedium*>(env.GetWifiDirectMedium({}, ip_address));
if (remote_medium == nullptr) {
return nullptr;
return {};
}
WifiDirectServerSocket* server_socket = nullptr;
@@ -214,21 +224,32 @@ std::unique_ptr<api::WifiDirectSocket> WifiDirectMedium::ConnectToService(
LOG(ERROR) << "G3 WifiDirect Failed to find WifiDirect Server "
"socket: socket_name="
<< socket_name;
return nullptr;
return {};
}
}
if (cancellation_flag->Cancelled()) {
LOG(ERROR) << "G3 WifiDirect Connect: Has been cancelled: socket_name="
<< socket_name;
return nullptr;
return {};
}
CancellationFlagListener listener(cancellation_flag, [&server_socket]() {
LOG(INFO) << "G3 WifiDirect Cancel Connect.";
if (server_socket != nullptr) {
server_socket->Close();
}
});
auto socket = std::make_unique<WifiDirectSocket>();
// Finally, Request to connect to this socket.
server_socket->Connect(*socket);
LOG(INFO) << "G3 WifiDirect GC ConnectToService: connected: socket="
if (!server_socket->Connect(*socket)) {
LOG(ERROR) << "G3 WifiDirect Failed to connect to existing WifiDirect "
"Server socket: name="
<< socket_name;
return {};
}
LOG(INFO) << "G3 WifiDirect ConnectToService: connected: socket="
<< socket.get();
return socket;
}
@@ -247,9 +268,10 @@ std::unique_ptr<api::WifiDirectServerSocket> WifiDirectMedium::ListenForService(
dot_decimal_ip.pop_back();
server_socket->SetIPAddress(dot_decimal_ip);
server_socket->SetPort(port == 0 ? env.GetFakePort() : port);
std::string socket_name = WifiDirectServerSocket::GetName(
server_socket->GetIPAddress(), server_socket->GetPort());
int port_to_use = port == 0 ? env.GetFakePort() : port;
server_socket->SetPort(port_to_use);
std::string socket_name =
WifiDirectServerSocket::GetName(dot_decimal_ip, port_to_use);
server_socket->SetCloseNotifier([this, socket_name]() {
absl::MutexLock lock(mutex_);
server_sockets_.erase(socket_name);
@@ -15,17 +15,26 @@
#ifndef PLATFORM_IMPL_G3_WIFI_DIRECT_H_
#define PLATFORM_IMPL_G3_WIFI_DIRECT_H_
#include <cstdint>
#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>
#include "absl/base/thread_annotations.h"
#include "absl/container/flat_hash_map.h"
#include "absl/functional/any_invocable.h"
#include "absl/strings/string_view.h"
#include "absl/synchronization/mutex.h"
#include "internal/platform/cancellation_flag.h"
#include "internal/platform/exception.h"
#include "internal/platform/implementation/g3/multi_thread_executor.h"
#include "internal/platform/implementation/g3/socket_base.h"
#include "internal/platform/implementation/wifi_direct.h"
#include "internal/platform/input_stream.h"
#include "internal/platform/output_stream.h"
#include "internal/platform/wifi_credential.h"
namespace nearby {
namespace g3 {
@@ -112,6 +121,12 @@ class WifiDirectServerSocket : public api::WifiDirectServerSocket {
// Calls close_notifier if it was previously set, and marks socket as closed.
Exception Close() override ABSL_LOCKS_EXCLUDED(mutex_);
// Populates the provided `wifi_direct_credentials` with the IP address
// and port of this server socket.
void PopulateWifiDirectCredentials(
WifiDirectCredentials& wifi_direct_credentials) override
ABSL_LOCKS_EXCLUDED(mutex_);
private:
// Retrieves IP addresses from local machine
std::vector<std::string> GetIpAddresses() const;
@@ -158,7 +173,7 @@ class WifiDirectMedium : public api::WifiDirectMedium {
bool StopWifiDirect() override;
// Discoverer connects to the WiFiDirect GO
bool ConnectWifiDirect(
WifiDirectCredentials* wifi_direct_credentials) override;
const WifiDirectCredentials& wifi_direct_credentials) override;
// Discoverer disconnects from the WiFiDirect GO
bool DisconnectWifiDirect() override;