Refactor connection create process

This commit is contained in:
dijunkun
2023-08-17 10:20:47 +08:00
parent c46396a18a
commit a9db3d290b
14 changed files with 426 additions and 373 deletions

View File

@@ -0,0 +1,289 @@
#include "ice_transmission.h"
#include <map>
#include <nlohmann/json.hpp>
#include <thread>
#include "log.h"
using nlohmann::json;
constexpr size_t HASH_STRING_PIECE(const char *string_piece) {
std::size_t result = 0;
while (*string_piece) {
result = (result * 131) + *string_piece++;
}
return result;
}
constexpr size_t operator"" _H(const char *string_piece, size_t) {
return HASH_STRING_PIECE(string_piece);
}
const std::vector<std::string> ice_status = {
"JUICE_STATE_DISCONNECTED", "JUICE_STATE_GATHERING",
"JUICE_STATE_CONNECTING", "JUICE_STATE_CONNECTED",
"JUICE_STATE_COMPLETED", "JUICE_STATE_FAILED"};
IceTransmission::IceTransmission(
WsTransmission *ice_ws_transmission,
std::function<void(const char *, size_t)> on_receive_ice_msg)
: ice_ws_transport_(ice_ws_transmission),
on_receive_ice_msg_cb_(on_receive_ice_msg) {}
IceTransmission::~IceTransmission() {}
int IceTransmission::InitIceTransmission(std::string &ip, int port) {
ice_agent_ = new IceAgent(ip, port);
ice_agent_->CreateIceAgent(
[](juice_agent_t *agent, juice_state_t state, void *user_ptr) {
LOG_INFO("state_change: {}", ice_status[state]);
},
[](juice_agent_t *agent, const char *sdp, void *user_ptr) {
LOG_INFO("candadite: {}", sdp);
// trickle
// static_cast<IceTransmission
// *>(user_ptr)->SendOfferLocalCandidate(sdp);
},
[](juice_agent_t *agent, void *user_ptr) {
LOG_INFO("gather_done");
// non-trickle
if (user_ptr) {
static_cast<IceTransmission *>(user_ptr)->GetLocalSdp();
static_cast<IceTransmission *>(user_ptr)->SendOffer();
}
},
[](juice_agent_t *agent, const char *data, size_t size, void *user_ptr) {
if (user_ptr &&
static_cast<IceTransmission *>(user_ptr)->on_receive_ice_msg_cb_) {
static_cast<IceTransmission *>(user_ptr)->on_receive_ice_msg_cb_(
data, size);
}
},
this);
return 0;
}
int IceTransmission::InitIceTransmission(std::string &ip, int port,
std::string const &id) {
transmission_id_ = id;
ice_agent_ = new IceAgent(ip, port);
ice_agent_->CreateIceAgent(
[](juice_agent_t *agent, juice_state_t state, void *user_ptr) {
LOG_INFO("state_change: {}", ice_status[state]);
},
[](juice_agent_t *agent, const char *sdp, void *user_ptr) {
LOG_INFO("candadite: {}", sdp);
// trickle
// static_cast<PeerConnection
// *>(user_ptr)->SendAnswerLocalCandidate(sdp);
},
[](juice_agent_t *agent, void *user_ptr) {
LOG_INFO("gather_done");
// non-trickle
if (user_ptr) {
static_cast<IceTransmission *>(user_ptr)->CreateAnswer();
static_cast<IceTransmission *>(user_ptr)->SendAnswer();
}
},
[](juice_agent_t *agent, const char *data, size_t size, void *user_ptr) {
if (user_ptr &&
static_cast<IceTransmission *>(user_ptr)->on_receive_ice_msg_cb_) {
static_cast<IceTransmission *>(user_ptr)->on_receive_ice_msg_cb_(
data, size);
}
},
this);
return 0;
}
int IceTransmission::DestroyIceTransmission() {
if (ice_agent_) {
delete ice_agent_;
}
return 0;
}
int IceTransmission::CreateTransmission(const std::string &transmission_id) {
LOG_INFO("Create transport");
offer_peer_ = true;
// if (SignalStatus::Connected != signal_status_) {
// LOG_ERROR("Not connect to signalserver");
// return -1;
// }
json message = {{"type", "create_transmission"},
{"transmission_id", transmission_id}};
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
LOG_INFO("Send msg: {}", message.dump().c_str());
}
// CreateOffer();
return 0;
}
int IceTransmission::JoinTransmission(const std::string &transmission_id) {
LOG_INFO("Join transport");
offer_peer_ = false;
transmission_id_ = transmission_id;
// if (SignalStatus::Connected != signal_status_) {
// LOG_ERROR("Not connect to signalserver");
// return -1;
// }
// QueryRemoteSdp(transmission_id);
CreateOffer();
return 0;
}
int IceTransmission::GatherCandidates() {
ice_agent_->GatherCandidates();
return 0;
}
int IceTransmission::GetLocalSdp() {
local_sdp_ = ice_agent_->GenerateLocalSdp();
return 0;
}
int IceTransmission::SetRemoteSdp(const std::string &remote_sdp) {
ice_agent_->SetRemoteSdp(remote_sdp.c_str());
return 0;
}
int IceTransmission::AddRemoteCandidate(const std::string &remote_candidate) {
ice_agent_->AddRemoteCandidates(remote_candidate.c_str());
return 0;
}
int IceTransmission::CreateOffer() {
LOG_INFO("Create offer");
GatherCandidates();
return 0;
}
int IceTransmission::SendOffer() {
json message = {{"type", "offer"},
{"transmission_id", transmission_id_},
{"sdp", local_sdp_}};
LOG_INFO("Send offer:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransmission::QueryRemoteSdp(std::string transmission_id) {
json message = {{"type", "query_remote_sdp"},
{"transmission_id", transmission_id_}};
LOG_INFO("Query remote sdp");
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransmission::CreateAnswer() {
GetLocalSdp();
return 0;
}
int IceTransmission::SendAnswer() {
json message = {{"type", "answer"},
{"transmission_id", transmission_id_},
{"sdp", local_sdp_}};
LOG_INFO("Send answer:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransmission::SendOfferLocalCandidate(
const std::string &remote_candidate) {
json message = {{"type", "offer_candidate"},
{"transmission_id", transmission_id_},
{"sdp", remote_candidate}};
LOG_INFO("Send candidate:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransmission::SendAnswerLocalCandidate(
const std::string &remote_candidate) {
json message = {{"type", "answer_candidate"},
{"transmission_id", transmission_id_},
{"sdp", remote_candidate}};
LOG_INFO("Send candidate:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransmission::SendData(const char *data, size_t size) {
ice_agent_->Send(data, size);
return 0;
}
void IceTransmission::OnReceiveMessage(const std::string &msg) {
auto j = json::parse(msg);
LOG_INFO("msg: {}", msg.c_str());
std::string type = j["type"];
switch (HASH_STRING_PIECE(type.c_str())) {
case "offer"_H: {
break;
}
case "transmission_id"_H: {
if (j["status"].get<std::string>() == "success") {
transmission_id_ = j["transmission_id"].get<std::string>();
LOG_INFO("Create transmission success with id [{}]", transmission_id_);
// SendOffer();
} else if (j["status"].get<std::string>() == "fail") {
LOG_WARN("Create transmission failed with id [{}], due to [{}]",
transmission_id_, j["reason"].get<std::string>().c_str());
}
break;
}
case "remote_sdp"_H: {
remote_sdp_ = j["sdp"].get<std::string>();
if (remote_sdp_.empty()) {
LOG_INFO("Offer peer not ready, wait 1 second and requery remote sdp");
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
QueryRemoteSdp(transmission_id_);
} else {
LOG_INFO("Receive remote sdp [{}]", remote_sdp_);
SetRemoteSdp(remote_sdp_);
if (!offer_peer_) {
GatherCandidates();
}
}
break;
}
case "candidate"_H: {
std::string candidate = j["sdp"].get<std::string>();
LOG_INFO("Receive candidate [{}]", candidate);
AddRemoteCandidate(candidate);
break;
}
default:
break;
}
}

View File

@@ -1,25 +1,25 @@
#ifndef _ICE_TRANSPORT_H_ #ifndef _ICE_TRANSMISSION_H_
#define _ICE_TRANSPORT_H_ #define _ICE_TRANSMISSION_H_
#include <iostream> #include <iostream>
#include "ice_agent.h" #include "ice_agent.h"
#include "ws_transport.h" #include "ws_transmission.h"
class IceTransport { class IceTransmission {
public: public:
IceTransport(WsTransport *ice_ws_transport, IceTransmission(WsTransmission *ice_ws_transmission,
std::function<void(const char *, size_t)> on_receive_ice_msg); std::function<void(const char *, size_t)> on_receive_ice_msg);
~IceTransport(); ~IceTransmission();
int InitIceTransport(std::string &ip, int port); int InitIceTransmission(std::string &ip, int port);
int InitIceTransport(std::string &ip, int port, std::string const &id); int InitIceTransmission(std::string &ip, int port, std::string const &id);
int DestroyIceTransport(); int DestroyIceTransmission();
int CreateTransport(); int CreateTransmission(const std::string &transmission_id);
int CreateTransport(std::string transport_id); int JoinTransmission(const std::string &transmission_id);
int SendData(const char *data, size_t size); int SendData(const char *data, size_t size);
@@ -32,7 +32,7 @@ class IceTransport {
int GetLocalSdp(); int GetLocalSdp();
int QueryRemoteSdp(std::string transport_id); int QueryRemoteSdp(std::string transmission_id);
int SetRemoteSdp(const std::string &remote_sdp); int SetRemoteSdp(const std::string &remote_sdp);
@@ -52,14 +52,14 @@ class IceTransport {
private: private:
IceAgent *ice_agent_ = nullptr; IceAgent *ice_agent_ = nullptr;
WsTransport *ice_ws_transport_ = nullptr; WsTransmission *ice_ws_transport_ = nullptr;
std::function<void(const char *, size_t)> on_receive_ice_msg_cb_ = nullptr; std::function<void(const char *, size_t)> on_receive_ice_msg_cb_ = nullptr;
std::string local_sdp_; std::string local_sdp_;
std::string remote_sdp_; std::string remote_sdp_;
std::string local_candidates_; std::string local_candidates_;
std::string remote_candidates_; std::string remote_candidates_;
unsigned int connection_id_ = 0; unsigned int connection_id_ = 0;
std::string transport_id_ = ""; std::string transmission_id_ = "";
bool offer_peer_ = true; bool offer_peer_ = true;
}; };

View File

@@ -1,278 +0,0 @@
#include "ice_transport.h"
#include <map>
#include <nlohmann/json.hpp>
#include <thread>
#include "log.h"
using nlohmann::json;
static const std::map<std::string, unsigned int> siganl_types{
{"connection_id", 1},
{"offer", 2},
{"transport_id", 3},
{"remote_sdp", 4},
{"candidate", 5}};
const std::vector<std::string> ice_status = {
"JUICE_STATE_DISCONNECTED", "JUICE_STATE_GATHERING",
"JUICE_STATE_CONNECTING", "JUICE_STATE_CONNECTED",
"JUICE_STATE_COMPLETED", "JUICE_STATE_FAILED"};
IceTransport::IceTransport(
WsTransport *ice_ws_transport,
std::function<void(const char *, size_t)> on_receive_ice_msg)
: ice_ws_transport_(ice_ws_transport),
on_receive_ice_msg_cb_(on_receive_ice_msg) {}
IceTransport::~IceTransport() {}
int IceTransport::InitIceTransport(std::string &ip, int port) {
ice_agent_ = new IceAgent(ip, port);
ice_agent_->CreateIceAgent(
[](juice_agent_t *agent, juice_state_t state, void *user_ptr) {
LOG_INFO("state_change: {}", ice_status[state]);
},
[](juice_agent_t *agent, const char *sdp, void *user_ptr) {
LOG_INFO("candadite: {}", sdp);
// trickle
// static_cast<IceTransport
// *>(user_ptr)->SendOfferLocalCandidate(sdp);
},
[](juice_agent_t *agent, void *user_ptr) {
LOG_INFO("gather_done");
// non-trickle
if (user_ptr) {
static_cast<IceTransport *>(user_ptr)->GetLocalSdp();
static_cast<IceTransport *>(user_ptr)->SendOffer();
}
},
[](juice_agent_t *agent, const char *data, size_t size, void *user_ptr) {
if (user_ptr &&
static_cast<IceTransport *>(user_ptr)->on_receive_ice_msg_cb_) {
static_cast<IceTransport *>(user_ptr)->on_receive_ice_msg_cb_(data,
size);
}
},
this);
return 0;
}
int IceTransport::InitIceTransport(std::string &ip, int port,
std::string const &id) {
transport_id_ = id;
ice_agent_ = new IceAgent(ip, port);
ice_agent_->CreateIceAgent(
[](juice_agent_t *agent, juice_state_t state, void *user_ptr) {
LOG_INFO("state_change: {}", ice_status[state]);
},
[](juice_agent_t *agent, const char *sdp, void *user_ptr) {
LOG_INFO("candadite: {}", sdp);
// trickle
// static_cast<PeerConnection
// *>(user_ptr)->SendAnswerLocalCandidate(sdp);
},
[](juice_agent_t *agent, void *user_ptr) {
LOG_INFO("gather_done");
// non-trickle
if (user_ptr) {
static_cast<IceTransport *>(user_ptr)->CreateAnswer();
static_cast<IceTransport *>(user_ptr)->SendAnswer();
}
},
[](juice_agent_t *agent, const char *data, size_t size, void *user_ptr) {
if (user_ptr &&
static_cast<IceTransport *>(user_ptr)->on_receive_ice_msg_cb_) {
static_cast<IceTransport *>(user_ptr)->on_receive_ice_msg_cb_(data,
size);
}
},
this);
return 0;
}
int IceTransport::DestroyIceTransport() {
if (ice_agent_) {
delete ice_agent_;
}
return 0;
}
int IceTransport::CreateTransport() {
LOG_INFO("Create transport");
offer_peer_ = true;
// if (SignalStatus::Connected != signal_status_) {
// LOG_ERROR("Not connect to signalserver");
// return -1;
// }
json message = {{"type", "create_transport"}};
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
LOG_INFO("Send msg: {}", message.dump().c_str());
}
CreateOffer();
return 0;
}
int IceTransport::CreateTransport(std::string transport_id) {
LOG_INFO("Join transport");
offer_peer_ = false;
transport_id_ = transport_id;
// if (SignalStatus::Connected != signal_status_) {
// LOG_ERROR("Not connect to signalserver");
// return -1;
// }
QueryRemoteSdp(transport_id);
return 0;
}
int IceTransport::GatherCandidates() {
ice_agent_->GatherCandidates();
return 0;
}
int IceTransport::GetLocalSdp() {
local_sdp_ = ice_agent_->GenerateLocalSdp();
return 0;
}
int IceTransport::SetRemoteSdp(const std::string &remote_sdp) {
ice_agent_->SetRemoteSdp(remote_sdp.c_str());
return 0;
}
int IceTransport::AddRemoteCandidate(const std::string &remote_candidate) {
ice_agent_->AddRemoteCandidates(remote_candidate.c_str());
return 0;
}
int IceTransport::CreateOffer() {
LOG_INFO("Create offer");
GatherCandidates();
return 0;
}
int IceTransport::SendOffer() {
json message = {
{"type", "offer"}, {"transport_id", transport_id_}, {"sdp", local_sdp_}};
LOG_INFO("Send offer:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransport::QueryRemoteSdp(std::string transport_id) {
json message = {{"type", "query_remote_sdp"},
{"transport_id", transport_id_}};
LOG_INFO("Query remote sdp");
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransport::CreateAnswer() {
GetLocalSdp();
return 0;
}
int IceTransport::SendAnswer() {
json message = {
{"type", "answer"}, {"transport_id", transport_id_}, {"sdp", local_sdp_}};
LOG_INFO("Send answer:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransport::SendOfferLocalCandidate(const std::string &remote_candidate) {
json message = {{"type", "offer_candidate"},
{"transport_id", transport_id_},
{"sdp", remote_candidate}};
LOG_INFO("Send candidate:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransport::SendAnswerLocalCandidate(
const std::string &remote_candidate) {
json message = {{"type", "answer_candidate"},
{"transport_id", transport_id_},
{"sdp", remote_candidate}};
LOG_INFO("Send candidate:\n{}", message.dump().c_str());
if (ice_ws_transport_) {
ice_ws_transport_->Send(message.dump());
}
return 0;
}
int IceTransport::SendData(const char *data, size_t size) {
ice_agent_->Send(data, size);
return 0;
}
void IceTransport::OnReceiveMessage(const std::string &msg) {
auto j = json::parse(msg);
LOG_INFO("msg: {}", msg.c_str());
std::string type = j["type"];
auto itr = siganl_types.find(type);
if (itr != siganl_types.end()) {
LOG_INFO("msg type :{}", itr->first);
switch (itr->second) {
case 2: {
break;
}
case 3: {
transport_id_ = j["transport_id"].get<std::string>();
LOG_INFO("Receive local peer transport_id [{}]", transport_id_);
// SendOffer();
break;
}
case 4: {
remote_sdp_ = j["sdp"].get<std::string>();
if (remote_sdp_.empty()) {
LOG_INFO(
"Offer peer not ready, wait 1 second and requery remote sdp");
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
QueryRemoteSdp(transport_id_);
} else {
LOG_INFO("Receive remote sdp [{}]", remote_sdp_);
SetRemoteSdp(remote_sdp_);
if (!offer_peer_) {
GatherCandidates();
}
}
break;
}
case 5: {
std::string candidate = j["sdp"].get<std::string>();
LOG_INFO("Receive candidate [{}]", candidate);
AddRemoteCandidate(candidate);
break;
}
default:
break;
}
}
}

View File

@@ -11,7 +11,7 @@ using nlohmann::json;
static const std::map<std::string, unsigned int> siganl_types{ static const std::map<std::string, unsigned int> siganl_types{
{"ws_connection_id", 1}, {"ws_connection_id", 1},
{"offer", 2}, {"offer", 2},
{"transport_id", 3}, {"transmission_id", 3},
{"remote_sdp", 4}, {"remote_sdp", 4},
{"candidate", 5}}; {"candidate", 5}};
@@ -19,7 +19,7 @@ PeerConnection::PeerConnection() {}
PeerConnection::~PeerConnection() {} PeerConnection::~PeerConnection() {}
int PeerConnection::Init(PeerConnectionParams params) { int PeerConnection::Create(PeerConnectionParams params, const std::string &id) {
INIReader reader(params.cfg_path); INIReader reader(params.cfg_path);
std::string cfg_signal_server_ip = reader.Get("signal server", "ip", "-1"); std::string cfg_signal_server_ip = reader.Get("signal server", "ip", "-1");
std::string cfg_signal_server_port = std::string cfg_signal_server_port =
@@ -35,7 +35,7 @@ int PeerConnection::Init(PeerConnectionParams params) {
on_receive_ws_msg_ = [this](const std::string &msg) { on_receive_ws_msg_ = [this](const std::string &msg) {
do { do {
} while (!ice_transport_); } while (!ice_transmission_);
auto j = json::parse(msg); auto j = json::parse(msg);
std::string type = j["type"]; std::string type = j["type"];
auto itr = siganl_types.find(type); auto itr = siganl_types.find(type);
@@ -50,7 +50,7 @@ int PeerConnection::Init(PeerConnectionParams params) {
break; break;
} }
default: { default: {
ice_transport_->OnReceiveMessage(msg); ice_transmission_->OnReceiveMessage(msg);
break; break;
} }
} }
@@ -62,24 +62,24 @@ int PeerConnection::Init(PeerConnectionParams params) {
LOG_INFO("Receive data: [{}]", msg.c_str()); LOG_INFO("Receive data: [{}]", msg.c_str());
}; };
ws_transport_ = new WsTransport(on_receive_ws_msg_); ws_transport_ = new WsTransmission(on_receive_ws_msg_);
uri_ = "ws://" + cfg_signal_server_ip + ":" + cfg_signal_server_port; uri_ = "ws://" + cfg_signal_server_ip + ":" + cfg_signal_server_port;
if (ws_transport_) { if (ws_transport_) {
ws_transport_->Connect(uri_); ws_transport_->Connect(uri_);
} }
ice_transport_ = new IceTransport(ws_transport_, on_receive_ice_msg_); ice_transmission_ = new IceTransmission(ws_transport_, on_receive_ice_msg_);
ice_transport_->InitIceTransport(cfg_stun_server_ip, stun_server_port); ice_transmission_->InitIceTransmission(cfg_stun_server_ip, stun_server_port);
do { do {
LOG_INFO("GetSignalStatus = {}", GetSignalStatus()); LOG_INFO("GetSignalStatus = {}", GetSignalStatus());
} while (SignalStatus::Connected != GetSignalStatus()); } while (SignalStatus::Connected != GetSignalStatus());
ice_transport_->CreateTransport(); ice_transmission_->CreateTransmission(id);
return 0; return 0;
} }
int PeerConnection::Init(PeerConnectionParams params, std::string const &id) { int PeerConnection::Join(PeerConnectionParams params, const std::string &id) {
INIReader reader(params.cfg_path); INIReader reader(params.cfg_path);
std::string cfg_signal_server_ip = reader.Get("signal server", "ip", "-1"); std::string cfg_signal_server_ip = reader.Get("signal server", "ip", "-1");
std::string cfg_signal_server_port = std::string cfg_signal_server_port =
@@ -93,7 +93,7 @@ int PeerConnection::Init(PeerConnectionParams params, std::string const &id) {
on_receive_ws_msg_ = [this](const std::string &msg) { on_receive_ws_msg_ = [this](const std::string &msg) {
do { do {
} while (!ice_transport_); } while (!ice_transmission_);
auto j = json::parse(msg); auto j = json::parse(msg);
std::string type = j["type"]; std::string type = j["type"];
auto itr = siganl_types.find(type); auto itr = siganl_types.find(type);
@@ -108,7 +108,7 @@ int PeerConnection::Init(PeerConnectionParams params, std::string const &id) {
break; break;
} }
default: { default: {
ice_transport_->OnReceiveMessage(msg); ice_transmission_->OnReceiveMessage(msg);
break; break;
} }
} }
@@ -120,22 +120,23 @@ int PeerConnection::Init(PeerConnectionParams params, std::string const &id) {
LOG_INFO("Receive data: [{}]", msg.c_str()); LOG_INFO("Receive data: [{}]", msg.c_str());
}; };
transport_id_ = id; transmission_id_ = id;
ws_transport_ = new WsTransport(on_receive_ws_msg_); ws_transport_ = new WsTransmission(on_receive_ws_msg_);
uri_ = "ws://" + cfg_signal_server_ip + ":" + cfg_signal_server_port; uri_ = "ws://" + cfg_signal_server_ip + ":" + cfg_signal_server_port;
if (ws_transport_) { if (ws_transport_) {
ws_transport_->Connect(uri_); ws_transport_->Connect(uri_);
} }
ice_transport_ = new IceTransport(ws_transport_, on_receive_ice_msg_); ice_transmission_ = new IceTransmission(ws_transport_, on_receive_ice_msg_);
ice_transport_->InitIceTransport(cfg_stun_server_ip, stun_server_port, id); ice_transmission_->InitIceTransmission(cfg_stun_server_ip, stun_server_port,
id);
do { do {
LOG_INFO("GetSignalStatus = {}", GetSignalStatus()); LOG_INFO("GetSignalStatus = {}", GetSignalStatus());
} while (SignalStatus::Connected != GetSignalStatus()); } while (SignalStatus::Connected != GetSignalStatus());
ice_transport_->CreateTransport(transport_id_); ice_transmission_->JoinTransmission(transmission_id_);
return 0; return 0;
} }
@@ -149,6 +150,6 @@ int PeerConnection::Destroy() {
SignalStatus PeerConnection::GetSignalStatus() { return signal_status_; } SignalStatus PeerConnection::GetSignalStatus() { return signal_status_; }
int PeerConnection::SendData(const char *data, size_t size) { int PeerConnection::SendData(const char *data, size_t size) {
ice_transport_->SendData(data, size); ice_transmission_->SendData(data, size);
return 0; return 0;
} }

View File

@@ -3,8 +3,8 @@
#include <iostream> #include <iostream>
#include "ice_transport.h" #include "ice_transmission.h"
#include "ws_transport.h" #include "ws_transmission.h"
enum SignalStatus { Connecting = 0, Connected, Closed }; enum SignalStatus { Connecting = 0, Connected, Closed };
@@ -25,8 +25,8 @@ class PeerConnection {
~PeerConnection(); ~PeerConnection();
public: public:
int Init(PeerConnectionParams params); int Create(PeerConnectionParams params, const std::string &id = "");
int Init(PeerConnectionParams params, std::string const &id); int Join(PeerConnectionParams params, const std::string &id);
int Destroy(); int Destroy();
SignalStatus GetSignalStatus(); SignalStatus GetSignalStatus();
@@ -35,12 +35,12 @@ class PeerConnection {
private: private:
std::string uri_ = ""; std::string uri_ = "";
WsTransport *ws_transport_ = nullptr; WsTransmission *ws_transport_ = nullptr;
IceTransport *ice_transport_ = nullptr; IceTransmission *ice_transmission_ = nullptr;
std::function<void(const std::string &)> on_receive_ws_msg_ = nullptr; std::function<void(const std::string &)> on_receive_ws_msg_ = nullptr;
std::function<void(const char *, size_t)> on_receive_ice_msg_ = nullptr; std::function<void(const char *, size_t)> on_receive_ice_msg_ = nullptr;
unsigned int ws_connection_id_ = 0; unsigned int ws_connection_id_ = 0;
std::string transport_id_ = ""; std::string transmission_id_ = "";
SignalStatus signal_status_ = SignalStatus::Closed; SignalStatus signal_status_ = SignalStatus::Closed;
}; };

View File

@@ -5,7 +5,7 @@
#include "ice_agent.h" #include "ice_agent.h"
#include "log.h" #include "log.h"
#include "ws_transport.h" #include "ws_transmission.h"
#include "x.h" #include "x.h"
using nlohmann::json; using nlohmann::json;
@@ -23,12 +23,17 @@ PeerPtr *CreatePeer(const Params *params) {
} }
int CreateConnection(PeerPtr *peer_ptr) { int CreateConnection(PeerPtr *peer_ptr) {
peer_ptr->peer_connection->Init(peer_ptr->pc_params); peer_ptr->peer_connection->Create(peer_ptr->pc_params);
return 0;
}
int CreateConnection(PeerPtr *peer_ptr, const char *connection_id) {
peer_ptr->peer_connection->Create(peer_ptr->pc_params, connection_id);
return 0; return 0;
} }
int JoinConnection(PeerPtr *peer_ptr, const char *connection_id) { int JoinConnection(PeerPtr *peer_ptr, const char *connection_id) {
peer_ptr->peer_connection->Init(peer_ptr->pc_params, connection_id); peer_ptr->peer_connection->Join(peer_ptr->pc_params, connection_id);
return 0; return 0;
} }

View File

@@ -1,14 +1,14 @@
#include "ws_transport.h" #include "ws_transmission.h"
#include "log.h" #include "log.h"
WsTransport::WsTransport( WsTransmission::WsTransmission(
std::function<void(const std::string &)> on_receive_msg_cb) std::function<void(const std::string &)> on_receive_msg_cb)
: on_receive_msg_(on_receive_msg_cb) {} : on_receive_msg_(on_receive_msg_cb) {}
WsTransport::~WsTransport() {} WsTransmission::~WsTransmission() {}
void WsTransport::OnReceiveMessage(const std::string &msg) { void WsTransmission::OnReceiveMessage(const std::string &msg) {
LOG_INFO("Receive msg: {}", msg); LOG_INFO("Receive msg: {}", msg);
if (on_receive_msg_) { if (on_receive_msg_) {
on_receive_msg_(msg); on_receive_msg_(msg);

18
src/ws/ws_transmission.h Normal file
View File

@@ -0,0 +1,18 @@
#ifndef _WS_TRANSMISSION_H_
#define _WS_TRANSMISSION_H_
#include "ws_core.h"
class WsTransmission : public WsCore {
public:
WsTransmission(std::function<void(const std::string &)> on_receive_msg_cb);
~WsTransmission();
public:
void OnReceiveMessage(const std::string &msg);
private:
std::function<void(const std::string &)> on_receive_msg_ = nullptr;
};
#endif

View File

@@ -1,18 +0,0 @@
#ifndef _WS_TRANSPORT_H_
#define _WS_TRANSPORT_H_
#include "ws_core.h"
class WsTransport : public WsCore {
public:
WsTransport(std::function<void(const std::string &)> on_receive_msg_cb);
~WsTransport();
public:
void OnReceiveMessage(const std::string &msg);
private:
std::function<void(const std::string &)> on_receive_msg_ = nullptr;
};
#endif

View File

@@ -6,8 +6,12 @@ int main(int argc, char** argv) {
Params params; Params params;
params.cfg_path = "../../../../config/config.ini"; params.cfg_path = "../../../../config/config.ini";
std::string transmission_id = "000000";
// std::cout << "Please input which transmisson want to join: ";
// std::cin >> transmission_id;
PeerPtr* peer = CreatePeer(&params); PeerPtr* peer = CreatePeer(&params);
JoinConnection(peer, "000000"); JoinConnection(peer, transmission_id.c_str());
std::string msg = "Offer peer"; std::string msg = "Offer peer";

View File

@@ -14,13 +14,13 @@ constexpr size_t operator"" _H(const char* string_piece, size_t) {
return HASH_STRING_PIECE(string_piece); return HASH_STRING_PIECE(string_piece);
} }
std::string gen_random_6() { const std::string gen_random_6() {
static const char alphanum[] = "0123456789"; static const char alphanum[] = "0123456789";
std::string tmp_s; std::string random_id;
tmp_s.reserve(6); random_id.reserve(6);
for (int i = 0; i < 6; ++i) { for (int i = 0; i < 6; ++i) {
tmp_s += alphanum[rand() % (sizeof(alphanum) - 1)]; random_id += alphanum[rand() % (sizeof(alphanum) - 1)];
} }
return "000000"; return "000000";
@@ -105,56 +105,84 @@ void SignalServer::on_message(websocketpp::connection_hdl hdl,
std::string type = j["type"]; std::string type = j["type"];
switch (HASH_STRING_PIECE(type.c_str())) { switch (HASH_STRING_PIECE(type.c_str())) {
case "create_transport"_H: { case "create_transmission"_H: {
transport_id_ = gen_random_6(); transmission_id_ = j["transmission_id"];
LOG_INFO("Generate transport_id [{}]", transport_id_); LOG_INFO("Receive create transmission request with id [{}]",
json message = {{"type", "transport_id"}, transmission_id_);
{"transport_id", transport_id_}}; if (transmission_list_.find(transmission_id_) ==
transmission_list_.end()) {
if (transmission_id_.empty()) {
transmission_id_ = gen_random_6();
while (transmission_list_.find(transmission_id_) !=
transmission_list_.end()) {
transmission_id_ = gen_random_6();
}
LOG_INFO(
"Transmission id is empty, generate a new one for this request "
"[{}]",
transmission_id_);
}
transmission_list_.insert(transmission_id_);
LOG_INFO("Create transmission id [{}]", transmission_id_);
json message = {{"type", "transmission_id"},
{"transmission_id", transmission_id_},
{"status", "success"}};
send_msg(hdl, message); send_msg(hdl, message);
} else {
LOG_INFO("Transmission id [{}] already exist", transmission_id_);
json message = {{"type", "transmission_id"},
{"transmission_id", transmission_id_},
{"status", "fail"},
{"reason", "Transmission id exist"}};
send_msg(hdl, message);
}
break; break;
} }
case "offer"_H: { case "offer"_H: {
std::string transport_id = j["transport_id"]; std::string transmission_id = j["transmission_id"];
std::string sdp = j["sdp"]; std::string sdp = j["sdp"];
LOG_INFO("Save transport_id[{}] with offer sdp[{}]", transport_id, sdp); LOG_INFO("Save transmission_id[{}] with offer sdp[{}]", transmission_id,
sdp);
// ws_handle_manager_.BindHandleToConnection(hdl, ); // ws_handle_manager_.BindHandleToConnection(hdl, );
offer_sdp_map_[transport_id] = sdp; offer_sdp_map_[transmission_id] = sdp;
offer_hdl_map_[transport_id] = hdl; offer_hdl_map_[transmission_id] = hdl;
break; break;
} }
case "query_remote_sdp"_H: { case "query_remote_sdp"_H: {
std::string transport_id = j["transport_id"]; std::string transmission_id = j["transmission_id"];
std::string sdp = offer_sdp_map_[transport_id]; std::string sdp = offer_sdp_map_[transmission_id];
LOG_INFO("send offer sdp [{}]", sdp.c_str()); LOG_INFO("send offer sdp [{}]", sdp.c_str());
json message = {{"type", "remote_sdp"}, {"sdp", sdp}}; json message = {{"type", "remote_sdp"}, {"sdp", sdp}};
send_msg(hdl, message); send_msg(hdl, message);
break; break;
} }
case "answer"_H: { case "answer"_H: {
std::string transport_id = j["transport_id"]; std::string transmission_id = j["transmission_id"];
std::string sdp = j["sdp"]; std::string sdp = j["sdp"];
LOG_INFO("Save transport_id[{}] with answer sdp[{}]", transport_id, sdp); LOG_INFO("Save transmission_id[{}] with answer sdp[{}]", transmission_id,
answer_sdp_map_[transport_id] = sdp; sdp);
answer_hdl_map_[transport_id] = hdl; answer_sdp_map_[transmission_id] = sdp;
answer_hdl_map_[transmission_id] = hdl;
LOG_INFO("send answer sdp [{}]", sdp.c_str()); LOG_INFO("send answer sdp [{}]", sdp.c_str());
json message = {{"type", "remote_sdp"}, {"sdp", sdp}}; json message = {{"type", "remote_sdp"}, {"sdp", sdp}};
send_msg(offer_hdl_map_[transport_id], message); send_msg(offer_hdl_map_[transmission_id], message);
break; break;
} }
case "offer_candidate"_H: { case "offer_candidate"_H: {
std::string transport_id = j["transport_id"]; std::string transmission_id = j["transmission_id"];
std::string candidate = j["sdp"]; std::string candidate = j["sdp"];
LOG_INFO("send candidate [{}]", candidate.c_str()); LOG_INFO("send candidate [{}]", candidate.c_str());
json message = {{"type", "candidate"}, {"sdp", candidate}}; json message = {{"type", "candidate"}, {"sdp", candidate}};
send_msg(answer_hdl_map_[transport_id], message); send_msg(answer_hdl_map_[transmission_id], message);
break; break;
} }
case "answer_candidate"_H: { case "answer_candidate"_H: {
std::string transport_id = j["transport_id"]; std::string transmission_id = j["transmission_id"];
std::string candidate = j["sdp"]; std::string candidate = j["sdp"];
LOG_INFO("send candidate [{}]", candidate.c_str()); LOG_INFO("send candidate [{}]", candidate.c_str());
json message = {{"type", "candidate"}, {"sdp", candidate}}; json message = {{"type", "candidate"}, {"sdp", candidate}};
send_msg(offer_hdl_map_[transport_id], message); send_msg(offer_hdl_map_[transmission_id], message);
break; break;
} }
default: default:

View File

@@ -4,6 +4,7 @@
#include <functional> #include <functional>
#include <map> #include <map>
#include <nlohmann/json.hpp> #include <nlohmann/json.hpp>
#include <set>
#include <string> #include <string>
#include <websocketpp/config/asio_no_tls.hpp> #include <websocketpp/config/asio_no_tls.hpp>
#include <websocketpp/server.hpp> #include <websocketpp/server.hpp>
@@ -43,7 +44,10 @@ class SignalServer {
ws_connections_; ws_connections_;
std::map<room_id, connection_id> rooms_; std::map<room_id, connection_id> rooms_;
unsigned int ws_connection_id_ = 0; unsigned int ws_connection_id_ = 0;
std::string transport_id_ = "000000"; std::string transmission_id_ = "000000";
std::set<std::string> transmission_list_;
std::map<std::string, std::string> offer_sdp_map_; std::map<std::string, std::string> offer_sdp_map_;
std::map<std::string, std::string> answer_sdp_map_; std::map<std::string, std::string> answer_sdp_map_;
std::map<std::string, websocketpp::connection_hdl> offer_hdl_map_; std::map<std::string, websocketpp::connection_hdl> offer_hdl_map_;

View File

@@ -78,14 +78,14 @@ target("signal_server")
add_packages("asio", "nlohmann_json", "spdlog") add_packages("asio", "nlohmann_json", "spdlog")
add_includedirs("thirdparty/websocketpp/include") add_includedirs("thirdparty/websocketpp/include")
target("offer") target("host")
set_kind("binary") set_kind("binary")
add_deps("projectx") add_deps("projectx")
add_files("tests/peerconnection/offer.cpp") add_files("tests/peerconnection/host.cpp")
add_includedirs("src/interface") add_includedirs("src/interface")
target("answer") target("guest")
set_kind("binary") set_kind("binary")
add_deps("projectx") add_deps("projectx")
add_files("tests/peerconnection/answer.cpp") add_files("tests/peerconnection/guest.cpp")
add_includedirs("src/interface") add_includedirs("src/interface")