55#include < stdint.h>
66#include < string.h>
77
8+ #include " broadcast_server.h"
89#include " custom_cast.h"
910#include " json.hpp"
1011#include " network_interfaces.h"
@@ -20,7 +21,7 @@ Emotibit::Emotibit (struct BrainFlowInputParams params)
2021{
2122 data_socket = NULL ;
2223 control_socket = NULL ;
23- advertise_socket_server = NULL ;
24+ adv_socket = NULL ;
2425 keep_alive = false ;
2526 initialized = false ;
2627 control_port = -1 ;
@@ -70,10 +71,10 @@ int Emotibit::prepare_session ()
7071
7172 if (res != (int )BrainFlowExitCodes::STATUS_OK)
7273 {
73- if (advertise_socket_server != NULL )
74+ if (adv_socket != NULL )
7475 {
75- delete advertise_socket_server ;
76- advertise_socket_server = NULL ;
76+ delete adv_socket ;
77+ adv_socket = NULL ;
7778 }
7879 if (data_socket != NULL )
7980 {
@@ -165,11 +166,11 @@ int Emotibit::release_session ()
165166 delete control_socket;
166167 control_socket = NULL ;
167168 }
168- if (advertise_socket_server )
169+ if (adv_socket )
169170 {
170- advertise_socket_server ->close ();
171- delete advertise_socket_server ;
172- advertise_socket_server = NULL ;
171+ adv_socket ->close ();
172+ delete adv_socket ;
173+ adv_socket = NULL ;
173174 }
174175 control_port = -1 ;
175176 data_port = -1 ;
@@ -596,14 +597,14 @@ int Emotibit::create_adv_connection ()
596597
597598 for (std::string broadcast_address : broadcast_addresses)
598599 {
600+ BroadCastServer *advertise_socket =
601+ new BroadCastServer (broadcast_address.c_str (), WIFI_ADVERTISING_PORT);
599602 res = (int )BrainFlowExitCodes::STATUS_OK;
600603 safe_logger (
601604 spdlog::level::info, " trying broadcast address: {}" , broadcast_address.c_str ());
602605 if (res == (int )BrainFlowExitCodes::STATUS_OK)
603606 {
604- advertise_socket_server =
605- new BroadCastServer (broadcast_address.c_str (), WIFI_ADVERTISING_PORT);
606- int init_res = advertise_socket_server->init ();
607+ int init_res = advertise_socket->init ();
607608 if (init_res != (int )BroadCastServerReturnCodes::STATUS_OK)
608609 {
609610 safe_logger (spdlog::level::err, " failed to init broadcast server socket: {}" , res);
@@ -614,7 +615,7 @@ int Emotibit::create_adv_connection ()
614615 {
615616 std::string package = create_package (HELLO_EMOTIBIT, 0 , " " , 0 );
616617 safe_logger (spdlog::level::info, " sending package: {}" , package.c_str ());
617- int bytes_send = advertise_socket_server ->send (package.c_str (), (int )package.size ());
618+ int bytes_send = advertise_socket ->send (package.c_str (), (int )package.size ());
618619 if (bytes_send != (int )package.size ())
619620 {
620621 safe_logger (
@@ -632,8 +633,8 @@ int Emotibit::create_adv_connection ()
632633 double start_time = get_timestamp ();
633634 for (int i = 0 ; (i < 100 ) && (!found); i++)
634635 {
635- int bytes_recv = advertise_socket_server-> recv (
636- recv_data, max_size, emotibit_ip, max_ip_addr_size);
636+ int bytes_recv =
637+ advertise_socket-> recv ( recv_data, max_size, emotibit_ip, max_ip_addr_size);
637638 if (bytes_recv > 0 )
638639 {
639640 std::vector<std::string> splitted_packages =
@@ -679,19 +680,40 @@ int Emotibit::create_adv_connection ()
679680 res = (int )BrainFlowExitCodes::BOARD_NOT_READY_ERROR;
680681 }
681682 }
682- if (res != ( int )BrainFlowExitCodes::STATUS_OK )
683+ if (advertise_socket != NULL )
683684 {
684- if (advertise_socket_server != NULL )
685- {
686- delete advertise_socket_server;
687- advertise_socket_server = NULL ;
688- }
685+ delete advertise_socket;
686+ advertise_socket = NULL ;
689687 }
690- else
688+ if (res == ( int )BrainFlowExitCodes::STATUS_OK)
691689 {
692690 break ;
693691 }
694692 }
693+ // we dont need broadcast anymore, replace it with normal socket
694+ if (res == (int )BrainFlowExitCodes::STATUS_OK)
695+ {
696+ // ugly but makes it safer
697+ #ifdef _WIN32
698+ Sleep (1000 );
699+ #else
700+ usleep (1000000 );
701+ #endif
702+ adv_socket = new SocketClientUDP (ip_address.c_str (), WIFI_ADVERTISING_PORT);
703+ if (adv_socket->connect () != ((int )SocketClientUDPReturnCodes::STATUS_OK))
704+ {
705+ safe_logger (spdlog::level::err, " Failed to bind adv_socket" );
706+ res = (int )BrainFlowExitCodes::SET_PORT_ERROR;
707+ adv_socket->close ();
708+ delete adv_socket;
709+ adv_socket = NULL ;
710+ }
711+ else
712+ {
713+ safe_logger (spdlog::level::debug, " adv_connection established, ip: {}, port: {}" ,
714+ ip_address, WIFI_ADVERTISING_PORT);
715+ }
716+ }
695717 return res;
696718}
697719
@@ -771,7 +793,7 @@ int Emotibit::send_connect_msg ()
771793 safe_logger (spdlog::level::info, " sending connect package: {}" , package.c_str ());
772794
773795 int res = (int )BrainFlowExitCodes::STATUS_OK;
774- int bytes_send = advertise_socket_server ->send (package.c_str (), (int )package.size ());
796+ int bytes_send = adv_socket ->send (package.c_str (), (int )package.size ());
775797 if (bytes_send != (int )package.size ())
776798 {
777799 safe_logger (spdlog::level::err, " failed to send connect package, res is {}" , bytes_send);
@@ -860,7 +882,7 @@ void Emotibit::ping_thread ()
860882 payload.push_back (std::to_string (data_port));
861883 std::string package = create_package (PING, package_num++, payload);
862884 // safe_logger (spdlog::level::trace, "sending package: {}", package.c_str ());
863- int bytes_send = advertise_socket_server ->send (package.c_str (), (int )package.size ());
885+ int bytes_send = adv_socket ->send (package.c_str (), (int )package.size ());
864886 if (bytes_send != (int )package.size ())
865887 {
866888 safe_logger (spdlog::level::err, " failed to send adv package, res is {}" , bytes_send);
0 commit comments