smart_alarm/net_utils.cpp
2025-09-12 13:08:14 +02:00

68 lines
1.7 KiB
C++

#include "hardware/clocks.h"
#include "lwip/ip_addr.h"
#include "nlohmann/json.hpp"
#include "pico/cyw43_arch.h"
#include "pico/util/datetime.h"
#include <lwip/arch.h>
#include "lwipopts.h"
#include "lwip/dns.h"
#include "lwip/sys.h"
#include "lwip/err.h"
#include "lwip/timeouts.h"
typedef struct {
volatile bool done;
ip_addr_t addr;
bool success;
} dns_blocking_result_t;
static void blocking_dns_callback(const char *name, const ip_addr_t *ipaddr, void *arg) {
dns_blocking_result_t *result = (dns_blocking_result_t *)arg;
if (ipaddr != NULL) {
result->addr = *ipaddr;
result->success = true;
} else {
result->success = false;
}
result->done = true;
}
// Function to synchronously resolve DNS hostname to IP
// Returns true if resolved, false otherwise
bool dns_resolve_sync(const char *hostname, ip_addr_t *resolved_ip, uint32_t timeout_ms) {
dns_blocking_result_t result = {0};
uint32_t start_time = sys_now();
err_t err = dns_gethostbyname(hostname, &result.addr, blocking_dns_callback, &result);
if (err == ERR_OK) {
// Already resolved from cache
*resolved_ip = result.addr;
return true;
} else if (err == ERR_INPROGRESS) {
// Wait for resolution with timeout
while (!result.done) {
if (timeout_ms > 0 && (sys_now() - start_time) > timeout_ms) {
return false; // Timeout
}
sys_check_timeouts();
// Sleep or delay depends on your platform
sys_msleep(10);
}
if (result.success) {
*resolved_ip = result.addr;
return true;
}
}
return false; // Failed
}
extern "C" u32_t lwip_rand(void) {
return get_rand_32();
}