From 7c53ed5ae77b85007f8b88386f9013f838e2096e Mon Sep 17 00:00:00 2001 From: sigil-03 Date: Tue, 2 Dec 2025 08:17:18 -0700 Subject: [PATCH] add periodic heartbeat broadcast --- src/main.rs | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index 2351819..cdd54c7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,3 +1,6 @@ +use rand_core::OsRng; +use reticulum::destination::DestinationName; +use reticulum::identity::PrivateIdentity; use tokio::fs; use clap::Parser; @@ -8,6 +11,7 @@ use reticulum::iface::tcp_client::TcpClient; use reticulum::iface::tcp_server::TcpServer; use reticulum::iface::udp::UdpInterface; use reticulum::transport::{Transport, TransportConfig}; +use tokio::time::{Duration, interval}; #[derive(Serialize, Deserialize, Debug, Clone)] struct TcpServerConfig { @@ -60,7 +64,15 @@ async fn main() { transport_config.set_retransmit(false); transport_config.set_broadcast(true); // set up the reticulum transport - let transport = Transport::new(transport_config); + let mut transport = Transport::new(transport_config); + + // set up destination + let id = PrivateIdentity::new_from_rand(OsRng); + + let hb_destination = transport + .add_destination(id, DestinationName::new("transport node", "heartbeat")) + .await; + log::info!("dest ID: {}", hb_destination.lock().await.desc.address_hash); // set up interfaces for iface_config in config.interfaces { @@ -87,8 +99,19 @@ async fn main() { } } - // run until exit - let _ = tokio::signal::ctrl_c().await; + let mut heartbeat_interval = interval(Duration::from_secs(5)); - log::info!("exit"); + loop { + tokio::select! { + _ = tokio::signal::ctrl_c() => { + break; + } + _ = heartbeat_interval.tick() => { + log::trace!("send heartbeat"); + transport.send_announce(&hb_destination, None).await; + } + } + } + + log::info!("exit!"); }