mirror of
https://github.com/kidfromjupiter/nearby.git
synced 2026-09-16 15:36:12 -04:00
Wi-Fi Direct Service Implementation(7)
PiperOrigin-RevId: 834584965
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user