Sending messages works
This commit is contained in:
parent
a5cd5c89d3
commit
8130a057ea
@ -6,12 +6,27 @@
|
|||||||
namespace RoboidControl {
|
namespace RoboidControl {
|
||||||
namespace EspIdf {
|
namespace EspIdf {
|
||||||
|
|
||||||
|
void set_socket_blocking(int sock) {
|
||||||
|
int flags = fcntl(sock, F_GETFL, 0);
|
||||||
|
if (flags != -1) {
|
||||||
|
fcntl(
|
||||||
|
sock, F_SETFL,
|
||||||
|
flags & ~O_NONBLOCK); // Clear O_NONBLOCK flag to set to blocking mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_socket_non_blocking(int sock) {
|
||||||
|
int flags = fcntl(sock, F_GETFL, 0);
|
||||||
|
if (flags != -1) {
|
||||||
|
fcntl(sock, F_SETFL,
|
||||||
|
flags | O_NONBLOCK); // Set socket to non-blocking mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void LocalParticipant::Setup(int localPort,
|
void LocalParticipant::Setup(int localPort,
|
||||||
const char* remoteIpAddress,
|
const char* remoteIpAddress,
|
||||||
int remotePort) {
|
int remotePort) {
|
||||||
#if defined(IDF_VER)
|
#if defined(IDF_VER)
|
||||||
this->remoteIpAddress = remoteIpAddress;
|
|
||||||
this->remotePort = remotePort;
|
|
||||||
GetBroadcastAddress();
|
GetBroadcastAddress();
|
||||||
|
|
||||||
wifi_ap_record_t ap_info;
|
wifi_ap_record_t ap_info;
|
||||||
@ -21,11 +36,6 @@ void LocalParticipant::Setup(int localPort,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct sockaddr_in server_addr; //, client_addr;
|
|
||||||
// socklen_t addr_len = sizeof(client_addr);
|
|
||||||
// char recv_buffer[1024];
|
|
||||||
// int sockfd;
|
|
||||||
|
|
||||||
// Create a UDP socket
|
// Create a UDP socket
|
||||||
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
|
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (sockfd < 0) {
|
if (sockfd < 0) {
|
||||||
@ -34,31 +44,35 @@ void LocalParticipant::Setup(int localPort,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set socket to non-blocking mode
|
// // Set socket to non-blocking mode
|
||||||
int flags = fcntl(sockfd, F_GETFL, 0);
|
// int flags = fcntl(sockfd, F_GETFL, 0);
|
||||||
if (flags < 0) {
|
// if (flags < 0) {
|
||||||
std::cout << "fcntl failed";
|
// std::cout << "fcntl failed";
|
||||||
close(sockfd);
|
// close(sockfd);
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
// fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
// set_socket_non_blocking(sockfd);
|
||||||
|
|
||||||
// Set up the server address structure
|
// Set up the server address structure
|
||||||
memset(&server_addr, 0, sizeof(server_addr));
|
struct sockaddr_in local_addr;
|
||||||
server_addr.sin_family = AF_INET;
|
memset(&local_addr, 0, sizeof(local_addr));
|
||||||
server_addr.sin_port = htons(localPort);
|
local_addr.sin_family = AF_INET;
|
||||||
server_addr.sin_addr.s_addr =
|
local_addr.sin_port = htons(this->port);
|
||||||
|
local_addr.sin_addr.s_addr =
|
||||||
htonl(INADDR_ANY); // Listen on all available network interfaces
|
htonl(INADDR_ANY); // Listen on all available network interfaces
|
||||||
|
|
||||||
// Bind the socket to the address and port
|
// Bind the socket to the address and port
|
||||||
if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
|
if (bind(sockfd, (struct sockaddr*)&local_addr, sizeof(local_addr)) < 0) {
|
||||||
std::cout << "Unable to bind UDP socket: errno " << errno << "\n";
|
std::cout << "Unable to bind UDP socket: errno " << errno << "\n";
|
||||||
close(sockfd);
|
close(sockfd);
|
||||||
vTaskDelete(NULL);
|
vTaskDelete(NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::cout << "Wifi sync started to port " << this->remotePort << "\n";
|
std::cout << "Wifi sync started local " << this->port << ", remote "
|
||||||
|
<< this->remoteSite->ipAddress << ":" << this->remoteSite->port
|
||||||
|
<< "\n";
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,15 +86,22 @@ void LocalParticipant::GetBroadcastAddress() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ip_addr_t broadcast_addr;
|
ip_addr_t broadcast_addr = {};
|
||||||
broadcast_addr.u_addr.ip4.addr =
|
broadcast_addr.u_addr.ip4.addr =
|
||||||
(ip_info.ip.addr & ip_info.netmask.addr) | ~ip_info.netmask.addr;
|
(ip_info.ip.addr & ip_info.netmask.addr) | ~ip_info.netmask.addr;
|
||||||
|
|
||||||
std::cout << "Broadcast address: " << broadcastIpAddress << "\n";
|
this->broadcastIpAddress = new char[16]; // IPv4 address can have a max of 15
|
||||||
|
// characters + null terminator
|
||||||
|
snprintf(this->broadcastIpAddress, 16, IPSTR,
|
||||||
|
IP2STR(&broadcast_addr.u_addr.ip4));
|
||||||
|
std::cout << "Broadcast address: " << this->broadcastIpAddress << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalParticipant::Receive() {
|
void LocalParticipant::Receive() {
|
||||||
#if defined(IDF_VER)
|
#if defined(IDF_VER)
|
||||||
|
return; // disable receiving for now
|
||||||
|
set_socket_non_blocking(sockfd);
|
||||||
|
|
||||||
struct sockaddr_in client_addr;
|
struct sockaddr_in client_addr;
|
||||||
socklen_t addr_len = sizeof(client_addr);
|
socklen_t addr_len = sizeof(client_addr);
|
||||||
int packetSize = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0,
|
int packetSize = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0,
|
||||||
@ -107,22 +128,39 @@ void LocalParticipant::Receive() {
|
|||||||
packetSize = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0,
|
packetSize = recvfrom(sockfd, buffer, sizeof(buffer) - 1, 0,
|
||||||
(struct sockaddr*)&client_addr, &addr_len);
|
(struct sockaddr*)&client_addr, &addr_len);
|
||||||
}
|
}
|
||||||
|
set_socket_blocking(sockfd);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LocalParticipant::Send(Participant* remoteParticipant, int bufferSize) {
|
bool LocalParticipant::Send(Participant* remoteParticipant, int bufferSize) {
|
||||||
#if defined(IDF_VER)
|
#if defined(IDF_VER)
|
||||||
// std::cout << "Sending to:\n " << remoteParticipant->ipAddress << ":"
|
std::cout << "Sending to " << remoteParticipant->ipAddress << ":"
|
||||||
// << remoteParticipant->port << "\n";
|
<< remoteParticipant->port << "\n";
|
||||||
|
|
||||||
struct sockaddr_in dest_addr;
|
struct sockaddr_in dest_addr;
|
||||||
|
memset(dest_addr.sin_zero, 0, sizeof(dest_addr.sin_zero));
|
||||||
dest_addr.sin_family = AF_INET;
|
dest_addr.sin_family = AF_INET;
|
||||||
dest_addr.sin_port = htons(remoteParticipant->port);
|
dest_addr.sin_port = htons(remoteParticipant->port);
|
||||||
inet_pton(AF_INET, remoteParticipant->ipAddress, &dest_addr.sin_addr.s_addr);
|
inet_pton(AF_INET, remoteParticipant->ipAddress, &dest_addr.sin_addr.s_addr);
|
||||||
int err = sendto(sockfd, buffer, bufferSize, 0, (struct sockaddr*)&dest_addr,
|
|
||||||
|
int err = 0;
|
||||||
|
// int n = 0;
|
||||||
|
// do {
|
||||||
|
// if (n > 0) {
|
||||||
|
// std::cout << "Retry sending\n";
|
||||||
|
// vTaskDelay(pdMS_TO_TICKS(10)); // Wait 10ms
|
||||||
|
// }
|
||||||
|
// n++;
|
||||||
|
// err = sendto(sockfd, buffer, bufferSize, 0, (struct sockaddr*)&dest_addr,
|
||||||
|
// sizeof(dest_addr));
|
||||||
|
|
||||||
|
// } while (errno == EAGAIN && n < 10);
|
||||||
|
|
||||||
|
err = sendto(sockfd, buffer, bufferSize, 0, (struct sockaddr*)&dest_addr,
|
||||||
sizeof(dest_addr));
|
sizeof(dest_addr));
|
||||||
if (err != 0)
|
if (errno != 0)
|
||||||
std::cout << "Send error\n";
|
std::cout << "Send error " << err << " or " << errno << "\n";
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
return true;
|
return true;
|
||||||
@ -136,7 +174,7 @@ bool LocalParticipant::Publish(IMessage* msg) {
|
|||||||
|
|
||||||
struct sockaddr_in dest_addr;
|
struct sockaddr_in dest_addr;
|
||||||
dest_addr.sin_family = AF_INET;
|
dest_addr.sin_family = AF_INET;
|
||||||
dest_addr.sin_port = htons(this->remotePort);
|
dest_addr.sin_port = htons(this->port);
|
||||||
inet_pton(AF_INET, this->broadcastIpAddress, &dest_addr.sin_addr.s_addr);
|
inet_pton(AF_INET, this->broadcastIpAddress, &dest_addr.sin_addr.s_addr);
|
||||||
int err = sendto(sockfd, buffer, bufferSize, 0, (struct sockaddr*)&dest_addr,
|
int err = sendto(sockfd, buffer, bufferSize, 0, (struct sockaddr*)&dest_addr,
|
||||||
sizeof(dest_addr));
|
sizeof(dest_addr));
|
||||||
|
@ -13,8 +13,8 @@ class LocalParticipant : public RoboidControl::LocalParticipant {
|
|||||||
bool Publish(IMessage* msg);
|
bool Publish(IMessage* msg);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const char* remoteIpAddress = nullptr;
|
// const char* remoteIpAddress = nullptr;
|
||||||
unsigned short remotePort = 0;
|
// unsigned short remotePort = 0;
|
||||||
char* broadcastIpAddress = nullptr;
|
char* broadcastIpAddress = nullptr;
|
||||||
|
|
||||||
int sockfd;
|
int sockfd;
|
||||||
|
@ -56,7 +56,7 @@ void LocalParticipant::begin() {
|
|||||||
if (this->isIsolated)
|
if (this->isIsolated)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
SetupUDP(this->port, this->ipAddress, this->port);
|
SetupUDP(this->port, this->remoteSite->ipAddress, this->remoteSite->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LocalParticipant::SetupUDP(int localPort,
|
void LocalParticipant::SetupUDP(int localPort,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user